第7章 — 高度なバッチング戦略
LLM Primer VI: AIシステムのスケーリング を章ごとに紹介していくウォークスルー、第7回。バッチングは最適化ではなく、メモリ帯域律速のデコードを成立させる唯一の動きだと示す章。そしてバッチは名詞ではなく動詞である、という話です。
なぜこの章があるのか
1回のデコードステップは数十GBの重みをHBMから読み出して1トークンを生みます。GPUがどうせその重みを流しているなら、同じステップで多数のリクエストのためのトークンをほぼ限界コストゼロで生めます。バッチングは通常の意味での最適化ではなく — メモリ帯域律速のハードウェア上でデコードを経済的に成立させる唯一の方法です。しかしバッチングの素直な方法は現実との接触で崩れます。リクエストは長さが違い、完了時刻も違うからです。第7章はほぼ動くナイーブな仕組みから、本番エンジンが実際に走らせる反復単位のスケジューラまでを歩き、そのスケジューラが第8章に払わせる借金に名前をつけます。
7.1 静的バッチングは最速完了問題に敗れる
静的バッチングは誰もが最初に書くもの。リクエストをバッチサイズBかタイムアウトまで集め、バッチ全体で長さS_maxのプリフィルを走らせ、バッチの全系列がEOSを吐くまでデコードループを回す。2つのコストが組み合わさって破滅的です。パディング — 50トークンのプロンプトが4,000トークンのプロンプトと同じバッチにいると、必要な80倍のプリフィルの仕事を払う。最速完了 — デコードループは全系列が完了するまで走るので、20トークンのリクエストと2,000トークンのリクエストが1つのバッチにあると、時間の99パーセントが31スロットで捨てられるトークンを生むために費やされる。平均スループットは受け入れ可能に見え、テールレイテンシはバッチにたまたま含まれていた長いリクエストによって支配されます。動的バッチング(可変タイムアウト、遅延到着を保留バッチに入れる)は待ちを和らげますが根本的な仕組みは変わらない。デコードが始まった時点で同じ最速完了問題を継承します。
7.2 連続バッチングはリクエスト単位ではなく反復単位でスケジュールする
連続バッチング — OrcaのIteration-level scheduling、NVIDIAのin-flight batching、vLLMとTGIの「中心的な仕掛け」— は変数変換です。生成の全期間バッチを固定するのではなく、スケジューラはデコードステップごとにバッチ構成を見直す。各ステップの後で、完了した系列はスロットを離れKVを解放する、キューから新しい系列が空いたスロットに入る、新しいアクティブセットで結合デコードステップが走る。LLMデコードの2つの性質がこれを可能にします。全てのデコードステップは構造的に同じ操作で、カーネルはスロット7と11のどちらに誰がいるかを気にしない。そして各系列は独自のKVキャッシュを独立に持ち、そのメモリは離脱時に単純に利用可能になる。公平性の単位はリクエストではなく反復になります。20トークンのリクエストは、他に誰がバッチにいようとおよそ20反復で完了し、2,000トークンのリクエストは他を人質に取ることなく必要なだけ1スロットを占める。現実の長い裾のトラフィック — 短いチャットと長いRAG補完の混合 — では、70BモデルでのGPU利用率が静的バッチングに典型的な10〜20パーセントから60〜80パーセントに上がり、p99レイテンシが劇的に締まります。
7.3 チャンク化プリフィルは同じチップ上でプリフィルとデコードを統一する
連続バッチングは依然として緊張を残します。新規到着はプリフィルを必要とし、これは演算律速でパスあたり長い系列を好む。実行中の系列はデコードを必要とし、これはメモリ帯域律速で幅の広いバッチを好む。新規の4,000トークンプロンプトへの完全なプリフィルを、30の進行中の系列のデコードステップと同じ順伝播で走らせると、進行中のデコードを遅らせる(既存ユーザーに悪いTTFT)か、新規到着のプリフィルを遅らせる(新規ユーザーに悪いTTFT)。チャンク化プリフィルはプリフィルを小片 — 例えば1回あたり512トークン — に分割し、それらのチャンクをアクティブ系列のデコードステップと交互に配置します。単一の順伝播が今や新規プロンプトのプリフィルの一部と進行中のデコードの仕事を同時に担い、両局面が同じ重みストリームを共有する。プリフィルの演算律速な性格が算術を吸収し、デコードの帯域需要はバイトあたりのより多くの有用な仕事に償却される。両局面は単一チップ上で敵対するのをやめる。残るケース — 依然として戦うほど大量のトラフィック — は第12章の分離型サービングへの布石です。
第7章が敷いたもの
連続バッチングは仕事を果たし、その過程で同時実行数の束縛制約としてKVキャッシュを露わにします。各アクティブ系列は現在長に比例するサイズの独自のKVを持ち、系列は毎ステップ出入りし、エンジンは事前にそれらがどれだけ長くなるか知らない。ナイーブな1スロット1スラブのレイアウトはバッチング勝利の大半を返してしまう。第8章はオペレーティングシステムの解を持ち込みます。キャッシュを小さな物理ブロックに分割し、それらをページテーブルで論理トークン位置と分離し、エビクションポリシーで系列間でブロックを回収または共有させる。PagedAttentionこそ、連続バッチングのKV問題を扱いやすくする動きです。
次回 — 第8章: 次世代のKVキャッシュ管理。 PagedAttention、H2Oエビクション、InfiniGen、そしてプレフィックスキャッシュの経済圏。