{"id":249,"date":"2026-01-20T15:05:43","date_gmt":"2026-01-20T06:05:43","guid":{"rendered":"https:\/\/socialakiba.com\/?p=249"},"modified":"2026-01-20T15:07:20","modified_gmt":"2026-01-20T06:07:20","slug":"gpt-oss-20b-%e3%82%92-rest-api-%e7%9a%84%e3%81%ab%e4%bb%96%e3%81%aepc%e3%81%8b%e3%82%89%e4%bd%bf%e3%81%86%e3%81%ab%e3%81%af%e3%81%a9%e3%81%86%e3%81%97%e3%81%be%e3%81%99%e3%81%8b%e3%80%82","status":"publish","type":"post","link":"https:\/\/socialakiba.com\/?p=249","title":{"rendered":"gpt-oss-20b \u3092 rest api \u7684\u306b\u4ed6\u306epc\u304b\u3089\u4f7f\u3046\u306b\u306f\u3069\u3046\u3057\u307e\u3059\u304b\u3002"},"content":{"rendered":"\n<p>gpt-oss-20b \u306b\u8cea\u554f<\/p>\n\n\n\n<pre class=\"wp-block-verse\">gpt-oss-20b \u3092 rest api \u7684\u306b\u4ed6\u306epc\u304b\u3089\u4f7f\u3046\u306b\u306f\u3069\u3046\u3057\u307e\u3059\u304b\u3002<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">GPT\u2011OSS\u201120B \u3092\u300cREST API \u98a8\u306b\u300d\u4ed6\u306e PC \u304b\u3089\u4f7f\u3046\u624b\u9806<\/h2>\n\n\n\n<p>\u4ee5\u4e0b\u306f\u3001\u30ed\u30fc\u30ab\u30eb\u74b0\u5883\uff08GPU \u304c\u3042\u308b\u30b5\u30fc\u30d0\u30fc\uff09\u3067 <strong>GPT\u2011OSS\u201120B<\/strong>\uff08\u307e\u305f\u306f\u540c\u7b49\u306e\u5927\u898f\u6a21\u8a00\u8a9e\u30e2\u30c7\u30eb\uff09\u3092\u8d77\u52d5\u3057\u3001\u5916\u90e8\u304b\u3089 HTTP \u30ea\u30af\u30a8\u30b9\u30c8\u3067\u547c\u3073\u51fa\u305b\u308b\u3088\u3046\u306b\u3059\u308b\u4e00\u4f8b\u3067\u3059\u3002<br>\u5b9f\u969b\u306b\u306f\u74b0\u5883\u3084\u8981\u4ef6\u306b\u5fdc\u3058\u3066\u8abf\u6574\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u76ee\u7684<\/th><th>\u63a8\u5968\u30c4\u30fc\u30eb \/ \u30e9\u30a4\u30d6\u30e9\u30ea<\/th><\/tr><\/thead><tbody><tr><td>\u30e2\u30c7\u30eb\u30ed\u30fc\u30c9 &amp; \u63a8\u8ad6<\/td><td><code>transformers<\/code> + <code>torch<\/code> (GPU \u5fc5\u9808)<\/td><\/tr><tr><td>REST API \u30b5\u30fc\u30d0\u30fc<\/td><td><strong>FastAPI<\/strong>\uff08\u975e\u540c\u671f\u3001Swagger UI \u4ed8\u304d\uff09<br>\u307e\u305f\u306f <strong>Flask<\/strong>\uff08\u7c21\u6613\uff09<\/td><\/tr><tr><td>\u30b3\u30f3\u30c6\u30ca\u5316<\/td><td>Docker (\u4efb\u610f)<\/td><\/tr><tr><td>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u516c\u958b<\/td><td>\u30dd\u30fc\u30c8\u30d5\u30a9\u30ef\u30fc\u30c9 \/ VPN \/ Cloud Load Balancer<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">1. \u524d\u63d0\u6761\u4ef6<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u9805\u76ee<\/th><th>\u5185\u5bb9<\/th><\/tr><\/thead><tbody><tr><td>OS<\/td><td>Linux (Ubuntu20.04 \u4ee5\u5916\u3067\u3082 OK)<\/td><\/tr><tr><td>GPU<\/td><td>NVIDIA + CUDA 11.x+\uff08\u4f8b: RTX 3090, A100\uff09<\/td><\/tr><tr><td>Python<\/td><td>3.9\u301c3.12<\/td><\/tr><tr><td>\u30c7\u30a3\u30b9\u30af\u5bb9\u91cf<\/td><td>\u30e2\u30c7\u30eb\u30b5\u30a4\u30ba \u2248 30\u201335\u202fGB + \u30e9\u30f3\u30bf\u30a4\u30e0<\/td><\/tr><tr><td>\u30cd\u30c3\u30c8\u30ef\u30fc\u30af<\/td><td>\u5916\u90e8\u304b\u3089\u306e\u30a2\u30af\u30bb\u30b9\u8a31\u53ef (\u30dd\u30fc\u30c880\/443 \u7b49)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">2. \u5fc5\u8981\u306a\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># \u4eee\u60f3\u74b0\u5883\u4f5c\u6210\uff08\u4efb\u610f\uff09\npython -m venv gpt-oss-env\nsource gpt-oss-env\/bin\/activate\n\n# PyTorch (CUDA)\npip install torch torchvision torchaudio --index-url https:\/\/download.pytorch.org\/whl\/cu118\n\n# Transformers + accelerate\npip install transformers accelerate==0.21.2  # \u6700\u65b0\u306e\u5b89\u5b9a\u7248\u3092\u4f7f\u7528\n\n# FastAPI + Uvicorn\npip install fastapi uvicorn&#91;standard]  # \u6a19\u6e96\u7684\u306a ASGI \u30b5\u30fc\u30d0\u30fc<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>Tip<\/strong><br><code>accelerate<\/code> \u306f\u30e2\u30c7\u30eb\u3092\u8907\u6570 GPU \u306b\u5206\u6563\u3059\u308b\u969b\u306b\u4fbf\u5229\u3067\u3059\u3002\u5358\u4e00 GPU \u306a\u3089\u4e0d\u8981\u3067\u3059\u304c\u3001\u5c06\u6765\u62e1\u5f35\u3057\u305f\u3044\u5834\u5408\u306f\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066\u304a\u304f\u3068\u697d\u3067\u3059\u3002<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">3. \u30e2\u30c7\u30eb\u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9<\/h2>\n\n\n\n<p>GPT\u2011OSS\u201120B \u306f Hugging Face Hub \u304b\u3089\u76f4\u63a5\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002<br>\uff08\u30e2\u30c7\u30eb\u540d\u306f\u4f8b\u3068\u3057\u3066 <code>EleutherAI\/gpt-oss-20b<\/code> \u3092\u4f7f\u7528\uff09<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from transformers import AutoModelForCausalLM, AutoTokenizer\n\nmodel_name = \"EleutherAI\/gpt-oss-20b\"\n\n# \u30c8\u30fc\u30af\u30ca\u30a4\u30b6\u30fc\u3068\u30e2\u30c7\u30eb\u3092\u30ed\u30fc\u30c9\ntokenizer = AutoTokenizer.from_pretrained(model_name)\nmodel = AutoModelForCausalLM.from_pretrained(\n    model_name,\n    device_map=\"auto\",          # GPU \u306b\u81ea\u52d5\u914d\u7f6e\n    torch_dtype=torch.float16,  # FP16 \u3067\u30e1\u30e2\u30ea\u524a\u6e1b\n)\n\n# GPU \u304c\u8907\u6570\u3042\u308b\u5834\u5408\u306f accelerator \u3092\u4f7f\u3046\u3068\u3055\u3089\u306b\u9ad8\u901f\u5316\u53ef\u80fd<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>\u6ce8\u610f<\/strong><br><code>device_map=\"auto\"<\/code> \u306f Hugging Face \u306e <code>accelerate<\/code> \u306b\u3088\u3063\u3066\u81ea\u52d5\u7684\u306bGPU\u306b\u5272\u308a\u5f53\u3066\u307e\u3059\u3002<br>\u30e1\u30e2\u30ea\u4e0d\u8db3\u304c\u8d77\u304d\u305f\u3089 <code>torch_dtype=torch.float16<\/code> \u3084 <code>load_in_8bit=True<\/code> \u3092\u8a66\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4. FastAPI \u30a2\u30d7\u30ea\u3092\u4f5c\u6210<\/h2>\n\n\n\n<p>\u4ee5\u4e0b\u306e\u30b9\u30af\u30ea\u30d7\u30c8 (<code>app.py<\/code>) \u3092\u30b5\u30fc\u30d0\u30fc\u5074 PC \u306b\u4fdd\u5b58\u3057\u307e\u3059\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># app.py\nimport os\nfrom fastapi import FastAPI, HTTPException\nfrom pydantic import BaseModel\nimport torch\nfrom transformers import AutoTokenizer, AutoModelForCausalLM\n\n# ---------- \u30e2\u30c7\u30eb\u30ed\u30fc\u30c9 ----------\nMODEL_NAME = \"EleutherAI\/gpt-oss-20b\"\n\ntokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)\nmodel = AutoModelForCausalLM.from_pretrained(\n    MODEL_NAME,\n    device_map=\"auto\",\n    torch_dtype=torch.float16\n)\n\ndevice = next(model.parameters()).device\n\n# ---------- API \u5b9a\u7fa9 ----------\napp = FastAPI(title=\"GPT\u2011OSS\u201120B REST API\")\n\nclass PromptRequest(BaseModel):\n    prompt: str\n    max_new_tokens: int | None = 128\n    temperature: float | None = 0.7\n    top_p: float | None = 1.0\n\n@app.post(\"\/generate\")\nasync def generate(req: PromptRequest):\n    try:\n        inputs = tokenizer(req.prompt, return_tensors=\"pt\").to(device)\n        with torch.no_grad():\n            output_ids = model.generate(\n                **inputs,\n                max_new_tokens=req.max_new_tokens or 128,\n                temperature=req.temperature or 0.7,\n                top_p=req.top_p or 1.0,\n                do_sample=True,\n                pad_token_id=tokenizer.eos_token_id\n            )\n        generated_text = tokenizer.decode(output_ids&#91;0], skip_special_tokens=True)\n        return {\"generated_text\": generated_text}\n    except Exception as e:\n        raise HTTPException(status_code=500, detail=str(e))\n\n# ---------- Swagger UI \u306a\u3069\u306f\u81ea\u52d5\u3067\u63d0\u4f9b ----------<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u5b9f\u884c<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>uvicorn app:app --host 0.0.0.0 --port 8000 --workers 4<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>\u30dd\u30a4\u30f3\u30c8<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>--workers<\/code> \u306f\u8907\u6570\u30d7\u30ed\u30bb\u30b9\u3092\u8d77\u52d5\u3057\u3001\u4e26\u5217\u30ea\u30af\u30a8\u30b9\u30c8\u306b\u5bfe\u5fdc\u3002<\/li>\n\n\n\n<li>\u3053\u3053\u3067\u306f\u30dd\u30fc\u30c8 8000 \u3092\u958b\u653e\u3057\u3066\u3044\u307e\u3059\u304c\u3001\u5fc5\u8981\u306a\u3089 80\/443 \u306b\u5909\u66f4\u3057\u3066 HTTPS \u5316\u3057\u3066\u304f\u3060\u3055\u3044\u3002<\/li>\n<\/ul>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5. \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u8a2d\u5b9a<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code>   sudo ufw allow 8000\/tcp   # \u4f8b: UFW<\/code><\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>\u30dd\u30fc\u30c8\u30d5\u30a9\u30ef\u30fc\u30c9\uff08\u30ed\u30fc\u30ab\u30eb\u30cd\u30c3\u30c8\uff09<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u30eb\u30fc\u30bf\u30fc\u5074\u3067 <code>8000<\/code> \u3092\u30b5\u30fc\u30d0\u30fc\u306e IP \u306b\u8ee2\u9001\u3002<\/li>\n\n\n\n<li>VPN\uff08OpenVPN, WireGuard \u7b49\uff09\u3092\u5229\u7528\u3057\u3066\u5b89\u5168\u306b\u30a2\u30af\u30bb\u30b9\u3002<\/li>\n<\/ul>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li><strong>HTTPS \u5316 (\u4efb\u610f)<\/strong><\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Let\u2019s Encrypt + Nginx \u306e\u30ea\u30d0\u30fc\u30b9\u30d7\u30ed\u30ad\u30b7 <code>server { listen 443 ssl; server_name gpt.example.com; ssl_certificate \/etc\/letsencrypt\/live\/gpt.example.com\/fullchain.pem; ssl_certificate_key \/etc\/letsencrypt\/live\/gpt.example.com\/privkey.pem; location \/ { proxy_pass http:\/\/127.0.0.1:8000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }<\/code><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6. \u4ed6\u306e PC \u304b\u3089\u547c\u3073\u51fa\u3059<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">cURL<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>curl -X POST http:\/\/&lt;\u30b5\u30fc\u30d0\u30fcIP&gt;:8000\/generate \\\n     -H \"Content-Type: application\/json\" \\\n     -d '{\"prompt\":\"\u3053\u3093\u306b\u3061\u306f\u3001GPT-OSS\u201120B\u3002\",\"max_new_tokens\":64}'<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Python (requests)<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>import requests\n\nurl = \"http:\/\/&lt;\u30b5\u30fc\u30d0\u30fcIP&gt;:8000\/generate\"\npayload = {\n    \"prompt\": \"\u65e5\u672c\u8a9e\u3067\u5c0f\u8aac\u306e\u5192\u982d\u3092\u66f8\u3044\u3066\u304f\u3060\u3055\u3044\u3002\",\n    \"max_new_tokens\": 100,\n}\nresp = requests.post(url, json=payload)\nprint(resp.json()&#91;\"generated_text\"])<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u30d6\u30e9\u30a6\u30b6<\/h3>\n\n\n\n<p><code>http:\/\/&lt;\u30b5\u30fc\u30d0\u30fcIP&gt;:8000\/docs<\/code> \u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068 Swagger UI \u304c\u8868\u793a\u3055\u308c\u3001\u624b\u8efd\u306b\u8a66\u305b\u307e\u3059\u3002<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7. Docker \u5316\uff08\u4efb\u610f\uff09<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code># Dockerfile\nFROM python:3.10-slim-bullseye\n\nRUN apt-get update &amp;&amp; \\\n    apt-get install -y --no-install-recommends \\\n        git build-essential libssl-dev curl ca-certificates \\\n    &amp;&amp; rm -rf \/var\/lib\/apt\/lists\/*\n\nWORKDIR \/app\nCOPY requirements.txt .\nRUN pip install --upgrade pip &amp;&amp; pip install -r requirements.txt\n\nCOPY app.py .\n\nCMD &#91;\"uvicorn\", \"app:app\", \"--host\", \"0.0.0.0\", \"--port\", \"8000\"]<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code># \u30d3\u30eb\u30c9 &amp; \u5b9f\u884c\ndocker build -t gpt-oss-api .\ndocker run -d --gpus all -p 8000:8000 gpt-oss-api<\/code><\/pre>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><strong>\u6ce8\u610f<\/strong><br>GPU \u3092 Docker \u306b\u6e21\u3059\u306b\u306f <code>--gpus all<\/code> \u304c\u5fc5\u8981\u3002<br>NVIDIA \u30c9\u30e9\u30a4\u30d0\u3068 <code>nvidia-container-toolkit<\/code> \u304c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3002<\/p>\n<\/blockquote>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">8. \u30b9\u30b1\u30fc\u30ea\u30f3\u30b0\u30fb\u904b\u7528<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u8981\u4ef6<\/th><th>\u63a8\u5968\u8a2d\u5b9a<\/th><\/tr><\/thead><tbody><tr><td>\u540c\u6642\u30ea\u30af\u30a8\u30b9\u30c8\u6570\u304c\u591a\u3044\u5834\u5408<\/td><td><strong>uvicorn<\/strong> \u306e <code>--workers<\/code> \u3092\u5897\u3084\u3059\u3002<br>\u307e\u305f\u306f <strong>Gunicorn + UvicornWorker<\/strong> \u3067\u8907\u6570\u30d7\u30ed\u30bb\u30b9\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3002<\/td><\/tr><tr><td>\u9ad8\u53ef\u7528\u6027<\/td><td>Kubernetes\uff08k8s\uff09\u4e0a\u306b\u30c7\u30d7\u30ed\u30a4\u3057\u3001ReplicaSet\/Deployment \u3067\u81ea\u52d5\u30ea\u30b9\u30bf\u30fc\u30c8\u3002<\/td><\/tr><tr><td>\u30e2\u30c7\u30eb\u30ad\u30e3\u30c3\u30b7\u30e5<\/td><td><code>torch.hub<\/code> \u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u30c7\u30a3\u30ec\u30af\u30c8\u30ea (<code>~\/.cache\/huggingface\/hub<\/code>) \u3092\u6c38\u7d9a\u5316\u3059\u308b\u3002<\/td><\/tr><tr><td>\u30ed\u30b0 &amp; \u30e1\u30c8\u30ea\u30af\u30b9<\/td><td>Prometheus + Grafana\uff08\u63a8\u8ad6\u6642\u9593\u30fbCPU\/GPU \u4f7f\u7528\u7387\uff09\u3092\u7d44\u307f\u5408\u308f\u305b\u308b\u3002<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">9. \u3088\u304f\u3042\u308b\u8cea\u554f<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u8cea\u554f<\/th><th>\u56de\u7b54<\/th><\/tr><\/thead><tbody><tr><td><strong>GPU \u304c\u8db3\u308a\u306a\u3044<\/strong><\/td><td>FP16\/8bit \u306b\u5207\u66ff\u3001\u307e\u305f\u306f <code>torch.compile<\/code>\uff08PyTorch 2.x\uff09\u3067\u9ad8\u901f\u5316\u3002<br>\u8907\u6570 GPU \u3092\u6301\u3064\u30b5\u30fc\u30d0\u30fc\u3092\u7528\u610f\u3059\u308b\u304b\u3001\u30af\u30e9\u30a6\u30c9 (A100, V100) \u3092\u5229\u7528\u3002<\/td><\/tr><tr><td><strong>\u30ea\u30af\u30a8\u30b9\u30c8\u304c\u9045\u3044<\/strong><\/td><td>\u30d0\u30c3\u30c1\u51e6\u7406\u3084 <code>torch.backends.cudnn.benchmark=True<\/code> \u306e\u8a2d\u5b9a\u3067\u6700\u9069\u5316\u3002<br>\u63a8\u8ad6\u6642\u306b <code>do_sample=False<\/code> \u3059\u308b\u3068\u9ad8\u901f\u306b\u306a\u308b\u5834\u5408\u3082\u3042\u308b\u3002<\/td><\/tr><tr><td><strong>\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u5f37\u5316\u3057\u305f\u3044<\/strong><\/td><td>API \u30ad\u30fc\u8a8d\u8a3c\uff08FastAPI \u306e Depends + HTTP Basic\/OAuth2\uff09\u3084 VPN \u3092\u4f75\u7528\u3002<\/td><\/tr><tr><td><strong>\u30e2\u30c7\u30eb\u30b5\u30a4\u30ba\u304c\u5927\u304d\u304f\u3066\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u306b\u6642\u9593\u304c\u304b\u304b\u308b<\/strong><\/td><td><code>git clone --depth 1<\/code> \u3067\u30af\u30ed\u30fc\u30f3\u3001\u307e\u305f\u306f Hugging Face Hub \u306e\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u5171\u6709\uff08NFS \/ EFS\uff09\u3002<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">10. \u307e\u3068\u3081<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>GPU\u2011\u5bfe\u5fdc\u306e Python \u74b0\u5883\u3092\u7528\u610f\u3002<\/li>\n\n\n\n<li><code>transformers<\/code> + <code>torch<\/code> \u3067 GPT\u2011OSS\u201120B \u3092\u30ed\u30fc\u30c9\u3002<\/li>\n\n\n\n<li>FastAPI\uff08\u307e\u305f\u306f Flask\uff09\u3067 <code>\/generate<\/code> \u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u3092\u5b9f\u88c5\u3002<\/li>\n\n\n\n<li>Uvicorn (or Gunicorn) \u3067\u30b5\u30fc\u30d0\u30fc\u8d77\u52d5\u3057\u3001\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u30fb\u30dd\u30fc\u30c8\u30d5\u30a9\u30ef\u30fc\u30c9\u3067\u5916\u90e8\u516c\u958b\u3002<\/li>\n\n\n\n<li><code>curl<\/code> \/ <code>requests<\/code> \/ Swagger UI \u3067\u4ed6 PC \u304b\u3089\u547c\u3073\u51fa\u3059\u3002<\/li>\n<\/ol>\n\n\n\n<p>\u3053\u306e\u69cb\u6210\u306a\u3089\u3001\u540c\u4e00 LAN \u5185\u306f\u3082\u3061\u308d\u3093\u3001\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u7d4c\u7531\u3067\u3082\u5b89\u5168\u306b REST API \u3092\u5229\u7528\u3067\u304d\u307e\u3059\u3002<\/p>\n\n\n\n<p><strong>\u5b9f\u969b\u306b\u5c0e\u5165\u3059\u308b\u524d\u306b\u3001\u5fc5\u305a GPU \u30e1\u30e2\u30ea\u4f7f\u7528\u91cf\u30fb\u63a8\u8ad6\u6642\u9593\u3092\u6e2c\u5b9a\u3057\u3001\u5fc5\u8981\u306b\u5fdc\u3058\u3066 FP16\/8bit \u306a\u3069\u306e\u6700\u9069\u5316\u3092\u884c\u3063\u3066\u304f\u3060\u3055\u3044\u3002<\/strong> Happy coding!<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>gpt-oss-20b \u306b\u8cea\u554f gpt-oss-20b \u3092 rest api \u7684\u306b\u4ed6\u306epc\u304b\u3089\u4f7f\u3046\u306b\u306f\u3069\u3046\u3057\u307e\u3059\u304b\u3002 GPT\u2011OSS\u201120B \u3092\u300cREST API \u98a8\u306b\u300d\u4ed6\u306e PC \u304b\u3089\u4f7f\u3046\u624b\u9806 \u4ee5\u4e0b\u306f\u3001\u30ed\u30fc\u30ab\u30eb\u74b0\u5883\uff08G &hellip; <a href=\"https:\/\/socialakiba.com\/?p=249\" class=\"more-link\"><span class=\"screen-reader-text\">&#8220;gpt-oss-20b \u3092 rest api \u7684\u306b\u4ed6\u306epc\u304b\u3089\u4f7f\u3046\u306b\u306f\u3069\u3046\u3057\u307e\u3059\u304b\u3002&#8221; \u306e<\/span>\u7d9a\u304d\u3092\u8aad\u3080<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-249","post","type-post","status-publish","format-standard","hentry","category-ai"],"_links":{"self":[{"href":"https:\/\/socialakiba.com\/index.php?rest_route=\/wp\/v2\/posts\/249","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/socialakiba.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/socialakiba.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/socialakiba.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/socialakiba.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=249"}],"version-history":[{"count":2,"href":"https:\/\/socialakiba.com\/index.php?rest_route=\/wp\/v2\/posts\/249\/revisions"}],"predecessor-version":[{"id":251,"href":"https:\/\/socialakiba.com\/index.php?rest_route=\/wp\/v2\/posts\/249\/revisions\/251"}],"wp:attachment":[{"href":"https:\/\/socialakiba.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=249"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/socialakiba.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=249"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/socialakiba.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}