【Amazon Bedrock】Claude 3.5 HaikuのLatency-optimized inferenceって結局速いの?
目次
はじめに
はじめまして!
クラウドビルダーズのKawabataと申します
みなさん、Amazon Bedrockの新機能「Latency-optimized inference」をご存知ですか??
Claude 3.5 Haikuで利用できるこの機能、応答速度が速くなったよ~との噂が
実際検証してみないとわかんないですよねw
ということで検証やっていきましょう~~~
Latency-optimized inferenceとは
Latency-optimized inferenceは、AWS Trainium2チップを活用したClaude 3.5 Haikuの高速化機能です!
Anthropicの公式発表によると、以下のような特徴があります:
- AWS Trainium2チップに最適化されたインファレンス
- 最大60%の推論速度向上を実現
- 米国東部(オハイオ)リージョンでクロスリージョンインファレンスとして提供
- 料金は100万入力トークンあたり$1、100万出力トークンあたり$5
なお、Claude 3.5 Haikuは料金が20%値下げされ、通常の場合は100万入力トークンあたり$0.80、100万出力トークンあたり$4.00となりました!
(値下げありがとう!!!)
Latency-optimized inferenceを有効にした場合は20%の値下げの対象外となりますが、より高速な推論が必要なユースケースに対応できます
最大60%の推論速度向上は期待大
では、実際のパフォーマンスはどうなのでしょうか?
結論
結論から言うと、Latency-optimized inferenceを有効にすることで、平均して約30%程度の応答時間短縮が確認できました!
検証方法と結果を確認していきましょう
検証
検証方法
- 以下の3つのモデルで比較検証を実施
すべてus-east-2リージョン、Cross-region inferenceで実行
- Claude 3 Haiku
- Claude 3.5 Haiku (not optimized)
- Claude 3.5 Haiku (optimized)
2. 10種類の異なるプロンプトを用意し、各モデルで実行
- コード生成タスク
- PythonでWebスクレイピングを行う際の基本的なコードと注意点を説明してください。BeautifulSoupの使用例も含めてください。
- FastAPIで認証機能付きのRESTful APIを実装するためのベストプラクティスを教えてください。コード例も含めて説明してください。
- 論理的思考タスク
- マイクロサービスアーキテクチャとモノリシックアーキテクチャの比較を行い、それぞれの適用場面について具体例を挙げて説明してください。
- 大規模なデータ処理システムでパフォーマンスの問題が発生した場合、どのような手順で原因特定と改善を行いますか?具体的な手順を説明してください。
- 文章生成タスク
- ChatGPTやClaudeなどの大規模言語モデルが企業にもたらす影響について、メリットとリスクの両面から500文字程度で分析してください。
- ブロックチェーン技術について、技術に詳しくない経営者向けに分かりやすく説明してください。具体的なユースケースも含めてください。
- 多言語タスク
- 以下の内容を日本語、英語、中国語で書いてください:ソフトウェア開発における品質管理の重要性について、3つのポイントを挙げて説明してください。
- 機械学習プロジェクトの進め方について、プロジェクトマネージャー向けに日本語と英語で説明してください。
- 技術説明タスク
- コンテナ技術(Docker)について、これから学ぼうとする初心者エンジニアに向けて、基本概念から実践的な使用方法まで段階的に説明してください。
- CI/CDパイプラインの構築について、GitHubActionsを例に挙げて具体的な実装方法を説明してください。サンプルの設定ファイルも含めてください。
3. 各実行で以下の指標を測定
- 応答時間
- 出力トークン数
- トークン生成速度(トークン/秒)
実行スクリプト
検証には以下のPythonスクリプトを使用しました:
import boto3
import json
from datetime import datetime
import time
import os
def invoke_model(model_id, prompt, optimized):
start_time = time.time()
body = json.dumps({
"anthropic_version": "bedrock-2023-05-31",
"max_tokens": 5000,
"messages": [
{
"role": "user",
"content": prompt
}
],
"temperature": 0.0,
"top_p": 0.0,
})
client = boto3.client(
service_name='bedrock-runtime',
region_name='us-east-2'
)
if "anthropic.claude-3-haiku-20240307-v1:0" in model_id:
response = client.invoke_model(
modelId=model_id,
body=body,
)
else:
if optimized:
response = client.invoke_model(
modelId=model_id,
body=body,
performanceConfigLatency="optimized",
)
else:
response = client.invoke_model(
modelId=model_id,
body=body,
)
response_body = json.loads(response.get('body').read())
end_time = time.time()
execution_time = end_time - start_time
return response_body.get('content')[0].get('text'), response_body.get('usage').get('output_tokens'), execution_time
def compare_models(prompt):
claude_3_haiku = "us.anthropic.claude-3-haiku-20240307-v1:0"
claude_35_haiku = "us.anthropic.claude-3-5-haiku-20241022-v1:0"
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"比較時刻: {timestamp}")
print(f"プロンプト: {prompt}\n")
print("Claude 3 Haiku の応答:")
claude_3_response, claude_3_output_tokens, claude_3_time = invoke_model(claude_3_haiku, prompt, optimized=False)
print(f"応答時間: {claude_3_time:.2f}秒")
print(f"出力トークン数: {claude_3_output_tokens}")
print(claude_3_response)
print("\n" + "-"*50 + "\n")
print("Claude 3.5 Haiku(not optimized) の応答:")
claude_35_response_not_optimized, claude_35_output_tokens_not_optimized, claude_35_time_not_optimized = invoke_model(claude_35_haiku, prompt, optimized=False)
print(f"応答時間: {claude_35_time_not_optimized:.2f}秒")
print(f"出力トークン数: {claude_35_output_tokens_not_optimized}")
print(claude_35_response_not_optimized)
print("\n" + "-"*50 + "\n")
print("Claude 3.5 Haiku(optimized) の応答:")
claude_35_response_optimized, claude_35_output_tokens_optimized, claude_35_time_optimized = invoke_model(claude_35_haiku, prompt, optimized=True)
print(f"応答時間: {claude_35_time_optimized:.2f}秒")
print(f"出力トークン数: {claude_35_output_tokens_optimized}")
print(claude_35_response_optimized)
os.makedirs('results', exist_ok=True)
file_path = os.path.join('results', f"comparison_results_{timestamp.replace(' ', '_')}.txt")
with open(file_path, "w", encoding='utf-8') as f:
f.write(f"比較時刻: {timestamp}\n")
f.write(f"プロンプト: {prompt}\n\n")
f.write("Claude 3 Haiku の応答:\n")
f.write(f"応答時間: {claude_3_time:.2f}秒\n")
f.write(f"出力トークン数: {claude_3_output_tokens}\n")
f.write(claude_3_response)
f.write("\n\n" + "-"*50 + "\n\n")
f.write("Claude 3.5 Haiku(not optimized) の応答:\n")
f.write(f"応答時間: {claude_35_time_not_optimized:.2f}秒\n")
f.write(f"出力トークン数: {claude_35_output_tokens_not_optimized}\n")
f.write(claude_35_response_not_optimized)
f.write("\n\n" + "-"*50 + "\n\n")
f.write("Claude 3.5 Haiku(optimized) の応答:\n")
f.write(f"応答時間: {claude_35_time_optimized:.2f}秒\n")
f.write(f"出力トークン数: {claude_35_output_tokens_optimized}\n")
f.write(claude_35_response_optimized)
f.write("\n\n" + "-"*50 + "\n\n")
f.write("実行時間の比較:\n")
f.write(f"Claude 3 Haiku: {claude_3_time:.2f}秒\n")
f.write(f"Claude 3.5 Haiku(not optimized): {claude_35_time_not_optimized:.2f}秒\n")
f.write(f"Claude 3.5 Haiku(optimized): {claude_35_time_optimized:.2f}秒\n")
f.write("\n\n" + "-"*50 + "\n\n")
f.write("実行時間の差分:\n")
f.write(f"差分: 3 Haiku - 3.5 Haiku(not optimized): {(claude_3_time - claude_35_time_not_optimized):.2f}秒\n")
f.write(f"差分: 3 Haiku - 3.5 Haiku(optimized): {(claude_3_time - claude_35_time_optimized):.2f}秒\n")
f.write(f"差分: 3.5 Haiku(not optimized) - 3.5 Haiku(optimized): {(claude_35_time_not_optimized - claude_35_time_optimized):.2f}秒\n")
f.write("\n\n" + "-"*50 + "\n\n")
f.write("出力トークン数の比較:\n")
f.write(f"Claude 3 Haiku: {claude_3_output_tokens}\n")
f.write(f"Claude 3.5 Haiku(not optimized): {claude_35_output_tokens_not_optimized}\n")
f.write(f"Claude 3.5 Haiku(optimized): {claude_35_output_tokens_optimized}")
def main():
test_prompt = "CI/CDパイプラインの構築について、GitHubActionsを例に挙げて具体的な実装方法を説明してください。サンプルの設定ファイルも含めてください。"
try:
compare_models(test_prompt)
print("\nresults/ディレクトリに結果を保存しました。")
except Exception as e:
print(f"エラーが発生しました: {str(e)}")
if __name__ == "__main__":
main()
出力ファイル例
実行結果は以下のような形式でファイルに保存されます:
比較時刻: 2024-12-16 22:23:06
プロンプト: CI/CDパイプラインの構築について、GitHubActionsを例に挙げて具体的な実装方法を説明してください。サンプルの設定ファイルも含めてください。
Claude 3 Haiku の応答:
応答時間: 9.30秒
出力トークン数: 719
(応答内容...)
--------------------------------------------------
Claude 3.5 Haiku(not optimized) の応答:
応答時間: 22.73秒
出力トークン数: 1368
(応答内容...)
--------------------------------------------------
Claude 3.5 Haiku(optimized) の応答:
応答時間: 13.23秒
出力トークン数: 1391
(応答内容...)
--------------------------------------------------
実行時間の比較:
Claude 3 Haiku: 9.30秒
Claude 3.5 Haiku(not optimized): 22.73秒
Claude 3.5 Haiku(optimized): 13.23秒
--------------------------------------------------
実行時間の差分:
差分: 3 Haiku - 3.5 Haiku(not optimized): -13.43秒
差分: 3 Haiku - 3.5 Haiku(optimized): -3.93秒
差分: 3.5 Haiku(not optimized) - 3.5 Haiku(optimized): 9.50秒
--------------------------------------------------
出力トークン数の比較:
Claude 3 Haiku: 719
Claude 3.5 Haiku(not optimized): 1368
Claude 3.5 Haiku(optimized): 1391
検証結果
※1: Claude 3.5 (not opt)はClaude 3.5 Haiku(通常)、Claude 3.5 (opt)はClaude 3.5 Haiku(latency-optimized inferenceあり)の略になります
※2: Cross-region inferenceのため、実行リージョンも記載しています
※3: 速度改善率はLatency-optimized inferenceの有無で何%改善したかを示しています
プロンプト | モデル ※1 | 実行リージョン※2 | 応答時間(秒) | 速度改善率※3 | 出力トークン数 | トークン/秒 |
---|---|---|---|---|---|---|
Webスクレイピング | Claude 3 Haiku | us-west-2 | 7.07 | – | 792 | 112.02 |
Claude 3.5 (not opt) | us-west-2 | 25.38 | – | 1595 | 62.84 | |
Claude 3.5 (opt) | us-east-2 | 15.43 | 39.2% | 1602 | 103.82 | |
FastAPI認証 | Claude 3 Haiku | us-east-1 | 10.41 | – | 1125 | 108.07 |
Claude 3.5 (not opt) | us-west-2 | 35.68 | – | 2375 | 66.56 | |
Claude 3.5 (opt) | us-east-2 | 27.80 | 22.1% | 2229 | 80.18 | |
マイクロサービス | Claude 3 Haiku | us-west-2 | 9.99 | – | 667 | 66.77 |
Claude 3.5 (not opt) | us-west-2 | 19.89 | – | 1037 | 52.14 | |
Claude 3.5 (opt) | us-east-2 | 13.86 | 30.3% | 1130 | 81.53 | |
データ処理 | Claude 3 Haiku | us-east-1 | 8.82 | – | 713 | 80.84 |
Claude 3.5 (not opt) | us-west-2 | 18.23 | – | 928 | 50.90 | |
Claude 3.5 (opt) | us-east-2 | 11.45 | 37.2% | 1082 | 94.50 | |
LLMの影響 | Claude 3 Haiku | us-west-2 | 7.35 | – | 514 | 69.93 |
Claude 3.5 (not opt) | us-west-2 | 8.34 | – | 318 | 38.13 | |
Claude 3.5 (opt) | us-east-2 | 5.62 | 32.6% | 317 | 56.41 | |
ブロックチェーン | Claude 3 Haiku | us-west-2 | 8.35 | – | 481 | 57.60 |
Claude 3.5 (not opt) | us-west-2 | 7.09 | – | 364 | 51.34 | |
Claude 3.5 (opt) | us-east-2 | 6.66 | 6.1% | 589 | 88.44 | |
品質管理(多言語) | Claude 3 Haiku | us-east-1 | 4.69 | – | 445 | 94.88 |
Claude 3.5 (not opt) | us-west-2 | 13.00 | – | 739 | 56.85 | |
Claude 3.5 (opt) | us-east-2 | 7.48 | 42.5% | 726 | 97.06 | |
機械学習PM | Claude 3 Haiku | us-east-1 | 7.09 | – | 688 | 97.04 |
Claude 3.5 (not opt) | us-west-2 | 7.45 | – | 414 | 55.57 | |
Claude 3.5 (opt) | us-east-2 | 5.47 | 26.6% | 476 | 87.02 | |
Docker入門 | Claude 3 Haiku | us-east-1 | 12.56 | – | 829 | 66.00 |
Claude 3.5 (not opt) | us-west-2 | 20.17 | – | 1069 | 53.00 | |
Claude 3.5 (opt) | us-east-2 | 13.05 | 35.3% | 1087 | 83.30 | |
CI/CD | Claude 3 Haiku | us-west-2 | 9.30 | – | 719 | 77.31 |
Claude 3.5 (not opt) | us-west-2 | 22.73 | – | 1368 | 60.18 | |
Claude 3.5 (opt) | us-east-2 | 13.23 | 41.8% | 1391 | 105.14 |
まとめ
検証の結果をまとめると以下です:
- 応答時間の改善
- Latency-optimized inferenceを有効にすることで、平均して約30%程度の応答時間短縮
- 特に長文生成時に効果が顕著
- Claude 3 Haikuと同じまたはそれ以上の速度
2.トークン生成速度
- Claude 3 Haiku: 平均約83トークン/秒
- Claude 3.5 (not opt): 平均約55トークン/秒
- Claude 3.5 (opt): 平均約88トークン/秒
3. 出力品質
- Latency-optimized inferenceの有無による内容の質にも差は見られない
- 3 Haikuと3.5 Haikuを比較すると、3.5 Haikuの方がより詳細な回答を提供する傾向
なんと、トークン生成速度に関してはLatency-optimized inferenceを有効にしたClaude 3.5 Haikuが最速でした!
60%とはいきませんでしたが、30%の速度改善が見られました
出力品質に関してはClaude 3.5 Haikuの方が優秀なので、以下のような選択をするといいかもしれません:
料金を抑えたい:Claude 3 Haiku
料金を抑えつつ、品質は確保したい:Claude 3.5 Haiku(通常)
スピードと品質が大事:Claude 3.5 Haiku(Latency-optimized inferenceあり)
おわりに
Latency-optimized inferenceは、特に長文生成時に効果を発揮し、レスポンスの速さが重要な場面で有効な選択肢となりそうです
モデルの質は確保しつつ、応答速度が上がっていくのは大変ありがたいですね!
ぜひとも3.5 Sonnetも速くしてくれ~~~