推論とは
Inference
学習済みモデルへ入力を与え、出力を計算する処理
ひとことで言うと
学習し終わったAIモデルに入力を与え、答えを計算させること。
概要
推論(Inference)とは、学習済みの機械学習モデルへ新しい入力データを与え、その入力に対する出力(予測・生成結果)を計算する処理。 学習(Training)がモデルのパラメータをデータから最適化するフェーズであるのに対し、推論は学習済みで固定されたパラメータを使って実際にモデルを利用するフェーズを指す。 LLMの文脈では、プロンプトを受け取ってトークンを1つずつ生成していく処理全体を指すことが多く、推論で必要になる計算量・メモリ・レイテンシは、LLMをサービスとして提供する際のコストや応答速度に直結する重要な要素となる。 推論コストを抑える手法として、量子化によるモデル軽量化、バッチ推論によるGPU利用効率の向上、複数リクエストを効率よく捌く専用の推論サーバー(vLLM等)の利用などが広く実践されている。
背景
モデル開発では、学習と推論で求められる要件が大きく異なる。 学習は大量の計算資源と時間をかけて1回行えばよい一方、推論はユーザーからのリクエストのたびに繰り返し実行され、応答速度とコストの両立が求められる。 この違いから、推論を高速化・効率化するための専用の技術(KVキャッシュ、量子化、投機的デコーディング等)が数多く開発されてきた。
アーキテクチャ
LLMの推論は、入力プロンプトをトークン化しモデルへ入力する「プリフィル」フェーズと、そこから1トークンずつ生成を繰り返す「デコード」フェーズに大別される。 プリフィルは入力全体を並列処理できる一方、デコードは前のトークンの出力に依存する逐次処理となるため、KVキャッシュ等の最適化技術が重要となる。
ワークフロー
プロンプトをトークン化しモデルへ入力(プリフィル) → 各ステップで次トークンの確率分布を計算(デコード) → デコーディング戦略に従いトークンを選択 → 終了条件を満たすまで繰り返し出力を生成する。
コード例
Transformersライブラリでモデルの推論を実行する
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
inputs = tokenizer("推論とは", return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=50)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))利点
欠点
- 大規模モデルほど推論に必要な計算資源・メモリが大きく、サービング(提供)のコストが高くなる
- リクエストごとに実行されるため、わずかな非効率でも積み重なると運用コストに大きく影響する
- プリフィルとデコードで求められる最適化が異なり、両方を高速化するには専門的なチューニングが必要になる
比較
- ファインチューニング — ファインチューニングは学習フェーズの手法であり、推論はその学習済みモデルを利用するフェーズ
- KVキャッシュ — KVキャッシュは、推論(特にデコードフェーズ)を高速化する代表的な最適化技術
- 量子化 — 量子化は、推論時のメモリ使用量と計算コストを削減する代表的な手法
関連用語
よくある質問
学習と推論では、コストはどちらが大きい?
1回あたりの計算量は学習の方が圧倒的に大きいが、推論はサービス提供中に繰り返し実行されるため、運用期間全体で見た累積コストは推論側が大きくなることも多い。
推論を高速化する代表的な手法は?
KVキャッシュ・量子化・投機的デコーディング・連続バッチング等、複数の手法が組み合わせて使われる。