# LLM推論(inference)の技術を体系的に整理する
## 1) 概観:LLM推論とは
大規模言語モデル(LLM)の**推論**は、学習済みパラメータを用いて、与えられたプロンプトから次のトークンを逐次予測・生成する一連の処理です。実務では以下を同時に最適化します。
* **品質**(事実性・整合性・スタイル)
* **レイテンシ**(TTFT: 最初のトークンまで、TPOT: 以降のトークン速度)
* **スループット**(同時ユーザ数・コスト/1000トークン)
* **制御性/安全性**(出力制約・安全ガード)
---
## 2) 数理基盤と計算特性
### 自己注意([[Self Attention]])の要点
入力隠れ状態 $X\in\mathbb{R}^{L\times d}$ に対し
$
Q=XW_Q,\quad K=XW_K,\quad V=XW_V
$
$
\text{Attn}(X)=\text{softmax}\!\left(\frac{QK^\top}{\sqrt{d_h}}+M\right)V
$
* $L$: シーケンス長、$d$: 隠れ次元、$d_h$: ヘッド次元、$M$: 因果(未来を見ない)マスク
* **RoPE**等の位置埋め込みで相対位置を注入。
* **計算量**:
* **Prefill**(プロンプトを一括エンコード)で概ね $O(L^2)$
* **Decode**(1トークンずつ追加)では各ステップ $O(L)$(後述のKVキャッシュで前計算を再利用)
### KVキャッシュ
各トークンの $K,V$ を保持し、次トークン生成時に再計算を省く仕組み。
* メモリ使用量はおおよそ $O(L\cdot d)$(ヘッド数にも比例)
* **MQA/GQA**(複数Qに対しK/Vを共有)でキャッシュ量と帯域を削減
---
## 3) 推論パイプライン(単一リクエストの視点)
1. **トークナイズ**:BPE等で文字列→トークンID列
2. **Prefill**:全プロンプトを前向き計算し、KVキャッシュを構築
3. **Decodeループ**:
* 直近の1トークンを入力に**q**だけ新規計算
* 既存の $K,V$(キャッシュ)と注意→ロジット→サンプリング
* 新トークンを出力し、$K,V$ に追加
4. **後処理**:デトークナイズ、正規化、ガードレール
> **TTFT**は主にPrefillの長さ・並列度に支配され、**TPOT**はDecode最適化(KV帯域、連続バッチングなど)に依存します。
---
## 4) デコーディング(生成戦略)
* **Greedy**:最大確率トークンを選択。高速・決定的だが単調になりやすい。
* **温度付き確率的サンプリング**:ロジット/温度で鋭さを調整。
* **Top-k / Top-p(Nucleus)**:候補を確率上位k、または累積確率pで切り詰め、多様性と一貫性のバランスを取る。
* **Typical Sampling**:分布の“典型度”に基づき外れ値を抑制。
* **反復/出現ペナルティ**:同語反復を軽減(repetition/presence/frequency penalty)。
* **Beam Search**:複数ビームで探索し、整形式タスク(翻訳等)で有効だが、創作性は下がりやすい。
* **対比(Contrastive)/ガイダンス系**:強・弱モデルの分布差や条件付きスコアで安全性・整合性を高める。
* **制約付きデコーディング**:正規表現/FSA/文法で出力フォーマットを厳密制御(構造化出力に有効)。
---
## 5) システム最適化(レイテンシ/スループット/コスト)
### カーネル・メモリ最適化
* **FlashAttention系**:タイル化/再計算回避で注意計算を高効率化。
* **演算融合(fused kernels)**:RMSNorm・MatMul・活性化のカーネル境界を削減。
* **KVキャッシュ量子化**:K/Vを低精度で保持し帯域を削減(精度劣化とトレードオフ)。
### モデル圧縮
* **重み量子化**:INT8/INT4など(W8A16, W4A16等)。メモリ削減と速度向上。
* 代表的手法(例:GPTQ/AWQ/“smooth”系など)の思想は**重要層を守りつつ**誤差を制御。
* **蒸留/小型化**:サービング観点では小型モデルの高スループット化に直結。
* **MoE**:エキスパートの**スパース活性化**で計算を抑制(ロードバランスやレイテンシ分散に注意)。
### 並列化とサービング
* **テンソル並列(TP)**:行列を分割し複数GPUで同時演算。
* **パイプライン並列(PP)**:層を縦に分割してストリーミング。
* **シーケンス/ストリーム並列**:複数シーケンスを同時計算、Prefill/Decodeを分離。
* **連続バッチング(Continuous Batching)**:到着リクエストを常時合流させてSM/行列を満載化。プロンプト長や段階(Prefill/Decode)での**キュー分離**が有効。
* **Paged Attention/メモリプール**:KVキャッシュをページ管理し断片化を回避、バッチ入替を高速化。
* **プロンプト/サブシーケンス・キャッシュ**:同一/共通前置きの再利用でPrefillを短縮。
### 投機的生成(Speculative Decoding)
* **ドラフトモデル**(小型・高速)で複数トークンを先読み→**本番モデル**で一括検証・受理。
* **効果**:受理率とドラフト/本番の速度比に依存し、TTFT/TPOT双方に寄与。
* **派生**:ツリー状の先読み、補助ヘッド(Medusa系)など。
### ハードウェア/ランタイム
* **GPU/TPU/NPU**:HBM帯域とレイテンシがボトルネックになりやすい。
* **CPU/Edge**:量子化+メモリマップ(mmap)読み出しで起動を高速化。
* **通信**:マルチGPUではAll-Reduce/All-Gatherの**通信隠蔽**が鍵。
---
## 6) 長文コンテキストとその対策
* **計算・メモリコスト**:Prefillは $O(L^2)$、Decodeは1ステップ $O(L)$。長文ではKVメモリが支配的。
* **スライディング/ウィンドウ注意**:直近Wトークンへ限定し計算を $O(W)$ に。
* **圧縮/要約状態**:長距離情報を圧縮して“要約状態”を引き継ぐ(再帰型、外部メモリ併用など)。
* **RoPE補間/スケーリング**:コンテキスト拡張の実務的テクニック(精度変動の評価必須)。
---
## 7) サービング指標と運用
* **TTFT(Time-to-First-Token)**:主にPrefill長、初期バッチ化、ロード/ページングで決まる。
* **TPOT(Tokens-Per-Output-Time)/tokens/s**:Decode帯域・連続バッチング・量子化の寄与が大。
* **受理率(Speculative)**、**SLA逸脱率**、**GPU利用率/SM占有率**、**コスト/1000トークン**。
* **安定運用**:優先度キュー、バックプレッシャ、タイムアウト、再試行ポリシー。
---
## 8) 安全性・制御性・決定性
* **温度/カットオフ**で逸脱抑制、**プロンプト設計**と**後段フィルタ**の二段構え。
* **制約付き生成**でJSON/SQL等の厳密フォーマットを保証。
* **決定性**:温度0+固定乱数シード、ビーム幅固定など(カーネル非決定性には留意)。
* **観測と検証**:ログ確率・自己検証・外部検証(RAGやツール)で事実性を補強。
---
## 9) 代表的なサービング構成パターン
* **単一GPU/オンプレ**:小~中規模モデル+INT4/8で低コスト配信。
* **マルチGPU集約**:TP/PP+連続バッチング+Paged KVで高スループット。
* **ドラフト+本番の二段構成**:Speculativeで低レイテンシ化。
* **サーバーレス/分散**:起動時間短縮(mmap/weight-offloading)とウォームプール管理。
---
## 10) 実務Tips(要点だけ)
* **長いプロンプトは高くつく**:共通前置きは“プロンプトキャッシュ”か“システムプロンプト短縮”。
* **TTFTが遅いと体験が悪化**:Prefill分離、先行ストリーミング、軽量モデルでの暫定応答を検討。
* **帯域が律速**:GQA/MQA、KV量子化、Flash系カーネルでデコード帯域を確保。
* **“設定ミス”が品質劣化の元**:温度・top-p・反復ペナルティの初期設定をテンプレ化。
* **長文は戦略を設計**:ウィンドウ化/要約状態/外部検索(RAG)を併用。
* **可観測性**:TTFT/TPOT/受理率/バッチ効率をダッシュボード化し、ABで継続改善。
---
## まとめ
LLM推論は「**アルゴリズム(デコーディング)×システム(メモリ/並列/バッチング)×モデル圧縮(量子化/MoE)**」の三位一体最適化です。ユースケースに応じて品質・レイテンシ・コストのトレードオフを明示化し、TTFTとDecode帯域を分けて対策すると、設計判断がクリアになります。必要なら、想定ワークロード(プロンプト長・同時接続・SLA)を教えていただければ、具体的な推論設定のレシピ(温度/Top-p/量子化/並列化/連続バッチング方針)まで落とし込みます。