🏃

DGX Spark で高速(低レイテンシ)に gpt-oss-120b を推論

に公開

1台の DGX Spark で速く推論したい。大量に推論したいというよりは、レスポンスが速く返ってきてほしいので、レイテンシ重視で高速に推論したい。

llama.cpp, vLLM, TensorRT-LLM なども試したが、設定を頑張らなくても速いのは sglang のような気がした。

なんと、公式のブログに DGX Spark 用の設定が書いてある。Spark 用のイメージも公開されている。

https://lmsys.org/blog/2025-11-03-gpt-oss-on-nvidia-dgx-spark/

ここに掲載されているものとほとんど同じだが、少しだけオプションをいじったのを使ってみた。

mkdir -p ~/workspace/tiktoken_encodings
wget -O ~/workspace/tiktoken_encodings/o200k_base.tiktoken "https://openaipublic.blob.core.windows.net/encodings/o200k_base.tiktoken"
wget -O ~/workspace/tiktoken_encodings/cl100k_base.tiktoken "https://openaipublic.blob.core.windows.net/encodings/cl100k_base.tiktoken"


docker run --rm -it --gpus all --ipc=host --network=host --ulimit memlock=-1 --ulimit stack=67108864 -v $HOME/.cache:/home/ubuntu/.cache -v $HOME/workspace/tiktoken_encodings:/tiktoken_encodings --user=1000:1000 lmsysorg/sglang:spark python3 -m sglang.launch_server --model-path openai/gpt-oss-120b --host 0.0.0.0 --port 30000 --reasoning-parser gpt-oss --tool-call-parser gpt-oss

変えたところは以下:

  • ulimit などの変更: これはどっかで、GPU使うときは付けといた方がいいと見たのでとりあえず付けている
  • --user=1000:1000: コンテナを root じゃなくて一般ユーザーで実行する
    • それにより、マウント先にファイルが作成されても所有者が root にならない
  • .cache/huggingface じゃなくて .cache をマウントする: 試せば分かるが、元の設定は --user=1000:1000 と相性が悪い
  • tiktoken_encodings のパス: 単に好みの問題
  • モデルを120bに
  • HF_TOKEN を指定しない: 面倒だったのと、既にモデルがキャッシュにあるので

以下を試してみる。

time curl -X POST http://localhost:30000/v1/chat/completions \
    -H "Content-Type: application/json" \
    -H "Accept: application/json" \
    -d '{
        "model": "openai/gpt-oss-120b",
        "messages":[{"role": "user", "content": "渋谷の観光名所を教えて"}],
        "temperature": 0, "max_tokens": 20000
    }'

大体40秒台で返ってくる。50 token/sec をちょっと超えるくらいのパフォーマンスらしい。何もチューニングを頑張らずにこれだけ出るのはかなり速い。
本当は20秒台で返ってきてほしい。ローカルにマシンがあるメリットは、処理待ちやネットワーク遅延が発生しないことだと思っているが、40秒台なら処理速度の観点では、遅いと感じる。
それは厳しいのだろうか。正直、クラウドのLLMが速度・性能・価格のどれを取っても良すぎる。「はやい・安い・うまい」を体現していて、OpenAI, Anthropic, Google, xAI は事実上、吉野家、松屋、すき家、なか卯だと言える。

Discussion