LLM パフォーマンスの最適化:同時リクエストに対するプレフィルとデコード
エグゼクティブサマリー
大規模言語モデル(LLM)のパフォーマンスを最適化するには、プレフィルフェーズ(入力プロンプトの処理)とデコードフェーズ(その後のトークン生成)という根本的な違いを管理する必要があります。連続バッチングとチャンク化プレフィルを導入することで、開発者は GPU リソースの利用率を最大化し、総トークンスループットを大幅に向上させることができます—TNG は標準的な vLLM デプロイメントでチャンク化プレフィルを使用した結果、スループットが 50% 増加したことを観測しました。
トークン生成の二段階
LLM はテキストを自己回帰的に生成し、各新しいトークンはそれまでのすべてのトークンに依存します。このプロセスは二つの明確な計算フェーズに分割されます:
プレフィルフェーズ
- 機能:すべての入力プロンプトトークンを処理して最初の出力トークンを計算します。
- 計算プロファイル:高度に並列化可能で GPU 計算集約的です。すべての入力トークンが開始時に分かっているため、モデルはプロンプト全体のキーとバリューのベクトルを同時に計算できます。
- 主要指標:Time to First Token (TTFT) として測定されます。
デコードフェーズ
- 機能:その後のトークンを一つずつ計算します。
- 計算プロファイル:逐次的でメモリ帯域幅に依存します。トークンごとにキーとバリューのベクトルのセットを一つだけ計算すればよいですが、モデルは各ステップで重みとキー・バリュー(KV)キャッシュを GPU メモリからアクセスする必要があります。
- 主要指標:Time Per Output Token (TPOT) として測定されます。
リソース利用率とスループット
GPU の利用率はこの二つのフェーズで大きく異なります。長いプロンプトを持つ単一リクエストはプレフィルフェーズで GPU 計算能力を飽和させることができます。対照的に、単一リクエストのデコードフェーズは計算リソースをほとんど使用せず、複数のリクエストをバッチ化して GPU の計算容量を埋めることでスループットが向上します。
スループットは通常、低いレベルの同時実行数(メモリバウンド領域)では線形に増加し、GPU 計算能力が飽和する(コンピュートバウンド領域)まで増加します。その時点で、同時実行数をさらに増やしてもスループットは変わりません。
同時処理戦略
推論エンジンは同時に到着する複数のリクエストを処理するために、レイテンシと効率に関する異なるトレードオフを持つさまざまなバッチング戦略を使用します。
静的バッチング
静的バッチングはリクエストを固定サイズのバッチにまとめ、バッチ内で最も長いリクエストが完了するまで処理し、その後で新しいバッチを開始します。
- 利点:デコードフェーズが中断されないため、TPOT を最適化します。
- 欠点:リソース利用が非常に非効率で、TTFT が非常に高くなる可能性があります。新しいリクエストは前のバッチ全体が終了するまで待たなければなりません。
連続バッチング(プレフィル優先)
連続バッチングは完了したリクエストを即座に削除し、新しいリクエストを挿入します。「プレフィル優先」戦略は、新しいプレフィルが到着次第スケジュールします。
- 利点:新しいリクエストを即座に処理することで TTFT を最小化します。
- 欠点:既存リクエストのデコードフェーズを中断します。プレフィル操作が GPU 実行時間を支配するため、大きなプレフィルの間、デコードフェーズにある同時リクエストはトークンを一つだけ生成し、ストリーミング出力に「一時停止」が生じます。
チャンク化プレフィル
チャンク化プレフィルは入力プロンプトを複数の小さなチャンクに分割し、複数のステップに分配します。これにより、プレフィル処理中に複数のデコードステップが実行可能になります。
- 利点:計算集約的なプレフィルとメモリバウンドなデコードを並行して実行することでリソース効率を最大化します。トークン生成の完全な停止を防ぐことで平均 TPOT を低減します。
- インパクト:TNG は標準的な vLLM デプロイメントでチャンク化プレフィルを使用した結果、総トークンスループットが 50% 増加したと報告しています。
- トレードオフ:TTFT が若干増加し、チャンクサイズ(通常 512〜8192 トークン)を調整して TTFT と TPOT の優先度をバランスさせる必要があります。