Amazon Bedrockの利用トークン数をCloudWatch Logs Insightsで集計してみる

AWS

2023.12.31

Topics

はじめに

こんにちは、フクナガです。
皆さんは「Amazon Bedrock」使ってますでしょうか!?

実行したプロンプトがモデルの学習に使われない点や、簡単にスタートできる点、またAWSから豊富に提供された学習コンテンツもあり、使い始めたい方は多いのではないでしょうか。
しかし、「運用コスト」が気になり、びくびく使っている方も多いと思います(私もその一人)
Amazon Bedrockの課金体系は基本的に「どのくらいトークンを入出力したか」に依存する従量課金制です。ん?トークン?どうやって数えるんだそれ?となった方もいらっしゃると思います。

トークン数は、Amazon BedrockからCloudWatch Logsへ出力されるログの情報から取得することが可能です。
Amazon BedrockとAmazon CloudWatchの統合による生成系AIアプリケーションのモニタリング

今回は、Amazon BedrockからCloudWatch Logsへのログ出力を有効化し、CloudWatch Logs Insightsでトークン数を集計する方法についてご紹介します。

Model invocation logging(ログ出力設定)の有効化

(1) CloudWatchロググループの作成

(2) Amazon Bedrockコンソールの左側メニューから「Settings」を選択

(3) 「Model invocation logging」にチェックを入れ、下記を入力し、「Save Settings」を押下
・Select the logging destinations
「CloudWatch Logs only」を選択
・Log group name
作成したロググループ名を入力
・Choose a method to authorize Bedrock
「Create and use a new role」を選択
・Service role name
任意の名前を入力

稼働確認

それでは、実際にAmazon BedrockのPlaygroundからプロンプトを実行し、ログが出力される様子を確認してみます。
今回は、Amazon Bedrockで提供しているモデルについて質問するプロンプトを実行しました!
モデルは「Amazon Titan Titan Text – Express」を利用します

【入力】

Please tell me about the features of each model available on Amazon Bedrock.

【出力】

Amazon Bedrock is a managed service that makes foundation models from leading AI startup and Amazon's own Titan models available through APIs. For up-to-date information on Amazon Bedrock and how 3P models are approved, endorsed or selected please see the provided documentation and relevant FAQs

実施後にCloudWatch Logsコンソールを見てみます。

ログが出力されていることが確認できました。
トークン数を確認するうえで重要そうな部分を抜粋してみます。

    "input": {
        "inputContentType": "application/json",
        "inputBodyJson": {
            "inputText": "User: Please tell me about the features of each model available on Amazon Bedrock.\n\nBot:",
            "textGenerationConfig": {
                "maxTokenCount": 2048,
                "stopSequences": [
                    "User:"
                ],
                "temperature": 0,
                "topP": 0.9
            }
        },
        "inputTokenCount": 21
    },

入力した内容とトークン数が記録されていますね!
トークン数は21でした。

    "output": {
        "outputContentType": "application/json",
        "outputBodyJson": [
            {
                "outputText": "\nAmazon Bedrock is a managed service that makes foundation models from leading AI startup and Amazon's own Titan models available through APIs. For up-to-date information on Amazon Bedrock and how 3P models are approved, endorsed or selected please see the provided documentation and relevant FAQs.",
                "index": 0,
                "totalOutputTextTokenCount": 60,
                "completionReason": "FINISH",
                "inputTextTokenCount": 21,
                "amazon-bedrock-invocationMetrics": {
                    "inputTokenCount": 21,
                    "outputTokenCount": 60,
                    "invocationLatency": 2374,
                    "firstByteLatency": 2374
                }
            }
        ],
        "outputTokenCount": 60
    }

出力についても同様に出力内容とトークン数が記録されています。
トークン数は60でした。
これらのログを利用し、CloudWatch Logs Insightsでトークン数を集計してみます。

CloudWatch Logs InsightsでAmazon Bedrockのログを集計する

1. モデルごとのトークン数

下記のクエリをCloudWatch Logs Insightsから実行しました。

fields @timestamp, modelId, operation, input.inputTokenCount as inputTokenCount, output.outputTokenCount as outputTokenCount, input.inputBodyJson.inputText
| filter (inputTokenCount >= 1)
| stats sum(inputTokenCount) , sum(outputTokenCount) by modelId

【出力結果について】

  • modelId
    利用したモデルのID

  • inputTokenCount
    入力したトークンの総数

  • outputTokenCount
    出力されたトークンの総数

上記画像から、「Amazon Titan Titan Text – Express」の入力トークン総数が167、出力トークン総数が1817とわかります。

実際に別のモデルでもAmazon Bedrockを利用し、ログの集計を試してみました。

2. モデルごとのトークン数(期間ごと)

月ごとの集計

fields @timestamp, modelId, operation, input.inputTokenCount as inputTokenCount, output.outputTokenCount as outputTokenCount, input.inputBodyJson.inputText
| filter (inputTokenCount >= 1)
| stats sum(inputTokenCount) , sum(outputTokenCount) by modelId, bin(1mon)

日ごとの集計

fields @timestamp, modelId, operation, input.inputTokenCount as inputTokenCount, output.outputTokenCount as outputTokenCount, input.inputBodyJson.inputText
| filter (inputTokenCount >= 1)
| stats sum(inputTokenCount) , sum(outputTokenCount) by modelId, bin(1d)

プロンプトが日ごとに集計できています。

3. 費用を計算する

各モデルの料金体系はトークン数による従量課金です。
各モデルの料金体系は、下記を参照してください。
Amazon Bedrock の料金

今回は「Amazon Titan Titan Text – Express」で計算します。
記事執筆時(2023年12月)の料金は下記です。

  • 入力
    0.0008 USD/ 1000 トークン

  • 出力
    0.0016 USD/ 1000 トークン

今回の検証では、入力167トークン、出力1817トークンだったので、0.004USDとなります。
日本円だと0.57円程度でした(一安心)

まとめ

今回の記事では、Amazon Bedrockのログ出力を有効化し、CloudWatch Logs Insightsで集計する方法についてご紹介しました。
日々の利用量を気にしつつ、楽しいAmazon Bedrockライフをお過ごしください!

参考

Amazon BedrockとAmazon CloudWatchの統合による生成系AIアプリケーションのモニタリング

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

フクナガ

インフラエンジニア歴5年のフクナガです。AWS(特にBedrockとCodePipeline)とGoogle Cloud(Vertex AI)が得意分野。休日はベースを弾いてます。技術力と発信力を高め、Top Engineerを目指しています。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら