Skip to Content
Docs11. LLM 内部構造推論の内部機構(サンプリング・KV キャッシュ・量子化)

この記事の音声は準備中です。

音声の一覧・再生リストへ

推論の内部機構(サンプリング・KV キャッシュ・量子化)

この記事の目的

学習済みモデルが推論時に何をしているかを、数式と計算量の観点で理解できるようになります。ロジット → 確率 → 選択のサンプリングの数理、プリフィルとデコードという 2 相の計算量・メモリ特性、連続バッチング推論サーバーで複数リクエストをまとめて処理し、各リクエストの開始・終了が揃わなくても空いたスロットに次を詰めて GPU を遊ばせない方式。1 件ずつ処理するよりスループットが大きく上がる。高スループット系の推論エンジンが備える中核機能。・投機的デコーディング・量子化モデルの重みを低い数値精度(INT8・INT4 等)で表現してサイズを縮める手法。VRAM とメモリ帯域の負荷が下がり、同じ GPU により大きいモデル・多い同時実行を載せられる。精度を下げるほど品質が落ちうるため、量子化後の品質は自社タスクで検証してから使う。といった高速化技術の原理までを押さえ、「なぜ入力は安く出力は高いのか」「なぜ最初のトークンは遅く以降は速いのか」といった API の価格・レイテンシ特性の『なぜ』に接続できる状態を目指します。

数式は読み下しを添え、読み飛ばしても本文が成立するようにします。推論エンジンの実装・運用はセルフホスト推論の実務側で、本記事は原理を扱います。

対象読者

  • LLM はどのようにテキストを生成するかを読み、サンプリング・推論コストの「なぜ」を数式で理解したいエンジニア
  • API の価格構造・レイテンシ特性や、セルフホストの高速化技術の原理を押さえたい人

前提知識

本文

概要: プリフィルとデコードの 2 相

自己回帰生成の推論は、性質の違う 2 つの相からなります。

推論の内部機構(サンプリング・KV キャッシュ・量子化): 概要: プリフィルとデコードの 2 相の図推論の内部機構(サンプリング・KV キャッシュ・量子化): 概要: プリフィルとデコードの 2 相の図
推論の内部機構(サンプリング・KV キャッシュ・量子化): 概要: プリフィルとデコードの 2 相の図
図を元の大きさで表示

図の中をスクロールして読めます。キーボードでは図の領域へ Tab で移動し、矢印キーを使います。読み終わったら、この見出しをもう一度選ぶと閉じます。

推論の内部機構(サンプリング・KV キャッシュ・量子化): 概要: プリフィルとデコードの 2 相の図推論の内部機構(サンプリング・KV キャッシュ・量子化): 概要: プリフィルとデコードの 2 相の図

この非対称が、後述の「入力は安く出力は高い」「バッチングが効く」といった性質の根です。

ロジット → 確率 → 選択の数理

各ステップで、モデルは語彙上のスコア(ロジット z\mathbf{z})を出します(Transformer アーキテクチャ詳解の出力ヘッド)。これを確率に変え、1 つ選ぶまでを制御するのがサンプリングです。

温度(temperature) TT は、softmax の鋭さを調整します。

pi=exp⁡(zi/T)∑jexp⁡(zj/T)p_i = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)}

読み下し: 「ロジットを温度 TT で割ってから softmax する。TT が小さいほど分布が尖って決定的に、大きいほど平らでランダムになる。T→0T \to 0 は最大確率のトークンを選ぶ貪欲法」。

選択肢の絞り込みは 2 系統です。

  • top-k: 確率上位 kk 個だけを残し、その中で正規化してサンプリングする
  • top-p(核サンプリング / nucleus sampling): 確率の高い順に足していき、累積確率が pp 以上になる最小の集合だけを残す。候補数を文脈に応じて動的に変える(自信のある場面では少なく、曖昧な場面では多く)

読み下すと: 「top-k は個数で、top-p は確率質量で裾を切る」。さらに繰り返しペナルティ(既出トークンのロジットを下げる)などで退化(同じ語の反復)を抑えます。温度 0 として提供される貪欲法は、固定されたロジットと同点処理のもとで選択時の乱数を除きます。ただし、モデル更新・浮動小数点演算・バッチ構成などによる変化まで消すものではなく、実システムの出力完全一致を保証しません。再現性が必要ならモデル版・推論環境・入力を固定し、回帰評価では業務上の成功条件も確認します(LLM はどのようにテキストを生成するか)。

プリフィルとデコードの計算量・メモリ

KV キャッシュは、過去の全トークンの K・V を保持して各デコードステップで再利用する仕組みです。そのサイズは(注意機構の変種と長コンテキスト技術で導いた式):

KV bytes≈2⋅n⋅L⋅hkv⋅dh⋅b\text{KV bytes} \approx 2 \cdot n \cdot L \cdot h_{kv} \cdot d_h \cdot b

読み下し: 「K と V の 2 つ分 × トークン数 nn × 層数 LL × KV ヘッド数 hkvh_{kv} × ヘッド次元 dhd_h × バイト数 bb」。デコードでは毎ステップこの KV キャッシュ全体とモデル重みをメモリから読むため、1 トークンの生成に必要なメモリ転送量が速度を決めます(メモリ帯域律速)。

ここから重要な非対称が出ます。プリフィルは nn トークンを並列処理し計算を使い切れる一方、デコードは 1 トークンずつで演算に対してメモリ読み出しが重い。だから:

  • 入力(プリフィル)は 1 トークンあたり安く、出力(デコード)は高い — API 料金で出力単価が入力単価より高い構造的な理由
  • デコードは GPU の演算能力を持て余す — その余りを埋めるのが次のバッチングです

バッチングと連続バッチング

デコードがメモリ帯域律速だということは、複数リクエストの重み読み出しを共有できれば、演算の余りで同時に処理できることを意味します。これがバッチングです。

  • 素朴なバッチング: 複数リクエストをまとめて処理する。だが各リクエストの長さ・完了タイミングが揃わず、遅いものに引きずられて GPU が遊ぶ
  • 連続バッチング(continuous batching): リクエストの開始・終了が揃わなくても、空いたスロットに次のリクエストを随時詰める。完了したものを抜き、待っているものを入れることで GPU を遊ばせない(セルフホスト推論の実務の中核機能)

読み下すと: 「デコードの余った演算力を、他リクエストの処理で埋めてスループットを上げる」。ただしバッチング=スループット最適化であり、個々のリクエストのレイテンシとはトレードオフになります(レイテンシ最適化)。KV キャッシュのメモリ管理(断片化を避ける工夫)も、同時に載せられるリクエスト数=スループットを左右します。

投機的デコーディング

デコードがメモリ帯域律速なら、1 回のメモリ読み出しで複数トークンを検証できれば速くなる。これが投機的デコーディング(speculative decoding)です。

  • 下書き: 小さく速い「下書きモデル」で次の kk トークンをまとめて予測する
  • 検証: 本命モデルで、その kk トークンを1 回のフォワードで並列に検証する。貪欲法なら本命が選ぶトークンと先頭から一致する分を採用し、最初の不一致では本命のトークンへ置き換える

確率的にサンプリングする場合は、単なる一致判定では分布を保てません。同じ語彙と接頭辞に対する本命の分布を pp、下書きの分布を qq とすると、下書きトークン xx を確率 min⁡(1,p(x)/q(x))\min(1,p(x)/q(x)) で受理します。最初の棄却時は max⁡(0,p−q)\max(0,p-q) を正規化した補正分布から選び直し、以降の下書きを捨てます。全候補を受理した場合は本命の分布からさらに 1 トークン生成します。

読み下すと: 「安いモデルで先読みし、本命が不足する確率を補って一括採点する」。原論文の手順では本命から直接サンプリングする分布を保つことが示されています。温度・top-p などの選択処理も織り込んだ分布と正しい受理・補正が条件で、任意の近似実装まで同じ保証を持つわけではありません。速度の利得は受理率と下書き・検証の実行コストに依存します。

量子化

量子化(quantization)は、重み・活性・KV キャッシュを低い数値精度(FP16 → INT8 / INT4 など)で表し、メモリと帯域を減らす技術です(GPU・AI ハードウェアの基礎)。

  • 何を量子化するか: 重み(最も一般的・メモリ削減が大きい)、活性(実装が難しい・外れ値の扱いが鍵)、KV キャッシュ(長文で効く)
  • 学習後量子化(PTQ): 学習済みモデルを事後に量子化する(GPTQ・AWQ など)。手軽だが精度低下のリスク
  • 原理的なトレードオフ: 精度を下げるほどメモリ・速度は得だが、品質が落ちうる。外れ値(outlier)の大きな値をどう保つかが品質維持の鍵で、重要な部分を高精度に残す混合精度が使われます

読み下すと: 「数値の桁を削ってメモリ・帯域を稼ぐ。どこまで削れるかは品質との引き換え」。量子化後の品質は自社タスクで必ず検証します(ベンチマーク上は同等でも、特定タスクで劣化することがあります)。

この理解が効く場面

実務での注意点

アンチパターン

  • 入力と出力のコストを同じに見積もる → デコード(出力)はメモリ帯域律速で高く、プリフィル(入力)は安い → 出力単価が高い構造を前提にコストを試算する(コスト管理)
  • バッチングでレイテンシも良くなると期待する → 連続バッチングはスループット最適化で、個々のレイテンシとはトレードオフ → スループット目標かレイテンシ目標かを決めて調整する
  • 投機的デコーディングはどんな実装でも分布を保つと思う → 単なる一致判定では確率的サンプリングの分布が変わりうる → 採用する方式の受理・補正手順と保証条件を確認する
  • 量子化を「無料の高速化」と考える → 精度低下で特定タスクの品質が静かに落ちうる → 量子化後の品質を自社タスクで検証してから使う
  • 温度 0 だけで完全一致を保証する → 演算・バッチ構成・モデル版による差が残る → 選択時の乱数とシステム全体の再現性を分け、環境固定と成功条件による回帰評価を行う

チェックリスト

  • プリフィル(計算律速)とデコード(メモリ帯域律速)の違いを説明できる
  • 温度・top-k・top-p の定義と、用途による使い分けを説明できる
  • KV キャッシュのサイズ式と、それがデコードのメモリ・速度を決める理由を理解している
  • 連続バッチングがスループットを上げる原理(遊休演算の充填)を説明できる
  • 投機的デコーディングの貪欲法と確率的受理・補正を区別し、分布保存と速度向上の条件を説明できる
  • 温度 0 だけで実システムの出力完全一致を保証していない
  • 量子化のトレードオフ(メモリ/速度 vs 品質)と、検証の必要性を理解している
  • 入力/出力の単価差・TTFT を、プリフィル/デコードの非対称から説明できる

関連トピック

参考資料

TODO・未確認事項

なし