Amazon Bedrockのモニタリングを考える

記事タイトルとURLをコピーする

サーバーワークスの村上です。

このブログではAmazon Bedrockをモニタリングするツールについて、主にCloudWatchとWeights & Biasesを比較していきます。

後述しますが、Weights & BiasesはAWSサービスではなく、機械学習の実験管理などに使われるサードパーティ製のサービスです。

結論

CloudWatchとWeights & Biases、ぞれぞれどの機能でモニタリングするか、私なりの考えですがざっとまとめてみました。

モニタリング項目 CloudWatch Weights & Biases
ユーザーが入力した情報(prompt) CloudWatch Log Insights W&B TablesやW&B Prompts
LLMが出力した情報(completion) CloudWatch Log Insights。ただしストリーミング出力している場合は出力が分割して記録される W&B TablesやW&B Prompts
入出力トークン数 CloudWatchメトリクスやCloudWatch Log Insights W&B Tables
出力に要した時間(レイテンシー) CloudWatchメトリクス W&B Tables
認証情報 モニタリング不可 アプリケーションがユーザー名などの情報を持っている場合はW&B Tablesでモニタリング可能
総論 簡単に始められるが、モニタリングできる項目には限りがある アプリケーションコードに少量のコードを書く必要があるが、自由度は高い

詳細を記載していきます。

前提

以下のようなチャットボットを使っていると想定します。自然言語の生成を前提とし、画像生成は想定しません。

主なモニタリング事項

私の思いつく限りですが、以下のようなモニタリング事項があるかと思います。

  • ユーザーが入力した情報(prompt)
  • Amazon Bedrockが出力した情報(completion)
  • 入出力トークン数と料金
  • 出力に要した時間(レイテンシー)
  • 認証情報(誰がAmazon Bedrockを呼び出したか)

AWSサービスを使ったモニタリング

(前提)Amazon Bedrockのモニタリング設定

前提としてAmazon Bedrockのモデル呼び出しをロギングするためには、設定を有効化する必要があります。

Amazon BedrockのコンソールにあるSettingsから、ログの出力先を選択します。S3やCloudwatch Logsが選択可能です。

CloudWatch Log Insightsを使ったモニタリング

CloudWatch Logsで取得できる情報は以前のブログでも紹介しました。

blog.serverworks.co.jp

CloudWatch Logsではpromptやトークン数の情報が取得できますが、1つのログにはBedrockを1回呼び出した際の情報が記録されるので、例えば月間の呼び出し回数を集計するなど、LLMアプリケーションの全体の動きを俯瞰して見ることはできません。

そういった場合はCloudWatch Log Insightsを使って、ログをクエリする方法がおすすめです。

  • 任意のロググループを任意の期間で検索することが可能です
  • 必要な情報だけを選択して表示することができます(今回はpromptやトークン数を表示)
  • ただしストリーミング出力を有効にしている場合、出力が分割されて記録されるため視認性に難があります。

実際にクエリしてみます。

この場合だと35回呼び出されたことが分かる

promptをテンプレート化しているため、input.inputBodyJson.promptフィールドに定型文(Human: Use the following...)しか見えていませんが、表示を展開することで詳細を確認することができます。

また、CloudWatch Log Insightsではいくつかのクエリ構文も利用できるので、例えば「トークン数に利用料単価を乗じて利用料金を表示させる」ような使い方も可能です。

docs.aws.amazon.com

ストリーミング出力している場合、出力が分割される

ストリーミング出力をしている場合、出力した内容は分割して記録されます。

以下はCloudWatch Logsの例ですが、outputBodyJson内のcompletionが配列として記録されています。

{
    "schemaType": "ModelInvocationLog",
    "schemaVersion": "1.0",
    "timestamp": "2023-11-16T09:13:28Z",
    "accountId": "xxxx",
    "region": "xxxx",
    "requestId": "xxxx",
    "operation": "InvokeModelWithResponseStream",
    "modelId": "anthropic.claude-v2",
    "input": {
        "inputContentType": "application/json",
        "inputBodyJson": {
            "max_tokens_to_sample": 4096,
            "temperature": 0.1,
            "top_k": 250,
            "top_p": 1,
            "stop_sequences": [
                "\n\nHuman"
            ],
            "prompt": "\n\nHuman: Use the following...xxxx"
        },
        "inputTokenCount": xxxx
    },
    "output": {
        "outputContentType": "application/json",
        "outputBodyJson": [
            {
                "completion": " 日本の",
                "stop_reason": null,
                "stop": null
            },
            {
                "completion": "首都は",
                "stop_reason": null,
                "stop": null
            },
            {
                "completion": "東京です",
                "stop_reason": null,
                "stop": null
            }
        ],
        "outputTokenCount": xxxx
    }
}

CloudWatch Log Insightsのフィールドでもoutput.outputBodyJson.0.completionoutput.outputBodyJson.1.completionのように、別のフィールドとして認識されています。

CloudWatch Logsだとアプリごとのロギングはできない

さきほどAmazon BedrockのコンソールにあるSettingsからロギングを有効化すると記載しました。

この設定はリージョンごとの設定であり、例えば同一AWSアカウントの同一リージョンでBedrockを使ったアプリを複数ホストしている場合、全てのログがひとつのCloudWatchロググループに記録されてしまいます。

そのため、CloudWatch Logsだけでモニタリングしようとしている場合は、AWSアカウントを分けるなどの対応が必要と考えます。

もしくはアプリ側で別途、会話履歴などの必要な情報をDynamoDBに保存するような処理をしてもいいかもしれません。

レイテンシーやトークン数はCloudWatchメトリクスでも確認可能

CloudWatchメトリクスのInvocationLatencyInputTokenCountOutputTokenCountで確認できます。

docs.aws.amazon.com

CloudWatchメトリクスについてはモデル別に参照することができます。以下はオレゴンリージョンでのInvocationLatencyを表示させた様子です。

過去1週間のInvocationLatency(平均)

認証情報も記録したい場合は別の仕組みが必要

CloudWatch Logsには「誰が」にあたる認証情報は含まれません。

そのため誰が何をBedrockに入力したかモニタリングしたい場合は、アプリケーション側で実装する必要があると考えます。

例えばUIにSlackを使っている場合、誰が何を入力したか追跡可能なため、その情報をDynamoDBや後述するW&B Tablesに記録しておく、などの実装が考えられます。

サードパーティ製品を活用する

Weights & Biases

Weights & Biases(wandb)は機械学習の実験管理などに使われるツールです。wandbを使うときめ細かなモニタリングが可能です。

www.wandb.jp

いくつか紹介させていただきます。

W&B Tables

W&B Tablesを使うと、表形式で任意の情報をモニタリングすることが可能です。テーブルに記録したい情報をアプリケーションのコード内に書いていくので、アプリで保持している情報なら自由にロギング可能です。

例えば以下では、Bedrockを呼び出すコードの直前でtimeモジュールを使って現在時刻を取得しておき、アプリへ出力した直後に再度現在時刻を取得して、処理に要した時間をelapsed_timeとして記録しています。また、アプリケーションがユーザー情報も持っているので、一緒にテーブルに記録しています。

ユーザー名や処理に要した時間を記録する

また、CloudWatch Log Insightsのinput.inputBodyJson.promptフィールドには、ユーザーの入力に加えプロンプトテンプレートのHuman: Use the following...が含まれていました。

しかし、こういったお決まりの文句は見ても仕方ないので、以下のようにユーザーが入力した情報だけを表示し、トークン数のカウントではプロンプトテンプレートを含む全体のトークン数を表示する、といったことも可能です(これくらいの処理ならCloudWatch Log Insightsのクエリ構文を駆使してできそうではありますが)。

user_prompt列にはユーザーが入力した情報だけを表示し、input_tokens列にはプロンプトテンプレートを含む全体の入力トークン数を表示

さらに、GUI上でcost列を追加し、計算式を使って利用料金を表示させる、ような使い方も可能です。

さらにさらに、W&B Tablesなら画像などの情報も記録可能です。冒頭に記載したとおり自由度が高い点が魅力です。

https://docs.wandb.ai/ja/guides/tablesより引用

W&B Prompts

W&B PromptsではLLMのチェーンやエージェントを使っている際のトレース情報を可視化できます。

https://docs.wandb.ai/ja/guides/prompts/quickstartより引用

今回、私の個人環境で作成したチャットボットはシンプルなものなので、以下のような表示でしたが、Langchainを使って複数のChainやAgent、Toolsを使うような場合だと重宝する機能かと思います!

Weights & Biasesの料金体系

個人利用は無料ですが、組織で利用する場合は料金がかかりますのでご留意ください。

www.wandb.jp

(番外編)LangSmith

LangSmithはLangchainとシームレスに動かすことができるモニタリングツールです。

docs.smith.langchain.com

ただし、ブログ執筆時点ではベータ版での提供で、使用するには制限があります。使えるようになったらぜひ試してみたいですね。

WAITLIST
LangSmith is currently in private beta. If you'd like to be added to the waitlist, please sign up for an account here.

所感

自分のアプリにとって何が必要な情報なのか定義しモニタリングする必要があります。

必要に応じて自由度の高いWeights & Biasesなどのツールを使っていくと良いかと考えます。

村上博哉 (執筆記事の一覧)

2020年4月入社。機械学習が好きです。記事へのご意見など:hiroya.murakami@serverworks.co.jp