【Amazon Bedrock】Claude 3.5 HaikuのLatency-optimized inferenceって結局速いの?

【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%程度の応答時間短縮が確認できました!

検証方法と結果を確認していきましょう

検証

検証方法

  1. 以下の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 Haikuus-west-27.07792112.02
Claude 3.5 (not opt)us-west-225.38159562.84
Claude 3.5 (opt)us-east-215.4339.2%1602103.82
FastAPI認証Claude 3 Haikuus-east-110.411125108.07
Claude 3.5 (not opt)us-west-235.68237566.56
Claude 3.5 (opt)us-east-227.8022.1%222980.18
マイクロサービスClaude 3 Haikuus-west-29.9966766.77
Claude 3.5 (not opt)us-west-219.89103752.14
Claude 3.5 (opt)us-east-213.8630.3%113081.53
データ処理Claude 3 Haikuus-east-18.8271380.84
Claude 3.5 (not opt)us-west-218.2392850.90
Claude 3.5 (opt)us-east-211.4537.2%108294.50
LLMの影響Claude 3 Haikuus-west-27.3551469.93
Claude 3.5 (not opt)us-west-28.3431838.13
Claude 3.5 (opt)us-east-25.6232.6%31756.41
ブロックチェーンClaude 3 Haikuus-west-28.3548157.60
Claude 3.5 (not opt)us-west-27.0936451.34
Claude 3.5 (opt)us-east-26.666.1%58988.44
品質管理(多言語)Claude 3 Haikuus-east-14.6944594.88
Claude 3.5 (not opt)us-west-213.0073956.85
Claude 3.5 (opt)us-east-27.4842.5%72697.06
機械学習PMClaude 3 Haikuus-east-17.0968897.04
Claude 3.5 (not opt)us-west-27.4541455.57
Claude 3.5 (opt)us-east-25.4726.6%47687.02
Docker入門Claude 3 Haikuus-east-112.5682966.00
Claude 3.5 (not opt)us-west-220.17106953.00
Claude 3.5 (opt)us-east-213.0535.3%108783.30
CI/CDClaude 3 Haikuus-west-29.3071977.31
Claude 3.5 (not opt)us-west-222.73136860.18
Claude 3.5 (opt)us-east-213.2341.8%1391105.14

まとめ

検証の結果をまとめると以下です:

  1. 応答時間の改善
  • 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も速くしてくれ~~~

この記事をシェアする
著者:kawabata
2023年 Jr.Champions選出 2023, 2024年 All Certificate選出 最近はもっぱらCDKとAIばかりです