gpt-oss-20b を rest api 的に他のpcから使うにはどうしますか。

gpt-oss-20b に質問

gpt-oss-20b を rest api 的に他のpcから使うにはどうしますか。

GPT‑OSS‑20B を「REST API 風に」他の PC から使う手順

以下は、ローカル環境(GPU があるサーバー)で GPT‑OSS‑20B(または同等の大規模言語モデル)を起動し、外部から HTTP リクエストで呼び出せるようにする一例です。
実際には環境や要件に応じて調整してください。

目的推奨ツール / ライブラリ
モデルロード & 推論transformers + torch (GPU 必須)
REST API サーバーFastAPI(非同期、Swagger UI 付き)
または Flask(簡易)
コンテナ化Docker (任意)
ネットワーク公開ポートフォワード / VPN / Cloud Load Balancer

1. 前提条件

項目内容
OSLinux (Ubuntu20.04 以外でも OK)
GPUNVIDIA + CUDA 11.x+(例: RTX 3090, A100)
Python3.9〜3.12
ディスク容量モデルサイズ ≈ 30–35 GB + ランタイム
ネットワーク外部からのアクセス許可 (ポート80/443 等)

2. 必要なパッケージをインストール

# 仮想環境作成(任意)
python -m venv gpt-oss-env
source gpt-oss-env/bin/activate

# PyTorch (CUDA)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

# Transformers + accelerate
pip install transformers accelerate==0.21.2  # 最新の安定版を使用

# FastAPI + Uvicorn
pip install fastapi uvicorn[standard]  # 標準的な ASGI サーバー

Tip
accelerate はモデルを複数 GPU に分散する際に便利です。単一 GPU なら不要ですが、将来拡張したい場合はインストールしておくと楽です。


3. モデルのダウンロード

GPT‑OSS‑20B は Hugging Face Hub から直接取得できます。
(モデル名は例として EleutherAI/gpt-oss-20b を使用)

from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "EleutherAI/gpt-oss-20b"

# トークナイザーとモデルをロード
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    device_map="auto",          # GPU に自動配置
    torch_dtype=torch.float16,  # FP16 でメモリ削減
)

# GPU が複数ある場合は accelerator を使うとさらに高速化可能

注意
device_map="auto" は Hugging Face の accelerate によって自動的にGPUに割り当てます。
メモリ不足が起きたら torch_dtype=torch.float16load_in_8bit=True を試してください。


4. FastAPI アプリを作成

以下のスクリプト (app.py) をサーバー側 PC に保存します。

# app.py
import os
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

# ---------- モデルロード ----------
MODEL_NAME = "EleutherAI/gpt-oss-20b"

tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
model = AutoModelForCausalLM.from_pretrained(
    MODEL_NAME,
    device_map="auto",
    torch_dtype=torch.float16
)

device = next(model.parameters()).device

# ---------- API 定義 ----------
app = FastAPI(title="GPT‑OSS‑20B REST API")

class PromptRequest(BaseModel):
    prompt: str
    max_new_tokens: int | None = 128
    temperature: float | None = 0.7
    top_p: float | None = 1.0

@app.post("/generate")
async def generate(req: PromptRequest):
    try:
        inputs = tokenizer(req.prompt, return_tensors="pt").to(device)
        with torch.no_grad():
            output_ids = model.generate(
                **inputs,
                max_new_tokens=req.max_new_tokens or 128,
                temperature=req.temperature or 0.7,
                top_p=req.top_p or 1.0,
                do_sample=True,
                pad_token_id=tokenizer.eos_token_id
            )
        generated_text = tokenizer.decode(output_ids[0], skip_special_tokens=True)
        return {"generated_text": generated_text}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

# ---------- Swagger UI などは自動で提供 ----------

実行

uvicorn app:app --host 0.0.0.0 --port 8000 --workers 4

ポイント

  • --workers は複数プロセスを起動し、並列リクエストに対応。
  • ここではポート 8000 を開放していますが、必要なら 80/443 に変更して HTTPS 化してください。

5. ネットワーク設定

  1. ファイアウォール
   sudo ufw allow 8000/tcp   # 例: UFW
  1. ポートフォワード(ローカルネット)
  • ルーター側で 8000 をサーバーの IP に転送。
  • VPN(OpenVPN, WireGuard 等)を利用して安全にアクセス。
  1. HTTPS 化 (任意)
  • Let’s Encrypt + Nginx のリバースプロキシ 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; } }

6. 他の PC から呼び出す

cURL

curl -X POST http://<サーバーIP>:8000/generate \
     -H "Content-Type: application/json" \
     -d '{"prompt":"こんにちは、GPT-OSS‑20B。","max_new_tokens":64}'

Python (requests)

import requests

url = "http://<サーバーIP>:8000/generate"
payload = {
    "prompt": "日本語で小説の冒頭を書いてください。",
    "max_new_tokens": 100,
}
resp = requests.post(url, json=payload)
print(resp.json()["generated_text"])

ブラウザ

http://<サーバーIP>:8000/docs にアクセスすると Swagger UI が表示され、手軽に試せます。


7. Docker 化(任意)

# Dockerfile
FROM python:3.10-slim-bullseye

RUN apt-get update && \
    apt-get install -y --no-install-recommends \
        git build-essential libssl-dev curl ca-certificates \
    && rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY requirements.txt .
RUN pip install --upgrade pip && pip install -r requirements.txt

COPY app.py .

CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]
# ビルド & 実行
docker build -t gpt-oss-api .
docker run -d --gpus all -p 8000:8000 gpt-oss-api

注意
GPU を Docker に渡すには --gpus all が必要。
NVIDIA ドライバと nvidia-container-toolkit がインストールされていることを確認。


8. スケーリング・運用

要件推奨設定
同時リクエスト数が多い場合uvicorn--workers を増やす。
または Gunicorn + UvicornWorker で複数プロセスを組み合わせる。
高可用性Kubernetes(k8s)上にデプロイし、ReplicaSet/Deployment で自動リスタート。
モデルキャッシュtorch.hub のキャッシュディレクトリ (~/.cache/huggingface/hub) を永続化する。
ログ & メトリクスPrometheus + Grafana(推論時間・CPU/GPU 使用率)を組み合わせる。

9. よくある質問

質問回答
GPU が足りないFP16/8bit に切替、または torch.compile(PyTorch 2.x)で高速化。
複数 GPU を持つサーバーを用意するか、クラウド (A100, V100) を利用。
リクエストが遅いバッチ処理や torch.backends.cudnn.benchmark=True の設定で最適化。
推論時に do_sample=False すると高速になる場合もある。
セキュリティを強化したいAPI キー認証(FastAPI の Depends + HTTP Basic/OAuth2)や VPN を併用。
モデルサイズが大きくてダウンロードに時間がかかるgit clone --depth 1 でクローン、または Hugging Face Hub のキャッシュを共有(NFS / EFS)。

10. まとめ

  1. GPU‑対応の Python 環境を用意。
  2. transformers + torch で GPT‑OSS‑20B をロード。
  3. FastAPI(または Flask)で /generate エンドポイントを実装。
  4. Uvicorn (or Gunicorn) でサーバー起動し、ファイアウォール・ポートフォワードで外部公開。
  5. curl / requests / Swagger UI で他 PC から呼び出す。

この構成なら、同一 LAN 内はもちろん、インターネット経由でも安全に REST API を利用できます。

実際に導入する前に、必ず GPU メモリ使用量・推論時間を測定し、必要に応じて FP16/8bit などの最適化を行ってください。 Happy coding!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です