Azure OpenAI Service の Batch API 要点まとめ
はじめに
Microsoft Build 2024 で発表された Azure OpenAI Service の Batch API のプレビューが開始しましたので、関連情報へのリンクと合わせて要点をまとめました。
Batch API
Azure OpenAI Service の Batch API とは
Batch API は本家 OpenAI の Batch API に相当する機能です。リアルタイムでのレスポンスを必要としないユースケース (後述) において、プロンプトを 1 つのファイルにまとめてアップロードすることで 24 時間以内を目標に処理結果を返してくれます。Batch API には独立したクォータが設定されており、それ以外のリアルタイム用途に影響を与えずに処理を行うことができます。また、Global standard
デプロイと比べて 50% 安い価格設定がされています。
参考
- Announcing Azure OpenAI Global Batch Offering: Efficient processing at scale with 50% less cost
- Batch API (本家 OpenAI)
- Azure OpenAI のデプロイの種類
主な利用シナリオ
Azure OpenAI Service の公式ドキュメントによると、Batch API は例えば以下のような利用シナリオに向いているとされています。
- Large-Scale Data Processing: Quickly analyze extensive datasets in parallel. (大規模データ処理: 膨大なデータセットを迅速に並列処理する)
- Content Generation: Create large volumes of text, such as product descriptions or articles. (コンテンツ生成: 商品説明や記事などにおいて大量のテキストを作成する)
- Document Review and Summarization: Automate the review and summarization of lengthy documents. (ドキュメントのレビューと要約: 長い文書のレビューや要約を自動化する)
- Customer Support Automation: Handle numerous queries simultaneously for faster responses. (カスタマーサポートの自動化: 多数の問い合わせを同時に処理し、迅速な対応を実現する)
- Data Extraction and Analysis: Extract and analyze information from vast amounts of unstructured data. (データ抽出と分析: 膨大な非構造化データから情報を抽出して分析する)
- Natural Language Processing (NLP) Tasks: Perform tasks like sentiment analysis or translation on large datasets. (自然言語処理タスク: 大規模なデータセットに対して感情分析や翻訳などのタスクを実行する)
- Marketing and Personalization: Generate personalized content and recommendations at scale. (マーケティングとパーソナライゼーション: パーソナライズされたコンテンツやレコメンデーションを大規模に生成する)
参考
リージョン
執筆時点 (API 公開時点) で以下の 3 リージョンが対応しています。名前から推測すると既存の Global standard
と似た形式で処理を行うものと思われます。そのため、いずれかのリージョンにデプロイを作成しますが、実際の処理はユーザーからのリクエスト時の各リージョンの状況に応じてルーティングが行われて、いずれかのリージョンで処理が実行されるようです。
- East US
- West US
- Sweden Central
参考
モデルと API バージョン
執筆時点 (API 公開時点) で以下のモデルが対応しています。API バージョンは 2024-07-01-preview
のみ対応しています。
なお、GPT-4o mini
ついては "comming soon" とのことです。
参考
- Region and model support
- API Versions
- Announcing Azure OpenAI Global Batch Offering: Efficient processing at scale with 50% less cost
クォータ
前述のとおり Batch API には専用のクォータが設定されています。Batch API のクォータは処理キューに投入されている (エンキューされる) 実行中ジョブのトークンの合計です。ジョブのリクエスト時にアップロードしたファイルはトークン数が計算され、そのジョブが終了するまでの間消費しているクォータとして計算されます。なお、割り当てられるクォータは Azure の購入方法により異なります。
Quota values for global batch are represented in terms of enqueued tokens. When you submit a file for batch processing the number of tokens present in the file are counted. Until the batch job reaches a terminal state, those tokens will count against your total enqueued token limit.
参考
価格
価格は Global standard
デプロイの半額です。価格ページに明記されていませんが、gpt-35-turbo
には Global standard
デプロイの選択肢がありませんので、おそらく Standard
デプロイの半額であると思われます。
50% less cost than global standard
参考
使い方
特に難しい点は無く公式ドキュメントの How-to の手順に沿って実行できます。以下の 3 とおりの実行方法があります。本記事では AI Studio の手順に沿って要点を補足します。
- Azure AI Studio
- Python (
openai
ライブラリ) - REST
参考
-
Getting started with Azure OpenAI global batch deployments (preview) - AI Studio
Getting started with Azure OpenAI global batch deployments (preview) - Python
Getting started with Azure OpenAI global batch deployments (preview) - REST
デプロイ
事前に Batch API 用のデプロイを行う必要があります。デプロイの種類で グローバル バッチ (Global-Batch)
を選択します。デプロイ名はリクエスト時に使用するため控えておきます。
参考
入力ファイルの作成
Batch API では、実行するプロンプトを 1 つの jsonl
ファイルにまとめて記載します。この jsonl
ファイルには以下のフィールドを含める必要があります。
-
custom_id
: ファイル内における任意のリクエスト ID -
method
:POST
(固定値) -
url
:/chat/completions
(固定値) -
body
-
model
: デプロイ名 -
messages
: Chat Completion 形式で記載したプロンプト
-
公式ドキュメント中にエンコーディングの指定はありませんでした。本記事執筆時には UTF-8
で確認を行いました。
テキスト入力のみの例
1 行 1 リクエストで記載します。テキストのみの入力の場合は以下のように記載します。(3 件のリクエスト)
{"custom_id": "task-0", "method": "POST", "url": "/chat/completions", "body": {"model": "<YOUR-MODEL-DEPLOYMENT-NAME>", "messages": [{"role": "system", "content": "あなたは、人々が情報を見つけるのを助けるAIアシスタントです。"}, {"role": "user", "content": "マイクロソフトが設立されたのはいつですか?"}]}}
{"custom_id": "task-1", "method": "POST", "url": "/chat/completions", "body": {"model": "<YOUR-MODEL-DEPLOYMENT-NAME>", "messages": [{"role": "system", "content": "あなたは、人々が情報を見つけるのを助けるAIアシスタントです。"}, {"role": "user", "content": "初代XBOXが発売されたのはいつですか?"}]}}
{"custom_id": "task-2", "method": "POST", "url": "/chat/completions", "body": {"model": "<YOUR-MODEL-DEPLOYMENT-NAME>", "messages": [{"role": "system", "content": "あなたは、人々が情報を見つけるのを助けるAIアシスタントです。"}, {"role": "user", "content": "Altair BASICとは何ですか?"}]}}
テキスト+画像入力 (Base64 エンコーディング) の例
マルチモーダルモデルに画像を入力する場合は 2 とおりの入力方法があります。1 つは画像を Base64 フォーマットに変換して入力する方法です。テキストのみの場合と同じく 1 行 1 リクエストで記載します。
{"custom_id": "request-1", "method": "POST", "url": "/chat/completions", "body": {"model": "<YOUR-MODEL-DEPLOYMENT-NAME>", "messages": [{"role": "system", "content": "あなたは役に立つアシスタントです。"},{"role": "user", "content": [{"type":"text","text":"この画像を説明してください:"},{"type":"image_url","image_url":{"url":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII="}}]}],"max_tokens": 1000}}
テキスト+画像入力 (URL 指定) の例
もう 1 つは画像の URL を指定する方法です。テキストのみの場合と同じく 1 行 1 リクエストで記載します。
{"custom_id": "request-1", "method": "POST", "url": "/chat/completions", "body": {"model": "<YOUR-MODEL-DEPLOYMENT-NAME>", "messages": [{"role": "system", "content": "あなたは役に立つアシスタントです。"},{"role": "user", "content": [{"type": "text", "text": "この画像を説明してください:"},{"type": "image_url","image_url": {"url": "https://raw.githubusercontent.com/MicrosoftDocs/azure-docs/main/articles/ai-services/openai/media/how-to/generated-seattle.png"}}]}],"max_tokens": 1000}}
参考
ファイルのアップロードとジョブの実行
Azure AI Studio から jsonl
ファイルのアップロードとジョブの実行を行います。本記事執筆時の検証 (3 リクエスト) では 10 分程度で完了しました。
参考
結果の取得
処理が完了したら結果の jsonl
ファイルをダウンロードします。
以下は結果の例です。内部的に分散処理をしている都合なのか、リクエストとは順番が異なる場合があります。リクエスト時に リクエスト ID を指定するのはこのためだと思われます。
{"custom_id": "task-1", "response": {"body": {"choices": [{"content_filter_results": {"hate": {"filtered": false, "severity": "safe"}, "self_harm": {"filtered": false, "severity": "safe"}, "sexual": {"filtered": false, "severity": "safe"}, "violence": {"filtered": false, "severity": "safe"}}, "finish_reason": "stop", "index": 0, "logprobs": null, "message": {"content": "初代Xboxは、2001年11月15日にアメリカで発売されました。", "role": "assistant"}}], "created": 1723016113, "id": "chatcmpl-9tVUP4jPDZpSmlx5ARAOgmAJwwEhB", "model": "gpt-4o-2024-05-13", "object": "chat.completion", "prompt_filter_results": [{"prompt_index": 0, "content_filter_results": {"hate": {"filtered": false, "severity": "safe"}, "jailbreak": {"filtered": false, "detected": false}, "self_harm": {"filtered": false, "severity": "safe"}, "sexual": {"filtered": false, "severity": "safe"}, "violence": {"filtered": false, "severity": "safe"}}}], "system_fingerprint": "fp_f5a70d8dc9", "usage": {"completion_tokens": 20, "prompt_tokens": 47, "total_tokens": 67}}, "request_id": "672e1909-c9dc-4d63-b67e-b6ed7e6a9cce", "status_code": 200}, "error": null}
{"custom_id": "task-0", "response": {"body": {"choices": [{"content_filter_results": {"hate": {"filtered": false, "severity": "safe"}, "self_harm": {"filtered": false, "severity": "safe"}, "sexual": {"filtered": false, "severity": "safe"}, "violence": {"filtered": false, "severity": "safe"}}, "finish_reason": "stop", "index": 0, "logprobs": null, "message": {"content": "マイクロソフト(Microsoft)は、1975年4月4日にビル・ゲイツ(Bill Gates)とポール・アレン(Paul Allen)によって設立されました。", "role": "assistant"}}], "created": 1723016113, "id": "chatcmpl-9tVUPGDAplxxCIFw4PIFTIDC1i61G", "model": "gpt-4o-2024-05-13", "object": "chat.completion", "prompt_filter_results": [{"prompt_index": 0, "content_filter_results": {"hate": {"filtered": false, "severity": "safe"}, "jailbreak": {"filtered": false, "detected": false}, "self_harm": {"filtered": false, "severity": "safe"}, "sexual": {"filtered": false, "severity": "safe"}, "violence": {"filtered": false, "severity": "safe"}}}], "system_fingerprint": "fp_f5a70d8dc9", "usage": {"completion_tokens": 43, "prompt_tokens": 49, "total_tokens": 92}}, "request_id": "5170b45c-0859-4e0b-bd20-b34216d99a87", "status_code": 200}, "error": null}
{"custom_id": "task-2", "response": {"body": {"choices": [{"content_filter_results": {"hate": {"filtered": false, "severity": "safe"}, "self_harm": {"filtered": false, "severity": "safe"}, "sexual": {"filtered": false, "severity": "safe"}, "violence": {"filtered": false, "severity": "safe"}}, "finish_reason": "stop", "index": 0, "logprobs": null, "message": {"content": "Altair BASICは、1970年代にマイクロソフト(当時はMicro-Softと表記)によって開発・販売された、Altair 8800というマイクロコンピュータ向けのBASICインタープリタです。Altair 8800は、初期のパーソナルコンピュータとして広く認識されており、このBASICインタープリタはコンピュータ上でプログラムを簡単に作成し、実行する手段を提供しました。\n\nAltair BASICの開発は、ビル・ゲイツとポール・アレンによって行われました。この製品は、マイクロソフトの最初の商業製品であり、同社の設立と成功の基礎となるものでした。Altair BASICは、当時のコンピュータ愛好者やホビイストにとって非常に重要なツールであり、パーソナルコンピュータの普及に大きな影響を与えました。", "role": "assistant"}}], "created": 1723016113, "id": "chatcmpl-9tVUPHCvnvDngN91K0CNkZjjHpRsH", "model": "gpt-4o-2024-05-13", "object": "chat.completion", "prompt_filter_results": [{"prompt_index": 0, "content_filter_results": {"hate": {"filtered": false, "severity": "safe"}, "jailbreak": {"filtered": false, "detected": false}, "self_harm": {"filtered": false, "severity": "safe"}, "sexual": {"filtered": false, "severity": "safe"}, "violence": {"filtered": false, "severity": "safe"}}}], "system_fingerprint": "fp_f5a70d8dc9", "usage": {"completion_tokens": 237, "prompt_tokens": 42, "total_tokens": 279}}, "request_id": "a7e58d7a-3681-429f-b2e1-e799d5f3ab41", "status_code": 200}, "error": null}
参考
[補足] 制限
Batch API で入力するファイルには以下の制限が存在します。
- リソースごとにアップロードできる最大ファイル数: 500
- 最大ファイルサイズ: 200 MB
- 1 ファイル内の最大リクエスト数: 100,000
参考
[補足] 処理時間が 24 時間を超えた場合
Batch API は 24 時間以内を目標に処理を行います。場合によっては処理時間が 24 時間を超えることもありえますが、その場合も未完了のリクエストが打ち切られることはないとされています。また、処理は途中でキャンセルが可能で、キャンセルを行った場合はそれまでに完了した結果が返されるとのことです。
We aim to process batch requests within 24 hours; we do not expire the jobs that take longer. You can cancel the job anytime. When you cancel the job, any remaining work is cancelled and any already completed work is returned. You will be charged for any completed work.
参考
[補足] トラブルシューティング
トラブルシューティングガイドやエラーコードは下記に記載されています。
参考
おわりに
Batch API の登場で、今後はリアルタイム性を求められない利用シナリオにおけるコストの最適化ができそうです。
以上です。🍵
Discussion