この記事についてClaude(Anthropic)との共同編集により作成されました。
要約
- 汎用のデフォルトは vLLM。対応モデルと対応ハードウェアが広く、主要なオーケストレーション層もバックエンドに採用している
- SGLang が得意なのは、プレフィックスを使い回す負荷(エージェント、マルチターン、構造化出力)と、DeepSeek 系のような大規模 MoE の多ノード配信である
- 性能比較はワークロードで逆転する。2026 年の論文では dense は vLLM、MoE は SGLang が速かった。公開ベンチマークの多くはプレフィックス共有の多い条件を測っていない
- ARC-AGI-2 の直答では vLLM が勝ち(418 対 272 tok/s)、マルチターンは差なし、ARC-AGI-3 では SGLang 系への載せ替えで public LB が 2.68 から 11.07 に上がった(要因は未分離)
- 差が開いた場面は、KV キャッシュが GPU に収まるかで説明できると読んでいる。SGLang のプレフィックス再利用は強いが、ハイブリッドモデルでは状態の保存にメモリを払う
- 自分の結論は、迷ったら vLLM で始めつつ、エンジンの評判より先に KV の収支を確かめること。同時本数 × 文脈長が収まる構成を選ぶ
きっかけ
2026 年の秋に、Kaggle の ARC Prize 2026(ARC-AGI-2 と ARC-AGI-3)に出ていた1。どちらもオフラインの Kaggle ノートブックに重みを持ち込み、限られた時間で推論を回すコンペで、1 秒あたりに生成できるトークン数がそのままスコアに効く。そのため、モデルの中身と同じくらいサービングのことを考える羽目になった。
ただ、調べても結論がそろわない。「SGLang は vLLM より速い」という記事もあれば、逆の記事もある。実際に手元で載せ替えると、ARC-AGI-2 と ARC-AGI-3 でも結果が逆になった。
そこで、どんな場合にどれが強いのかを、公式情報と論文で整理し直した。あわせて、コンペで同じ負荷を載せ替えた実測を載せる。公式情報のバージョンとスター数は 2026-11-04 に確認した。
先に答えを書いておくと、どっちが速いかより、自分の負荷が GPU のメモリに収まるのはどっちかを先に確かめたほうがよい。
サービングフレームワークが解いている問題
LLM 推論のボトルネックは、GPU メモリ上の KV キャッシュ(過去トークンの Key / Value)の扱いにある。各フレームワークの差は、主に次の 3 点に出る。
| 論点 | 内容 | 代表的な技術 |
|---|---|---|
| メモリ管理 | KV を無駄なく詰め、同時に処理できるリクエストを増やす | PagedAttention(vLLM)3 |
| 再利用 | 同じプレフィックスの KV を再計算せずに使い回す | RadixAttention(SGLang)7、prefix caching(vLLM)12 |
| スケジューリングと分散 | バッチの組み方、prefill と decode の分離、複数 GPU への分散 | continuous batching、PD 分離、Expert Parallel |
Claude Code を使っている人なら、再利用は prompt caching と同じ話だと思えばよい。Anthropic の API では、tools、system、messages の順で先頭から完全に一致した部分だけがキャッシュに当たり、途中を変えるとそれ以降は無効になる2。システムプロンプトと CLAUDE.md が先頭に固定され、後ろに履歴が伸びていくコーディングエージェントのハーネスは、プレフィックス再利用が最も効く負荷である。
vLLM と SGLang を比べる
| 観点 | vLLM | SGLang |
|---|---|---|
| 設計の出発点 | PagedAttention によるメモリ効率3 | RadixAttention によるプレフィックス再利用7 |
| 自己紹介 | 誰でも使える高速で安価な LLM 配信4 | エージェント、大規模配信、RL ロールアウトに最適化6 |
| ガバナンス | PyTorch Foundation5 | LMSYS + 商用会社 RadixArk611 |
| 最新版 | v0.32.0(10-18)8。v0.33.0 が RC | v0.5.23(11-02)10 |
| GitHub スター | 約 9.6 万 | 約 3.8 万 |
| 対応モデル | 200 以上のアーキテクチャ4 | 主要な新モデルはリリースごとに追加10。網羅性は vLLM のほうが広い |
| 対応ハードウェア | NVIDIA、AMD、Intel に加え、TPU、Gaudi、Spyre、Ascend、Apple Silicon など4 | NVIDIA、AMD、TPU、Intel、Apple Silicon、Ascend、Moore Threads6 |
| プレフィックス再利用 | 固定長ブロックのハッシュ連鎖で判定。埋まったブロックだけキャッシュする12 | radix tree で一致部分を自動再利用。ルーティングもキャッシュを考慮する9 |
| 生成以外 | テキスト出力が中心 | 画像・動画生成の SGLang Diffusion を同梱6 |
どちらもおおむね 2 週間ごとにリリースされ、片方にしかなかった機能が数か月でもう片方に入ることが多い。半年前の比較記事は参考程度に読むのがよい。
vLLM が強い場面
- 汎用の本番 API サーバ: 新しいモデルへの対応が速く、たいていのモデルがそのまま動く4
- NVIDIA 以外のハードウェア: TPU、Gaudi、Ascend などを使うならまず候補になる4
- dense モデルの計算効率: 後述の CCL-Bench で、MFU が SGLang の約 2 倍だった13
- 周辺ツールとの連携: llm-d、AIBrix、Ray Serve LLM、Dynamo がそろって対応している23242526
SGLang が強い場面
- プレフィックス共有の多い負荷: 論文では、エージェント制御や JSON デコード、マルチターン会話などで当時の既存システム比で最大 6.4 倍のスループットを報告している7。キャッシュを考慮したロードバランサで、ヒット率が 20% から 75% に上がった例もある9
- 構造化出力: 圧縮 FSM と xgrammar で JSON などの制約付きデコードを速くする79
- 大規模 MoE の多ノード配信: PD 分離と大規模 Expert Parallel で、DeepSeek-V3 を H100 96 枚で配信した事例がある14
- RL のロールアウト生成: verl、slime、AReaL などに組み込まれている6
ベンチマークは何を言っているか
性能比較は条件で逆転する。比較的条件の分かる 2 本を挙げる。
CCL-Bench 1.0(2026-05、arXiv)は、A100 上で通信バックエンドや並列化の設定をそろえて比べた13。
| ワークロード | 結果 | 論文の分析 |
|---|---|---|
| Qwen3-4B(dense) | vLLM が速い。MFU 17.1% 対 8.6% | vLLM の計算カーネルが効率的 |
| Llama-3.1-8B(dense) | vLLM が速い。MFU 28.4% 対 15.5% | 同上 |
| DeepSeek-MoE-16B(EP4 / TP4) | SGLang が速い。76.1 ms 対 81.2 ms | SGLang の AllToAll 実装が効率的 |
Jarvislabs のブログ(2026-05、H100)では、短いプロンプトは vLLM のバランスが最も良く、16K トークンの長いプロンプトでは SGLang の TPOT が最も低かった。ただし TTFT は高めで、バージョンの記録がなく、著者も普遍的な順位ではないと断っている15。
どちらも、プレフィックスを共有する条件は測っていない。SGLang の本領はそこなので、エージェント用途ならこの数字では判断できない。「SGLang が 29% 速い」のような数字を載せたブログは他にも多いが、条件が不明確で互いに食い違うため、本記事では採らなかった。
測り方自体でも数字はずれる。自分で比べるときの注意点は負荷検証ツールの記事に書いた。
ARC-AGI で載せ替えて測ったら
ここからは手元の実験記録である。どちらも Qwen 系モデルの推論を Kaggle 上で回した。LB はすべて public の値で、private はまだ発表されていない。
- ARC-AGI-2: NVIDIA L4(24 GB)× 4、PCIe 接続、Qwen3.8-27B(dense と GDN の混成)
- 直答: 1 回のプロンプトで長く考えて答える。文脈は 8 万トークン前後まで伸び、プレフィックスは使い回さない
- マルチターン: Python ツールを呼びながら解く
- ARC-AGI-3: RTX PRO 6000(96 GB)× 1、Qwen3.8-Flash-Next(125B の MoE)。ゲームを操作するエージェントで、画像と履歴が伸びていく
| 負荷 | 構成 | 同時 | KV 容量(トークン) | 結果 |
|---|---|---|---|---|
| ARC2 直答 | vLLM 素 | 24 | 1,408,000 | 298.5 tok/s |
| ARC2 直答 | vLLM + MTP 2 | 21 | 1,157,090 | 418.1 tok/s(採用) |
| ARC2 直答 | SGLang + MTP | 24(実際は 9〜12) | 516,014 | 272.1 tok/s |
| ARC2 直答 | SGLang 素(radix なし) | 24 | 1,307,584 | 最初の prefill で OOM |
| ARC2 マルチターン | vLLM | 24 | 1,436,259 | LB 16.11(1 本) |
| ARC2 マルチターン | SGLang | 24 | 752,964 | LB 16.25(2 本の平均) |
| ARC3 | vLLM(KV 5 GiB 固定・MTP 3) | 28 × 32k | 5 GiB | LB 2.68(9 本の平均) |
| ARC3 | vLLM(MTP なし) | 7 × 64k | 486,838 | LB 4.46(2 本の平均) |
| ARC3 | SGLang 系 fork(FP8 KV・MTP 3) | 10 × 128k | 1,011,264 | LB 11.07(1 本) |
MTP はモデルに同梱された投機デコードで、KV を余分に使う代わりに速くなる。ARC-AGI-2 の版は vLLM 0.30.0 と SGLang 0.5.20、ARC-AGI-3 の fork は 0.5.19 相当である。
分かったことは 4 つある。
1 つ目は、直答で SGLang が負けた理由がエンジンの遅さではなかったこと。SGLang + MTP は、GDN の中間状態に 1 GPU あたり 3.52 GB を取られて KV が 516k まで減り、同時 24 のうち 9〜12 本しか走らなかった。素の構成は prefill の CUDA graph で OOM した。つまり、24 GB の GPU に収まらなかった結果で、エンジンの速さを比べたものになっていない。別の方の RTX 4090 × 4 の記事では、同時 1 の decode は SGLang が約 1.35 倍速い一方、KV は 281k 対 441k だった16。向きがそろっている。
2 つ目は、マルチターンでは再利用の差が出ても、スコアは動かなかったこと。同じ窓で比べると、プレフィックスの再利用は SGLang 0.955 対 vLLM 0.723 で、1 ターンあたりの新規 prefill は 702 対 4,164 トークンだった(1 run 同士)。Decode の速さは定常区間で同じである。一方で KV は約半分になった。
理由はハイブリッドモデルの構造にある。GDN のような線形注意の層は、トークンごとの KV ではなく固定サイズの状態を持つ。途中のトークンの分だけを取り除けないので、再利用するには途中の状態を保存しておく必要がある。SGLang の extra_buffer は 1 要求あたり 5 枠の状態を持つ。再利用は無料ではなく、KV を削って買っている。LB は同じ版でも 15.00 と 17.50 に振れる分解能なので、差なしと読んだ。
3 つ目は、ARC-AGI-3 では KV が約 2 倍に増える構成へ替えたらスコアが上がったこと。当時の vLLM の image では、この MoE の KV が BF16 のみで、FP8 にできなかった。SGLang 系の fork なら FP8 KV と MTP 3 が同時に使え、10 本 × 128k が現実的になった。公開解法の Daniel Franzen さんの serving 一式をそのまま持ってきたものである17。キャッシュのヒット率は 48% から 84% に上がった(測った条件は別)。
ただし、この 11.07 は重み、KV の型、MTP、窓、同時本数を同時に変えた結果で、エンジンの差とは分離できていない。使ったのは素の SGLang でもなく、パッチの当たった Pennyroyal という fork である18。上流の 0.5.21 に差し替えると KV は 820k 程度に減る見積もりだったので、差し替えは見送った。また、公開解法自体の LB は 27.24 で、そこまでの差はサービング以外の部分が持っていると読んでいる。
4 つ目は、KV が詰まると損が大きいこと。ARC-AGI-2 の本番では、KV が律速の区間で生成が 374 から 218 tok/s へ約 4 割落ちた。待っている要求の prefill と preemption で decode が止まるためである。ARC-AGI-3 でも、10 本に 2 本足して 12 本にしただけで、ヒット率は 0.94 から 0.82 に、ゲーム側の生成トークンは 18% 減った。
OpenAI 互換でも差し替えるだけでは同じ入力にならない
載せ替えで踏んだ罠も書いておく。どちらも OpenAI 互換 API なので差し替えは簡単に見えるが、プロンプトの描画が変わる。
- SGLang は
toolsの渡し方が違い、system の JSON が 11 トークン変わった。1 回目は 20.17 対 24.00 で負けたが、原因候補のこの描画を揃えた 2 回目は 24.00 で並んだ - SGLang の Qwen3.8 テンプレートは assistant の
reasoning_contentしか読まず、reasoningで送ると過去の推論が黙って全部落ちる
比べる前に、同じ入力が最終的に同じトークン列になるかを確かめる必要がある。
KV の収支の見方
ここまでの話を、自分の環境に当てはめる手順にする。必要な KV は、おおよそ次で見積もれる。
必要な KV ≒ 同時本数 × (実際に伸びる文脈長 + 1 要求の固定分)1 要求の固定分は、Qwen3.8-27B の vLLM で素 1.5k、MTP 2 で 4.8k、MTP 3 で 7.4〜8.6k トークン相当だった。文脈長の見積もりは最大でなく、実際の平均でもよい。ARC-AGI-3 の公開解法は 10 本 × 128k(1.31M)に対して KV が 1.01M しかないが、128k に達したら 58k まで一気に捨てることで平均 88k に抑えている。少しずつ捨てるとプレフィックスが毎ターン崩れるので、まとめて捨てる。Claude Code の /compact に近い考え方である。
KV を食うものと、確かめる場所は次のとおり。
| 項目 | メモリへの効き方 | 確かめる場所 |
|---|---|---|
| 重みの量子化 | 重みを軽くすれば KV に回る | 起動ログのメモリ内訳 |
| KV の型(BF16 / FP8 / NVFP4) | FP8 で BF16 の約半分 | --kv-cache-dtype。モデルと版で可否が違う |
| 投機デコード | ドラフト用の状態と 1 要求の固定分が増える | MTP の段数を変えて比べる |
| ハイブリッドの状態保存 | 再利用のために枠を取る | SGLang の --mamba-radix-cache-strategy |
| CUDA graph | KV を確保した後の余白を食う | SGLang の --mem-fraction-static |
起動後に見るのは次の値である。
- vLLM:
Maximum concurrency for 81,920 tokens: 4.69xのログ。この倍率が同時本数を下回っていたら収まらない。詰まったかどうかはvllm:num_preemptions_totalで数える - SGLang: 起動ログの
max_total_num_tokensと、Decode 行のfull token usage。--enable-cache-reportでターンごとのcached_tokensが取れる
なお、収支の前提も変わり続けている。vLLM 0.32 では NVFP4 の KV が SM8x と SM12x でも動くようになった8。手元の L4 では容量が 1.62 倍になる一方、tok/s は 0.969 倍で、この負荷では採らなかった。SGLang 0.5.23 には、GPU メモリに載らない MoE を動かす Paged Experts が入っている10。上の表の数字は版を選ぶ判断材料にはなるが、今の版の優劣ではない。
その他の選択肢
ほかの選択肢は「層」で分けると整理しやすい。
推論エンジン(単体で動くもの)
| フレームワーク | 位置づけ | 向いている用途 |
|---|---|---|
| TensorRT-LLM | NVIDIA GPU 専用。独自カーネル、PD 分離、投機デコード19 | NVIDIA GPU で性能を突き詰める本番環境 |
| LMDeploy | C++ の TurboMind と PyTorch エンジンの 2 本立て27 | 量子化モデル、InternVL などの VLM、Ascend |
| llama.cpp | C/C++ 製。GGUF で CPU や Apple Silicon でも動く28 | ローカル、エッジ、小さな GPU |
| Ollama | ggml ベース。モデルの取得と起動が簡単29 | 個人 PC での試用、開発 |
| MLC-LLM | ML コンパイラで各環境向けにビルド30 | スマホ、ブラウザ |
| KTransformers | よく使うエキスパートを GPU、残りを CPU に置く22 | 巨大 MoE を少ない GPU で動かす |
| TGI | Hugging Face 製。アーカイブ済み21 | 新規採用は避ける。HF 自身が vLLM、SGLang などを勧めている |
TensorRT-LLM は「モデルを事前にコンパイルする必要がある」と説明されがちだが、これは古い。1.2 で TensorRT バックエンドと trtllm-build は削除され、今は PyTorch が実行バックエンドになっている20。手元の L4 1 枚で小さいモデルを vLLM と比べたら、区間の decode で 9B が約 12%、4B が約 21% 速かったが、測り方を揃え直すと本数で変わった(9B で 21 本 1.08 倍、6 本 0.96 倍)。
オーケストレーション層(エンジンの上で束ねるもの)
単一ノードならエンジンだけで足りる。複数ノードで、KV を考慮したルーティング、PD 分離、オートスケールが必要になったときに載せる。vLLM や SGLang を置き換えるものではなく、バックエンドとして使う。
| フレームワーク | 開発元 | 対応エンジン | 特徴 |
|---|---|---|---|
| NVIDIA Dynamo23 | NVIDIA | SGLang、TensorRT-LLM、vLLM | KV を GPU→CPU→SSD→リモートへ逃がす、SLA ベースの自動スケール |
| llm-d24 | Red Hat、Google Cloud、IBM Research など。CNCF Sandbox | vLLM 中心(SGLang の PD 分離も対応) | Kubernetes ネイティブ。階層型 KV オフロード |
| AIBrix25 | vllm-project(ByteDance 発) | vLLM、SGLang、TensorRT-LLM | エンジンの状態を見たルーティング、LoRA の動的ロード |
| Ray Serve LLM26 | Anyscale | vLLM、SGLang | Ray 上のマルチノード配信とバッチ推論 |
使い分けの目安
| こういう場合 | 第一候補 | 補足 |
|---|---|---|
| とりあえず OSS モデルを API で立てる | vLLM | 迷ったらこれ |
| NVIDIA 以外を使う | vLLM | SGLang も一部対応。要確認 |
| 出たばかりのモデル、珍しいアーキテクチャ | vLLM | 両方の対応状況を見る |
| エージェント、マルチターン、長い共通プロンプト | SGLang を測る | ハイブリッドモデルは状態保存のメモリ分を引いて比べる |
| JSON などの構造化出力を大量に出す | SGLang | |
| プレフィックスを使い回さない長文の推論 | vLLM を測る | radix の利点が消え、decode と KV の勝負になる |
| 巨大 MoE を多ノードで配信 | SGLang | vLLM も対応が進んでいる。両方測る |
| VRAM が小さい GPU(24 GB など)で同時本数を稼ぐ | KV 容量を先に比べる | CUDA graph と投機の状態まで引く |
| RL のロールアウト生成 | 使う RL フレームワーク次第 | |
| ローカル PC、エッジ | llama.cpp / Ollama | スマホ、ブラウザなら MLC-LLM |
| NVIDIA で性能を極限まで | TensorRT-LLM | Dynamo と組み合わせる |
| Kubernetes で大規模運用 | エンジンはどちらでも | 上に llm-d / Dynamo / AIBrix を載せる |
自分の結論
迷ったら vLLM で始めつつ、エンジンの評判より先に KV の収支を確かめること。同時本数 × 文脈長が自分の GPU に収まる構成はどれかを、起動ログで比べる。
ARC-AGI-2 では KV が半分になった SGLang が不利で、ARC-AGI-3 では FP8 KV が使えた SGLang 系が有利だった。正反対に見える 2 つの結果は、同じ軸で説明できると読んでいる。「SGLang はエージェントに強い」という一般論は間違っていないが、それだけで選ぶと、再利用のために払うメモリを見落とす。
最後に留保を書いておく。手元の実測はモデルも GPU も限られていて、どれも 1 つの負荷の話である。LB の比較は本数が少なく、ARC-AGI-3 の改善はエンジン単体の効果ではない。半年後には機能も数字も変わっているはずなので、同じ表を信じるより、自分の負荷で同じ確かめ方をするのがよい。
参考文献
- ARC Prize https://arcprize.org/
- Anthropic, Prompt caching https://platform.claude.com/docs/en/build-with-claude/prompt-caching
- Kwon et al., Efficient Memory Management for Large Language Model Serving with PagedAttention (SOSP 2023) https://arxiv.org/abs/2309.06180
- vLLM GitHub README https://github.com/vllm-project/vllm
- PyTorch Foundation Welcomes vLLM as a Hosted Project (2025-05-06) https://pytorch.org/blog/pytorch-foundation-welcomes-vllm/
- SGLang GitHub README https://github.com/sgl-project/sglang
- Zheng et al., SGLang: Efficient Execution of Structured Language Model Programs https://arxiv.org/abs/2312.07104
- vLLM v0.32.0 リリースノート https://github.com/vllm-project/vllm/releases/tag/v0.32.0
- LMSYS Blog, SGLang v0.4 (2024-12-04) https://lmsys.org/blog/2024-12-04-sglang-v0-4/
- SGLang v0.5.23 リリースノート https://github.com/sgl-project/sglang/releases/tag/v0.5.23
- TechCrunch, Sources: Project SGLang spins out as RadixArk (2026-01-21) https://techcrunch.com/2026/01/21/sources-project-sglang-spins-out-as-radixark-with-400m-valuation-as-inference-market-explodes
- vLLM ドキュメント, Prefix Caching https://docs.vllm.ai/en/latest/design/prefix_caching/
- Ding et al., CCL-Bench 1.0: A Trace-Based Benchmark for LLM Infrastructure (arXiv:2605.06544, Appendix G.1) https://arxiv.org/abs/2605.06544
- LMSYS Blog, Deploying DeepSeek with PD Disaggregation and Large-Scale Expert Parallelism on 96 H100 GPUs (2025-05-05) https://lmsys.org/blog/2025-05-05-large-scale-ep/
- Jarvislabs, SGLang vs vLLM: H100 Benchmarks, with TensorRT-LLM (2026-05-18) https://jarvislabs.ai/blog/vllm-sglang-trtllm-comparison
- engchina, SGLang × Qwen3.8-27B × RTX 4090 ×4(Qiita) https://qiita.com/engchina/items/d37f3169be4da2d31548
- Daniel Franzen, ARC-AGI-3 solution https://github.com/da-fr/arc-agi-3-solution
- Pennyroyal(SGLang for RTX PRO 6000) https://github.com/jpezzulli/sglang-rtxpro6000
- TensorRT-LLM GitHub README https://github.com/NVIDIA/TensorRT-LLM
- TensorRT-LLM Release Notes https://nvidia.github.io/TensorRT-LLM/release-notes.html
- Text Generation Inference GitHub README https://github.com/huggingface/text-generation-inference
- KTransformers GitHub https://github.com/kvcache-ai/ktransformers
- NVIDIA Dynamo GitHub README https://github.com/ai-dynamo/dynamo
- llm-d GitHub README https://github.com/llm-d/llm-d
- AIBrix GitHub README https://github.com/vllm-project/aibrix
- Ray Serve LLM ドキュメント https://docs.ray.io/en/latest/serve/llm/index.html
- LMDeploy GitHub README https://github.com/InternLM/lmdeploy
- llama.cpp GitHub https://github.com/ggml-org/llama.cpp
- Ollama GitHub https://github.com/ollama/ollama
- MLC-LLM GitHub https://github.com/mlc-ai/mlc-llm