いきなりですが、少し前にAmazon Bedrock Marketplaceが登場しました!!
Bedrockでは、厳選されたモデルだけが利用できましたが、マーケットプレースではそれ以外のモデルが提供されています。その数はなんと 122!! (2024/1/17時点)
マネージメントコンソール上では、「Model Catalog」で表示されるモデルのうち、「Model collection」が「Bedrock Marketplace」のものが該当します。
この中に、テキストや画像を生成するモデルに混じって、音声からテキストを生成するWhisperが使用できるのを発見しました。
見つけたらやるしかない。
デプロイしてみた
モデルカタログでWhisper Large V3 Turboをクリックし、モデルの詳細画面を表示します。
「Deploy」ボタンをクリックします。
エンドポイント名、インスタンス数、インスタンスタイプを入力します。
Bedrockではありますが、インスタンスを立ち上げる必要があります。(=毎月固定費がかかるイメージです)
詳細設定としてはVPCやIAM、KMSの設定があります。
「Deploy」ボタンをクリックすると、デプロイが始まります。
Endpointが「In Service」になったらデプロイ完了です。
Endpoint ARNは、invokeModel呼び出しの際のmodelId
パラメーターで指定するのでコピーしておきます。
難しい設定はなく、デプロイは超簡単です。
呼び出し方を調べる
さて、呼び出してみようと思うのですが、呼び出し方がわからない!!
とりあえず呼んでみる
import boto3
import json
client = boto3.client("bedrock-runtime")
client.invoke_model(
modelId="arn:aws:sagemaker:us-east-1:123456789012:endpoint/endpoint-quick-start-abcde",
body=json.dumps({}),
)
ValidationException: An error occurred (ValidationException) when calling the InvokeModel operation: {
"code": 400,
"type": "InternalServerException",
"message": "Input payload must contain audio_input key."
}
当然エラーになったのですが、audio_input
というキーが必要というヒントを得ましたw
「whisper audio_input aws」でGoogle検索すると、以下のブログがヒットしました。
SageMaker JumpStartでWhisperを使う方法を紹介したもののようです。
SageMaker JumpStartでは以下のように呼び出すとのことです。
with open(input_audio_file_name, "rb") as file:
wav_file_read = file.read()
payload = {"audio_input": wav_file_read.hex(), "language": "french", "task": "translate"}
predictor.serializer = JSONSerializer()
predictor.content_type = "application/json"
真似てみます。
import boto3
import json
client = boto3.client("bedrock-runtime")
with open("./jfk.flac", mode="rb") as f:
input_audio = f.read()
response = client.invoke_model(
modelId="arn:aws:sagemaker:us-east-1:123456789012:endpoint/endpoint-quick-start-abcde",
body=json.dumps(
{"audio_input": input_audio.hex(), "language": "french", "task": "translate"}
),
)
print(response)
以下で公開されているサンプルファイルを使用しました。
すると、、、
{'ResponseMetadata': {'RequestId': '2d0115d4-c378-43fa-b4a0-fc59903de7b6',
'HTTPStatusCode': 200,
'HTTPHeaders': {'date': 'Fri, 17 Jan 2025 11:22:52 GMT',
'content-type': 'application/json',
'content-length': '143',
'connection': 'keep-alive',
'x-amzn-requestid': '2d0115d4-c378-43fa-b4a0-fc59903de7b6',
'x-amzn-bedrock-invocation-latency': '632'},
'RetryAttempts': 0},
'contentType': 'application/json',
'body': <botocore.response.StreamingBody at 0x7f632d9ab670>}
なんかいい感じの返事がありました!!!!!!!!!!!!!!!!!!!!!!!
invokeModelのレスポンスをいつもの方法で取得します。
response_body = json.loads(response.get("body").read())
print(json.dumps(response_body, indent=2, ensure_ascii=False))
{
"text": [
" Et donc, mes amis, ne me demandez pas ce que votre pays peut faire pour vous, demandez ce que vous pouvez faire pour votre pays."
]
}
やりました~~!!
感動
AWSさん、使い方はドキュメントに記載してください(泣)
その他、気付いた点
- Bedrockのモデル呼び出しログにログ記録される
- 実態はSageMaker 推論エンドポイントのようです(SageMaker Studioのエンドポイント一覧に表示あり)
- SageMakerとしてもログが出る
- SageMaker JumpStartでデプロイしたものを、Bedrockに持ってくることができる(ドキュメント)
エンドポイントの削除
検証が終わったら不要なコストが掛からないように削除しましょう。