TT Lab
はじめる
学ぶ 学習パス コース

LLMサービング

道具の名前より先に測定契約を固定する

TT Labで続きを見る

一言でいうと

モデルサーバーには、普遍的な勝者がいません。同じモデル・ハードウェア・ワークロードで測定し、必要な機能と運用コストをいっしょに比較する必要があります。

なぜ必要なのか

「どのサーバーを使えばよいですか」という質問に、ベンチマークの表1つで答えることはできません。同じツールが、ワークロードによって最善になることもあれば、不適切になることもあるからです。

基準を先に決める必要があります。対話型かバッチか、入力・出力の長さの分布はどうか、プロンプトに共通プレフィックスが多いか、同時実行数のピークはどれくらいか、構造化出力や特定の量子化に対応する必要があるか、エンジンのビルドとバージョンアップのコストを負担できるかを、書き出します。

どう動くのか

比較を再現できるようにするには、まず測定の契約を固定します。

  1. モデル名だけでなく、正確なリビジョン、トークナイザー、dtype・量子化方式、サーバーのバージョンを記録します。
  2. GPUのモデル・数量、ドライバーとランタイムのバージョン、メモリの上限、コンテナイメージを同じにします。
  3. 実際のトラフィックから、入力・出力のトークン長、共通プレフィックスの比率、同時実行数、到着間隔を抽出して、再生します。
  4. ウォームアップのあとで複数回繰り返し、TTFT・ITL・エンドツーエンドのレイテンシのp50/p95/p99、処理したトークン数、エラー率、GPUメモリ、プリエンプション率を、いっしょに記録します。
  5. 同じ品質設定かを確認します。1つの候補だけが、より積極的な量子化や短い最大出力を使っていれば、速度の比較ではありません。

そのあとで、機能と運用上の制約を見ます。vLLMのブロックベースのKVキャッシュ管理、SGLangのプレフィックス再利用機能、TensorRT-LLMの事前ビルドのエンジン、TGIの対応モデルとデプロイ統合、Ollamaのローカル実行の手軽さは、それぞれ候補を絞る手がかりにすぎず、性能の順位を保証しません。機能の名前が同じでも、リリース、モデル、リクエストの分布によって、得になる程度が変わるので、実際に使う組み合わせのドキュメントと測定結果で決めます。

現場での姿

選択より重要なのは、結果を再び作れることです。ベンチマークのレポートには、実行コマンド、イメージとモデルのリビジョン、ワークロードのデータの生成方法、同時実行数、ウォームアップ・繰り返し回数、生の結果を残します。平均スループットだけがよくても、p99のTTFTやエラー率が、製品のSLOを超えれば、採用できません。

そして、サーバーの選択より前に来る決定があります。モデルのサイズと量子化です。7Bのfp16の重みが入らないGPUで、サーバーだけを変えても、意味がありません。AWQやGPTQで重みを4ビットに量子化すると、重みのメモリは、fp16に比べて理論上は約4分の1ですが、KVキャッシュ・ランタイムの作業領域・量子化のメタデータまで含めた、GPUメモリ全体が4分の1になるわけではありません。実際の削減幅と品質の損失は、対応しているモデルとサーバーの組み合わせで測定する必要があります。

サーバーが実際にしていること

vLLM・TGI・TensorRT-LLMの名前は違っても、性能を作る仕組みは、おおむね同じです。それを知っていれば、設定の名前が違っても、何を調整するのかがわかります。

連続バッチ(continuous batching)。リクエストが終わるまで待たず、ステップごとに、終わったものを外して、新しいものを入れます。静的バッチより、スループットが数倍上がります。これがオンになっているかが、最初の確認事項です。

PagedAttention。KVキャッシュをページ単位で管理して、断片化をなくします。以前は、最大長の分だけ先に確保して、実際の使用量の2、3倍を無駄にしていました。

プレフィックスキャッシュ。システムプロンプトのように、前の部分が同じリクエストのKVを再利用します。精度に影響がなく、TTFTを減らせるので、最初にオンにするものです。

量子化。重みを4–8ビットに減らして、メモリと帯域幅を節約します。品質の損失があるので、評価セットで確認してからオンにします。

メモリをどう分けるのか

GPUメモリは、3つの取り分に分かれます。

전체 24GB
 ├ 가중치         16.2GB   ← 모델 크기 × 비트수/8
 ├ KV 캐시         6.5GB   ← 나머지의 대부분. 동시 요청 수를 정한다
 └ 활성화·여유     1.3GB

このコードブロックの韓国語の図は、全体24GBの内訳として、重みが16.2GB(モデルサイズ×ビット数/8)、KVキャッシュが6.5GB(残りの大部分で、同時リクエスト数を決める)、アクティベーションと余裕が1.3GBだ、という意味です。

gpu_memory_utilizationを上げると、KVキャッシュが大きくなって同時スループットが増えますが、上げすぎると、アクティベーションの余裕が足りなくなって、OOMが起きます。0.90–0.93が実用的な範囲です。

KVキャッシュのサイズは、同時リクエスト数とコンテキスト長の積に比例します。

KV 바이트 ≈ 2 × 레이어 × 헤드 × 헤드차원 × 문맥길이 × 배치 × 정밀도바이트

このコードブロックの韓国語の式は、KVのバイト数がおよそ、2×レイヤー数×ヘッド数×ヘッド次元×コンテキスト長×バッチ×精度のバイト数だ、という意味です。

そのため、コンテキストを16Kから32Kに延ばすと、同時に処理できるリクエスト数が半分になります。「コンテキストを長く開けておこう」は、タダではありません。

何をどう測るのか

ツールを選ぶ前に、測り方を固定します。そうしないと、比較が成り立ちません。

指標 定義 落とし穴
TTFT リクエスト → 最初のトークン プレフィックスキャッシュをオンにすると、劇的によくなります
TPOT トークン間の平均間隔 バッチが大きいと悪くなります
スループット 毎秒の出力トークン(全体) 同時リクエスト数をいっしょに書いて初めて意味があります
p95レイテンシ 上位5% 平均だけを見ると見逃します

3つ目が重要です。「138 tok/s」は、同時4リクエストの合算なのか、単一のリクエストなのかによって、まったく違う数字です。ベンチマークを書くときは、同時実行数・入力長・出力長をいっしょに書きます。この3つがなければ、再現できません。

次の確認で見ること

クイズで、ワークロードの条件に合ったサーバーの選択基準を確認したあと、次のモジュールで、その判断の根拠になるGPUメモリの算定を、計算機で自分で作ります。