DGX Sparkでは、仕事に合わせて複数のローカルLLMをとっかえひっかえ使っている。モデルを切り替えるたびに待たされるので、切替時間を短くしたい。Super VL、Boltに続き、今回はQwen3.8-27B(NVFP4、重み約25GiB)を扱う。
切替に299.8秒かかっていたのを103.3秒にした。同時に保持できる文脈の量(KVキャッシュ)は変えていない。
改善前:どこに時間がかかっていたか
切替は自作の管理ツールが行う。旧モデルの停止から新モデルが応答できるまでの各段階に時刻を記録し、vLLMのログと突き合わせて5つに分けた。
| 段階 | 改善前(秒) | 中身 |
|---|---|---|
| 重みの読込 | 163 | 約25GiBのモデルファイルを読み、GPUへ配置する |
| 画像の事前計測 | 20 | 最大サイズの画像をエンコーダに通し、必要なメモリを測る |
| コンパイル・試運転 | 4 | モデルの計算を準備し、試しに動かす |
| Graph作成・カーネル準備 | 72 | CUDA Graphの記録と、それに使うカーネルのコンパイル |
| その他 | 40.8 | コンテナ起動、vLLM起動、API起動、応答確認 |
| 合計 | 299.8 |
全体の54%が重みの読込、24%がGraph作成・カーネル準備だった。
改善の内容
1. 高速ローダーに替える(重みの読込 163→13秒)
vLLM標準のローダーは、モデルファイルをmmapで開き、テンソルを1つずつ取り出してGPUへ配置する。
--load-format fastsafetensors に替えると、ファイルをまとめて読んでからGPUへ渡す。重みの読込は13秒になった。
2. CUDAのキャッシュを残す(Graph作成・カーネル準備 72→29秒)
CUDA Graphは、GPUで繰り返す計算の手順を記録する仕組みだ。記録の際に、CUDAがカーネル(GPU用の計算部品)をコンパイルする。
コンパイル結果はコンテナ内の /root/.nv に置かれ、モデルを切り替えるたびに消えていた。環境変数を1つ足し、ホストへマウントした /root/.cache/vllm の下へ移した。
ENV CUDA_CACHE_PATH=/root/.cache/vllm/p052-cuda-compute-cache
コンパイルが要らなくなり、Graph作成・カーネル準備は29秒になった。残りはGraphの記録そのものにかかる時間だ。
画像の事前計測、コンパイル・試運転、その他には直接手を入れていない。
改善後も、生成速度(1要求あたり約25トークン/秒)、画像の読み取り、16要求の同時処理、長文入力は改善前と同じように動く。
環境
- NVIDIA DGX Spark(GB10、メモリ128GB)
- vLLM
0.30.0、PyTorch2.13.0+cu130、fastsafetensors0.4.0 - モデル:Qwen3.8-27B(Inferact NVFP4)、文脈長262,144、同時16要求、投機デコードMTP(3トークン)

