AI・機械学習
上級

LLMバッチ処理(バッチ推論)(エルエルエムバッチショリ(バッチスイロン))

LLMバッチ処理(バッチ推論)とは、大規模言語モデルに対する複数の推論リクエストをまとめて一括処理する技術である。個別リクエストを逐次処理するオンライン推論と異なり、リクエストをキューに蓄積してGPUの並列計算能力を最大限に活用することで、スループットの大幅な向上とコスト削減を実現する。AnthropicやOpenAIが提供するBatch APIでは最大50%のコスト削減が可能であり、大量データの分類・要約・翻訳などの非リアルタイム処理に広く活用されている。

0 回閲覧
0 いいね

LLMバッチ処理の概要

LLMバッチ処理(Batch Inference)は、大規模言語モデル(LLM)への推論リクエストを個別に処理するのではなく、複数のリクエストをまとめてGPUに投入し一括で推論する技術である。リアルタイム応答が不要なユースケースにおいて、GPUの計算リソースを効率的に活用し、推論コストを大幅に削減できる。

オンライン推論(リアルタイム推論)では、ユーザーからのリクエストが到着するたびに即座にモデルを実行して結果を返す。一方、バッチ推論では数百から数百万のリクエストをキューに蓄積し、GPUのSIMD(Single Instruction, Multiple Data)アーキテクチャを活かして並列実行する。この違いにより、バッチ推論はオンライン推論と比較してスループットが5〜20倍向上し、リクエストあたりのコストは50〜80%削減される。

バッチ処理が特に有効なユースケースには、大規模コーパスの文書要約、多言語翻訳、感情分析・分類タスク、データセットのアノテーション、合成データ生成などがある。これらはレイテンシ要件が緩く、スループットとコスト効率が重視される。

オンライン推論とバッチ推論の比較

リアルタイム推論とバッチ推論の特性を理解することは、適切なアーキテクチャ選定の基盤となる。

比較項目オンライン推論バッチ推論
レイテンシ低い(100ms〜数秒)高い(分〜時間単位)
スループット低い(GPU利用率30〜60%)高い(GPU利用率80〜95%)
コスト効率低い(アイドル時間が多い)高い(リソース利用を最大化)
スケーリングオートスケール必須固定リソースで予測可能
適用場面チャットbot、リアルタイム翻訳データパイプライン、分析
SLAp99レイテンシ保証完了時間のSLA
エラー処理即座にリトライバッチ単位でリトライ可能
GPU利用効率低い(リクエスト間にアイドル)高い(連続的にGPU占有)

バッチ推論の最大の利点は、GPUのアイドル時間を最小化できることにある。オンライン推論ではリクエスト間の待ち時間にGPUが遊んでしまうが、バッチ推論では常に次のリクエストが待機しているため、GPU利用率を90%以上に維持できる。

バッチ処理の主要技術

LLMバッチ処理を支える技術スタックは、サービングエンジン、バッチングアルゴリズム、メモリ管理の3層で構成される。

サービングエンジン

現在主流のLLMサービングエンジンは以下の通りである。

エンジン開発元バッチ方式主な特徴
vLLMUC BerkeleyContinuous BatchingPagedAttention、高スループット
TGIHugging FaceContinuous BatchingFlash Attention、Rust実装
TensorRT-LLMNVIDIAInflight BatchingTensorRTカーネル最適化
Triton Inference ServerNVIDIADynamic Batchingマルチモデル対応
SGLangStanfordRadixAttentionプログラマブルなバッチ制御

バッチングアルゴリズム

バッチングの方式には大きく3つのアプローチがある。

  • Static Batching: 固定サイズのバッチを構成し、全リクエストの生成が完了するまで待機する。最も単純だが、短いリクエストが長いリクエストの完了を待つ「バッチ内ストラグラー問題」が発生する
  • Dynamic Batching: リクエストの到着パターンに応じてバッチサイズを動的に調整する。Triton Inference Serverが代表的な実装で、最大バッチサイズと最大待機時間をパラメータとして制御する
  • Continuous Batching: イテレーションレベルでリクエストの追加・完了を管理し、GPUを常にフル稼働させる。vLLMとTGIが採用しており、現在最も効率的なバッチング方式である

メモリ管理

LLMのバッチ推論においてKVキャッシュのメモリ管理は最大のボトルネックとなる。PagedAttention(vLLM)は仮想メモリのページング機構をKVキャッシュに適用し、メモリの断片化を解消した画期的な手法である。従来の連続メモリ割り当てでは、最大シーケンス長分のメモリを事前に確保する必要があり、実際の使用率は20〜40%に留まっていた。PagedAttentionにより、メモリ利用効率は90%以上に改善された。

クラウドプロバイダのBatch API

主要なLLMプロバイダが提供するBatch APIは、バッチ推論をマネージドサービスとして利用できる手段である。

プロバイダAPI名コスト削減最大リクエスト数完了時間SLA
AnthropicMessage Batches API50%100,000/バッチ24時間以内
OpenAIBatch API50%50,000/バッチ24時間以内
GoogleVertex AI Batch Prediction30〜50%カスタムカスタム
AWSBedrock Batch Inference変動カスタムカスタム

Anthropic Message Batches APIの利用手順は以下の通りである。

  1. JSONL形式でリクエストファイルを作成(各行にcustom_id、params(model、max_tokens、messages)を記述)
  2. /v1/messages/batches エンドポイントにPOSTでバッチを作成
  3. バッチIDを用いてステータスをポーリングまたはWebhookで完了通知を受信
  4. 完了後、結果をJSONLで取得(各行にcustom_id、result(type、message)が含まれる)

OpenAI Batch APIも同様のワークフローで、.jsonlファイルをアップロードし、/v1/batchesエンドポイントでバッチジョブを作成する。いずれも通常のAPI料金の50%で利用可能であり、24時間以内の完了が保証される。

バッチ処理のアーキテクチャパターン

大規模バッチ処理システムの設計にはいくつかの定番パターンがある。

プロデューサー・コンシューマーパターン

メッセージキュー(Redis Queue、Amazon SQS、Apache Kafka)を介してリクエストを蓄積し、ワーカープロセスがバッチ単位で消費する。プロデューサーとコンシューマーの分離により、負荷変動への対応が容易になる。

マップ・リデュースパターン

大量のドキュメントを分割(Map)し、各チャンクに対して並列にLLM推論を実行した後、結果を集約(Reduce)する。文書要約やデータ抽出のパイプラインで広く使われる。

優先度付きキューパターン

リクエストに優先度を付与し、高優先度のリクエストを低レイテンシで処理しつつ、低優先度のリクエストはバッチにまとめてコスト効率重視で処理する。SLAの異なる複数のクライアントを単一のインフラで処理する場合に有効である。

パフォーマンスチューニング

バッチ推論のパフォーマンスを最適化するための主要パラメータを以下にまとめる。

パラメータ説明推奨値影響
max_batch_size同時処理リクエスト数GPU VRAM依存(8〜256)スループット↑、レイテンシ↑
max_waiting_tokensバッチ構成の待機トークン数20〜100バッチ効率↑、初回レイテンシ↑
max_input_length入力の最大トークン長モデル依存メモリ使用量に直結
max_total_tokens入出力合計の最大トークン長モデル依存KVキャッシュサイズに直結
gpu_memory_utilizationGPU VRAM使用率上限0.85〜0.95OOM回避とスループットのバランス
tensor_parallel_sizeテンソル並列度GPU数に合わせる大型モデルの分散推論

バッチサイズの最適化は、GPU VRAMとモデルサイズの関係から決定される。例えばLlama 3.1 70Bモデル(FP16)をA100 80GB×4で実行する場合、テンソル並列度4でモデルが約140GBのVRAMを占有し、残りの約180GBがKVキャッシュに充当される。4096トークンのシーケンスでは、1リクエストあたり約1.3GBのKVキャッシュが必要となるため、最大バッチサイズは約128〜140程度が目安となる。

よくある質問(FAQ)

Q1: バッチ推論はどのようなユースケースに適していますか?

バッチ推論は、リアルタイム応答が不要で大量のリクエストを処理する必要がある場合に最適である。具体的には、大規模データセットの分類・ラベリング、文書の一括要約、多言語翻訳パイプライン、合成データ生成、定期的なレポート生成、RAG用のドキュメント前処理(チャンク分割・埋め込み生成)などが代表的なユースケースである。24時間以内の完了で許容される処理であれば、クラウドプロバイダのBatch APIを使うことで50%のコスト削減が見込める。

Q2: バッチサイズはどのように決定すればよいですか?

バッチサイズの決定にはGPU VRAM容量、モデルサイズ、入出力トークン長の3要素を考慮する必要がある。まずモデルの重みが占有するVRAM量を算出し(パラメータ数×データ型のバイト数)、残りのVRAMからKVキャッシュに割り当て可能な容量を計算する。1リクエストあたりのKVキャッシュサイズは「レイヤー数×2(Key+Value)×ヘッド数×ヘッド次元×シーケンス長×データ型バイト数」で求められる。実際にはPagedAttentionのオーバーヘッドや活性化メモリも考慮し、gpu_memory_utilizationを0.90程度に設定して安全マージンを確保するのが一般的である。

Q3: Static BatchingとContinuous Batchingの性能差はどの程度ですか?

Continuous BatchingはStatic Batchingと比較して、スループットが2〜8倍向上することが実験的に確認されている。この差はリクエストの生成長のばらつきが大きいほど顕著になる。Static Batchingではバッチ内の最も長い生成が完了するまで全リクエストがGPUを占有し続けるため、短い生成のリクエストが終了後もGPUリソースが無駄になる。Continuous Batchingではイテレーション単位で完了したリクエストを解放し新しいリクエストを投入できるため、GPU利用率を常に高く維持できる。vLLMの論文では、同一ハードウェアでStatic Batchingの最大23倍のスループットを達成した事例が報告されている。

Q4: バッチ推論でエラーが発生した場合のリトライ戦略は?

バッチ推論のエラー処理は、エラーの種類に応じて戦略を分ける。OOM(Out of Memory)エラーはバッチサイズを縮小してリトライする。タイムアウトエラーはmax_tokensを確認し、必要に応じて入力を短縮する。APIレートリミットエラーは指数バックオフでリトライする。Anthropic Message Batches APIでは、バッチ内の個別リクエストが失敗しても他のリクエストは正常に処理される。失敗したリクエストのみを新しいバッチとして再送信する「部分リトライ」パターンが推奨される。