バッチ推論とは
Batch Inference
複数の推論リクエストをまとめて処理し、GPUの利用効率とスループットを高める手法
ひとことで言うと
複数の質問をまとめて処理し、コンピュータの計算効率を上げる方法。
概要
バッチ推論(Batch Inference)とは、複数の推論リクエストを1つにまとめ(バッチ化し)、GPU上でまとめて処理することで、単位時間あたりに処理できるリクエスト数(スループット)を高める手法。 GPUは多数の演算を並列に実行することを得意とするため、リクエストを1件ずつ処理するより、複数件をまとめて1回の演算にまとめた方がGPUの計算資源を効率的に利用できる。 リアルタイム性が求められないバッチ処理的な用途(大量データの一括要約・分類等)で特に有効に使われる。 一方でバッチをまとめる待機時間が発生するため個々のリクエストの応答速度(レイテンシ)は犠牲になりやすく、即時応答が必要なチャット用途とはトレードオフの関係にある。
背景
LLMの推論はGPU上での行列演算が中心であり、1件のリクエストだけではGPUの並列計算能力を使い切れず遊休状態になりやすい。 バッチ推論は、複数のリクエストをまとめて1回の演算にすることでこの遊休を減らしGPU利用効率を高めるために採用されている。
アーキテクチャ
複数の入力系列をまとめて1つの行列として扱い、GPU上で並列に演算する。 入力系列の長さが異なる場合は、短い系列をパディング(埋め草)して長さを揃える必要があり、バッチ内の系列長のばらつきが大きいと無駄な計算が発生する。 オンラインサービスでは、一定時間内に届いた複数のリクエストを動的にバッチへまとめる「動的バッチング」も用いられる。
ワークフロー
複数の入力リクエストを収集しバッチとしてまとめる → 系列長が異なる場合はパディングを施して揃える → GPU上で1回の演算としてまとめて処理 → 各リクエストへ個別の出力を振り分けて返す。
コード例
複数プロンプトをバッチにまとめて推論する
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
tokenizer.pad_token = tokenizer.eos_token
model = AutoModelForCausalLM.from_pretrained("gpt2")
prompts = ["こんにちは、", "今日の天気は", "AIとは"]
inputs = tokenizer(prompts, return_tensors="pt", padding=True)
outputs = model.generate(**inputs, max_new_tokens=20)
for output in outputs:
print(tokenizer.decode(output, skip_special_tokens=True))利点
欠点
- 個々のリクエストはバッチが揃うまで待たされることがあり、リアルタイム性が求められる用途には不向き
- 系列長にばらつきがあると、パディングによる無駄な計算が発生しやすい
- バッチが揃うまでリクエストを待たせる設計のため、早く届いたリクエストほどレイテンシの面で不利になりやすい
比較
関連用語
よくある質問
バッチ推論はチャットのようなリアルタイム用途にも使える?
バッチサイズや待機時間を小さく抑えた動的バッチングを使えば、レイテンシへの影響を抑えつつスループットを高めることも可能だが、純粋なリアルタイム性とはトレードオフになる。
バッチサイズは大きいほど良い?
スループットは向上しやすいが、GPUメモリの上限や個々のリクエストのレイテンシとのトレードオフがあり、要件に応じた調整が必要。