# 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/量子化/並列化/連続バッチング方針)まで落とし込みます。