開発者は、何千もの個別のAPI呼び出しを送信する際に、応答時間の遅さと高いネットワークコストに悩まされることがよくあります。Batch APIは、複数の独立したリクエストを1つの操作にまとめることで、レイテンシ、帯域幅使用量、接続オーバーヘッドを削減します。
この記事では、Batch APIとは何か、標準APIとの違い、そしてNovita AIのBatch APIが構造化されたJSONL入力、効率的なファイル処理、信頼性の高いエラートラッキングを通じて大規模な非同期推論をどのように実現するかを説明します。また、コスト、レイテンシ、スループットなどの主要な効率要因を概説し、実装と監視に関する簡潔なガイドを提供します。
[50%オフでバッチ推論をお試しください
対応モデルで大規模予測をより速く、より安く実行:
qwen/qwen3-vl-235b-a22b-instruct, openai/gpt-oss-120b, deepseek/deepseek-r1-0528, qwen/qwen3-4b-fp8.](https://novita.ai/docs/guides/llm-batch-api)
50%オフでバッチ推論をお試しください
対応モデルで大規模予測をより速く、より安く実行:
qwen/qwen3-vl-235b-a22b-instruct, openai/gpt-oss-120b, deepseek/deepseek-r1-0528, qwen/qwen3-4b-f
Batch APIとは?
Batch API: 複数の独立したAPI呼び出し(GET、POST、PUT、DELETEなど)を1つのHTTPリクエストに結合します。
応答構造: サーバーはすべてのサブリクエストの結果を順番に返し、各リクエストの成功または失敗を示します。
Batch APIと標準APIの主な違い
通常のリクエスト
クライアント
├──► リクエスト 1 (/user/1)
│ └──► サーバー応答 1
├──► リクエスト 2 (/user/2)
│ └──► サーバー応答 2
└──► リクエスト 3 (/order)
└──► サーバー応答 3
バッチリクエスト
クライアント
└──► 単一リクエスト (/batch)
├─ サブリクエスト 1: GET /user/1
├─ サブリクエスト 2: GET /user/2
└─ サブリクエスト 3: POST /order
↓
サーバーがすべてを処理
↓
結合応答:
[結果1, 結果2, 結果3]
Batch APIの利点:
ネットワークレイテンシの削減 – 多数のリクエストを1つにまとめて送信することで実現。
帯域幅と接続オーバーヘッドの低減 – ヘッダーとハンドシェイクを共有。
クライアントパフォーマンスの向上 – 特にモバイルや低速ネットワークで効果的。
トランザクションロジックの簡素化 – 統一されたエラーハンドリングやロールバックが可能。
API Gatewayスループットの最適化 – リクエストの洪水を防止。
Batch APIの代表的なユースケース
| シナリオ | 説明 |
|---|---|
| 1. 一括データクエリ | 複数のユーザー、製品、投稿を一度に取得し、繰り返しのリクエストを回避。 |
| 2. 一括書き込みまたは更新 | 1回の操作で複数のレコードを作成・更新(例:一括アップロード、在庫更新)。 |
| 3. フロントエンドパフォーマンス最適化 | ブラウザやモバイルアプリからのHTTP呼び出し数を削減し、読み込み時間を短縮。 |
| 4. バックエンドタスク集約 | マイクロサービスシステムで、複数の内部API呼び出しを1つの外部呼び出しに統合。 |
| 5. データ同期 | 複数のリソース状態を同期、または一括操作(タグ付け、削除など)を実行。 |
| 6. レート制限の最適化 | リクエストを統合することでAPI Gatewayの負荷を軽減し、帯域幅を節約。 |
Batch APIの効率に影響する主な要因
バッチAPIはリアルタイムAPIと比較してどれくらいコストを節約できるか?
業界分析(Growth-onomics)によると、コスト削減は約20~45%とされています。これは主に、ネットワークラウンドトリップの減少、接続オーバーヘッドの低減、処理の集中によるものです。ただし、正確な節約額は呼び出し頻度、バッチサイズ、システム設計に依存します。
レイテンシについて – Batch APIは本当に「24時間以内」に終わるのか?
Batch APIは通常、非同期で実行されるため、リアルタイムAPIよりもはるかに高いレイテンシが発生します。多くのシステムは1時間ごとまたは1日ごとに実行するため、「24時間以内」はSLAに依存し、保証されるわけではありません。
バッチサイズやファイルサイズは速度に影響するか?
はい。バッチが大きくなる(例:JSONLの行数が多い)と、転送および解析時間がほぼ線形に増加します。スループットは向上しますが、バッチあたりの完了時間は増加します。
なぜBatch APIは高スループットのワークロードに適しているのか?
数千のリクエストを1つのプロセスに集約することで、呼び出しあたりのオーバーヘッドを削減し、並列実行やキャッシュの再利用を可能にします。大規模な運用ではスループットが17~92%向上することがありますが、その代償としてレイテンシが高くなります。
Batch APIの使い方
NovitaのBatch APIはOpenAIのインターフェースと高い互換性があり、
/v1/chat/completionsと/v1/completionsをサポートしているため、既存のコードを最小限の変更で再利用できます。入力ファイルは.jsonl形式で、各行が同じモデルに対する個別のリクエストを表し、一意のcustom_idで識別されます。出力もJSONL形式で、大規模な後処理、分析、統合が簡単かつ効率的に行えます。
1. バッチ入力ファイルの準備
.jsonl ファイルを作成します。各行が1つのAPIリクエストをJSON形式で表します。
例 (batch_input.jsonl):
{"custom_id": "req-1", "body": {"model": "deepseek/deepseek-v3-0324", "messages": [{"role": "user", "content": "Summarize: batch API basics"}], "max_tokens": 200}}
{"custom_id": "req-2", "body": {"model": "deepseek/deepseek-v3-0324", "messages": [{"role": "system", "content": "You are concise."},{"role": "user", "content": "List 3 batch API use cases"}], "max_tokens": 150}}
ルール:
- 1行に1リクエスト。
- すべてのリクエストは同じモデルを使用する必要があります。
- 各行に一意の
custom_idを含める必要があります。
2. 入力ファイルをアップロードし、バッチを作成
Pythonまたはcurlを使用してファイルをアップロードし、すぐにバッチジョブを開始します。
Python
from openai import OpenAI
client = OpenAI(base_url="https://api.novita.ai/openai/v1", api_key="YOUR_API_KEY")
# Upload + create batch
uploaded = client.files.create(file=open("batch_input.jsonl", "rb"), purpose="batch")
batch = client.batches.create(
input_file_id=uploaded.id,
endpoint="/v1/chat/completions",
completion_window="48h"
)
print("file_id:", uploaded.id)
print("batch_id:", batch.id)
curl
export API_KEY="YOUR_API_KEY"
# Upload file
upload_response=$(curl -s -X POST \
-H "Authorization: Bearer ${API_KEY}" \
-F 'file=@batch_input.jsonl' -F 'purpose=batch' \
https://api.novita.ai/openai/v1/files)
# Extract file_id and start batch
file_id=$(echo $upload_response | jq -r '.id')
curl -X POST https://api.novita.ai/openai/v1/batches \
-H "Authorization: Bearer ${API_KEY}" \
-H "Content-Type: application/json" \
-d "{\"input_file_id\": \"$file_id\", \"endpoint\": \"/v1/chat/completions\", \"completion_window\": \"48h\"}"
3. バッチステータスの確認
バッチIDを使用していつでも進行状況を確認できます。
batch = client.batches.retrieve("batch_xxx")
print(batch.status)
ステータスは以下の通りです:
VALIDATING– 入力ファイルをチェック中PROGRESS– 実行中COMPLETED– 正常終了FAILED– 失敗EXPIRED– 48時間のウィンドウを超過
4. 結果の取得
完了したら、output_file_id を使用して結果ファイルをダウンロードします。
output = client.files.content("file_xxx")
print(output.read().decode("utf-8"))
出力の各行は入力の各行に対応し、custom_id で照合されます。
ヒント:
対応モデルは
deepseek/deepseek-r1-0528のみ1バッチあたり最大 50,000リクエスト
入力ファイルは 100MB以下
完了ウィンドウは固定で 48時間
出力は 30日間 保持
バッチAPIで失敗したリクエストはどのように処理すべきか?
バッチ処理中に発生したエラーは、別の エラーファイル に記録され、error_file_id フィールドでアクセスできます。失敗した各サブリクエストには、エラーコードと説明が含まれます。一般的な例:
| エラーコード | 説明 | 解決策 |
|---|---|---|
| 400 | リクエスト形式が無効 | JSONLの構文と必須フィールドを確認 |
| 401 | 認証に失敗 | APIキーを確認 |
| 404 | バッチが見つからない | バッチIDを確認 |
| 429 | レート制限を超過 | リクエスト頻度を下げる |
| 500 | サーバーエラー | プロバイダに連絡するか、後で再試行 |
開発者は、失敗したエントリのみを再処理するため、リトライキューまたはより小さなフォローアップバッチを使用し、元のファイル全体を再送信しないようにする必要があります。
Novita AIが提供するバッチAPI操作用エンドポイント
| エンドポイント | 目的 |
|---|---|
| バッチ作成 | 複数のリクエストを含む新しいバッチジョブを送信。 |
| バッチ取得 | バッチIDで特定のバッチのステータスまたは結果を取得。 |
| バッチキャンセル | 実行中のバッチジョブを完了前に停止。 |
| バッチ一覧 | アカウントに送信されたすべてのバッチジョブを一覧表示。 |
| ファイルアップロード | 入力データファイル(例:JSONL)をアップロード。 |
| ファイル一覧 | アップロードされたすべてのファイルを表示。 |
| ファイル取得 | ファイルIDでファイルのメタデータを取得。 |
| ファイル削除 | アップロードされたファイルを削除。 |
| ファイル内容取得 | ファイルの実際の内容(結果やエラーログなど)をダウンロード。 |
Batch APIは、多数の小さなリクエストを1つの効率的なワークフローに統合します。Novita AIのBatch APIを利用することで、開発者はネットワークコストを最大45%削減し、1バッチあたり最大50,000リクエストのスループットを実現し、組み込みのログ記録と取得エンドポイントによってエラー処理を簡素化できます。リアルタイムの速度は犠牲になりますが、一括推論、同期、データ処理のワークロードにおいて卓越した効率を発揮します。
Novita AI は、開発者がシンプルなAPIを使用してAIモデルを簡単にデプロイできると同時に、手頃な価格で信頼性の高いGPUクラウドを提供するAIクラウドプラットフォームです。
