背景・目的
自分が関わる業務のユースケースから、Bedrockのバッチ推論のほうが適していると感じたため
簡単に特徴を整理し、試します。
まとめ
下記に特徴を整理します。
特徴 | 説明 |
---|---|
バッチ推論 | 複数のプロントを送信し、非同期で応答を生成できる バッチ推論を使用すると、大規模なデータセットでのモデル推論のパフォーマンスを向上させることが可能 |
ユースケース | 単一のリクエストを送信し、S3バケットに応答を生成することで、大量のリクエストを効率的に処理するのに役立つ |
流れ | 1. 作成したファイルでモデル入力を定義し、そのファイルをS3にアップロードする 2. バッチ推論リクエストを送信し、S3バケットを指定する 3. ジョブが完了したらS3から出力ファイルを取得できる |
料金 | バッチ推論は、オンデマンド推論の50%の料金で使用できる |
入力ファイル | jsonlフォーマット。 recordIdとmodelInputのフィールドを持つ |
概要
下記を基に整理します。
バッチ推論を使用すると、複数のプロンプトを送信し、非同期で応答を生成できます。バッチ推論は、単一のリクエストを送信し、Amazon S3 バケットに応答を生成することで、大量のリクエストを効率的に処理するのに役立ちます。作成したファイルでモデル入力を定義したら、そのファイルを S3 バケットにアップロードします。次に、バッチ推論リクエストを送信し、S3 バケットを指定します。ジョブが完了したら、S3 から出力ファイルを取得できます。バッチ推論を使用すると、大規模なデータセットでのモデル推論のパフォーマンスを向上させることができます。
- 複数のプロントを送信し、非同期で応答を生成できる
- バッチ推論は、単一のリクエストを送信し、S3バケットに応答を生成することで、大量のリクエストを効率的に処理するのに役立つ
- バッチ推論を使用すると、大規模なデータセットでのモデル推論のパフォーマンスを向上させることが可能
- 簡単な流れ
- 作成したファイルでモデル入力を定義し、そのファイルをS3にアップロードする
- バッチ推論リクエストを送信し、S3バケットを指定する
- ジョブが完了したらS3から出力ファイルを取得できる
料金
下記を基に整理します。
https://aws.amazon.com/jp/bedrock/pricing/
オンデマンドとバッチ
オンデマンドモードでは、使用した分のみのお支払いとなり、時間ベースの契約はありません。テキスト生成モデルでは、入力トークンの処理および出力トークンの生成ごとに課金されます。埋め込みモデルでは、入力トークンの処理ごとに課金されます。トークンは数文字で構成されており、ユーザー入力と、結果を生成するためのプロンプトを理解するためにモデルが学習する基本単位です。画像生成モデルでは、生成されたすべての画像について課金されます。クロスリージョン推論: オンデマンドモードは、一部のモデルのクロスリージョン推論もサポートしています。これにより、デベロッパーはさまざまな AWS リージョンでコンピューティングを活用してトラフィックバーストをシームレスに管理し、より高いスループット制限と強化された回復力を活用できます。クロスリージョン推論の使用には追加料金は発生せず、料金はリクエストを実行したリージョン (ソースリージョン) に基づいて計算されます。
- オンデマンド
- 使用した分の支払い
- テキスト生成では、入力トークンの処理、出力トークンの生成ごとに課金
- 埋め込みモデルでは、入力トークンの処理ごと
- 画像生成でモルでは、生成されたすべての画像について課金
- クロスリージョン推論
- 一部のクロスリージョン推論もサポートしている
- 様々なリージョンでコンピューティングを活用してトラフィックバーストをシームレスに管理し、より高いスループット制限と強化された回復力を活用できる
- 追加料金はかからない。実行したリージョンに基づいて計算される
バッチモードでは、一連のプロンプトを単一の入力ファイルとして提供し、応答を単一の出力ファイルとして受け取ることができるため、大規模な予測を同時に取得できます。レスポンスは処理され、Amazon S3 バケットに保存されるため、後でアクセスできます。Amazon Bedrock は、Anthropic、Meta、Mistral AI、Amazon などの主要な AI プロバイダーから提供される厳選した基盤モデル (FM) を、オンデマンド推論料金と比較して 50% 低い料金でバッチ推論のために提供しています。こちらのモデルリストをご覧ください。
- 大規模な予測を同時に取得できる
- レスポンスは処理され、Amazon S3 バケットに保存されるため、後でアクセスでる
- 主要なAIプロバイダーから提供されるFMをオンデマンド推論と比較して50%低い料金でバッチ推論のために提供している
バッチ推論の入力ファイル
下記を基に整理します。
下記の形式の.jsonl(JSONLine)を作成する
{ "recordId" : "11 character alphanumeric string", "modelInput" : {JSON body} }
...
- 各行には、下記が必要
- recordId
- modelInput:送信する入力のリクエスト本文を含むフィールドを含むJSONオブジェクト
Anthropic Claude 3 Haikuのバッチ推論の例
{
"recordId": "CALL0000001",
"modelInput": {
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "text",
"text": "Summarize the following call transcript: ..."
}
]
}
]
}
}
実践
前提
モデルのリクエスト
事前にモデルが利用できるようにします。
-
Bedrockに移動します
-
EULAを読みます
-
対象のモデルにチェックを付けて、「次へ」をクリックします(今回は、Claude 3.5 Sonnet)を利用します
-
ユースケースの詳細を入力し、「次へ」をクリックします
-
最後に、「送信」をクリックします
バッチ推論に必要な権限
下記を元に試します。
- IAMに移動します
- ナビゲーションペインで「ロール」をクリックします
- 「ロールの作成」をクリックします
- 信頼されたエンティティでは、「作成カスタム信頼ポリシー」を選択します
- 下記の信頼ポリシーには下記を指定し、「次へ」をクリックします
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Statement1", "Effect": "Allow", "Principal": { "Service": "bedrock.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
- 許可を追加で「AmazonBedrockFullAccess」をアタッチします
- ロール名を指定して、「作成」をクリックします
Format and upload your batch inference data
- S3バケットを作成します
-
こちらのファイルをアップロードします
Create a batch inference job
下記を元に試します。
- Bedrockに移動します
- ナビゲーションペインで、「Batch inference」をクリックします
- 「Create job」をクリックします
- 下記を入力し、「Create batch inference job」をクリックします
- job name : 任意
- Model : 上記でモデルリクエストしたもの(Claude 3.5 Sonnetを使用)
- Input data : 上記で作成したinputファイルのS3パス
- Output data : 出力先のS3パス
- Service role:上記で作成したIAMロールを指定
ステータスの確認
-
しばらくすると「Failed」になりました
-
job nameをクリックします
修正
権限の付与
- IAMに移動します
IAMポリシーの作成
- ナビゲーションペインで「ポリシー」をクリックします
- 「ポリシーを作成」をクリックします
- JSONに切り替え、下記のポリシーを貼り付けます
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "s3:GetObject", "s3:PutObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::${{s3-bucket-input}}", "arn:aws:s3:::${{s3-bucket-input}}/*", "arn:aws:s3:::${{s3-bucket-output}}", "arn:aws:s3:::${{s3-bucket-output}}/*" ], "Effect": "Allow" } ] }
- ポリシー名を入力し、「ポリシーの作成」をクリックします
IAMロールへアタッチ
ファイルフォーマット
- そういえば、jsonlになっていませんでした
% cat test.jsonl { "recordId": "CALL0000001", "modelInput": { "anthropic_version": "bedrock-2023-05-31", "max_tokens": 1024, "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Summarize the following call transcript: ..." } ] } ] } } %
- 下記のように修正し、再アップします
% cat test.jsonl {"recordId": "CALL0000001","modelInput": {"anthropic_version": "bedrock-2023-05-31","max_tokens": 1024,"messages": [{ "role": "user", "content": [{"type": "text", "text": "Summarize the following call transcript: ..." } ]}]}} %
再実行
-
Bedrock inferenceのBatch Inferenceに移動します
-
ダッシュボードを見ると、リランができないようだ
-
あらためて、「Create job」をクリックし、再度同じ内容を入力します
再々実行
-
100件のファイルを作成しました
% wc -l test2.jsonl 100 test2.jsonl %
-
全然終わらないので、止めます。ジョブを選択し、「Stop job」をクリックします
ファイルの中身を入れ替えて再実行
-
ファイルの中身を変えてみます
% tail -1 test3.jsonl {"recordId":"CALL100","modelInput": {"anthropic_version": "bedrock-2023-05-31","max_tokens": 100,"messages": [{ "role": "user", "content": [{"type": "text", "text": "あなたは誰ですか?" } ]}]}} %
-
結果を確認します。それぽく確認できました
% tail -3 test3.jsonl.out {"modelInput":{"anthropic_version":"bedrock-2023-05-31","max_tokens":100,"messages":[{"role":"user","content":[{"type":"text","text":"あなたは誰ですか?"}]}]},"modelOutput":{"id":"msg_bdrk_017TSZASMdKgGMgjKT6Jhxhw","type":"message","role":"assistant","model":"claude-3-5-sonnet-20241022","content":[{"type":"text","text":"私はAnthropicが作ったAIアシスタントのClaudeです。誠実に、倫理的にお手伝いさせていただきます。"}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":17,"output_tokens":49}},"recordId":"CALL098"} {"modelInput":{"anthropic_version":"bedrock-2023-05-31","max_tokens":100,"messages":[{"role":"user","content":[{"type":"text","text":"あなたは誰ですか?"}]}]},"modelOutput":{"id":"msg_bdrk_01WiiDjTXgv5rWYpbbuBP2Ty","type":"message","role":"assistant","model":"claude-3-5-sonnet-20241022","content":[{"type":"text","text":"私はClaudeです。人工知能アシスタントとして、倫理的で誠実な対話を心がけています。Anthropicによって作られました。"}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":17,"output_tokens":49}},"recordId":"CALL099"} {"modelInput":{"anthropic_version":"bedrock-2023-05-31","max_tokens":100,"messages":[{"role":"user","content":[{"type":"text","text":"あなたは誰ですか?"}]}]},"modelOutput":{"id":"msg_bdrk_01E433ZN9YRjehEMNQuBZdAp","type":"message","role":"assistant","model":"claude-3-5-sonnet-20241022","content":[{"type":"text","text":"私はAnthropicが作ったAIアシスタントのClaudeです。人々との対話を通じて様々なタスクをサポートすることを目的としています。"}],"stop_reason":"end_turn","stop_sequence":null,"usage":{"input_tokens":17,"output_tokens":54}},"recordId":"CALL100"} %
-
manifestを確認します。レコード数と成功数、トークン数がわかります
% cat manifest.json.out {"totalRecordCount":100,"processedRecordCount":100,"successRecordCount":100,"errorRecordCount":0,"inputTokenCount":1700,"outputTokenCount":5216} %
考察
一時的にジョブが「Scheduled」のまま進行せず、その挙動が不明でしたが、バッチ処理に組み込むのであれば、価格も安価で適しているのではないかと感じました。ただし、マネジメントコンソールはリランができないなど、使い勝手はあまりよろしくなく改善してほしいと思いました。次回は、プログラムからの実行を試みたいと考えています。
参考