View a markdown version of this page

1 秒あたりの出力トークン (OTPS) を使用してInvocationLatency増加を診断する - Amazon Bedrock

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

1 秒あたりの出力トークン (OTPS) を使用してInvocationLatency増加を診断する

InvocationLatency メトリクスは、リクエストが受信されてから最後の出力トークンが生成されるまでの推論リクエストのウォールクロック時間を報告します。それ自体では、このメトリクスはレイテンシーが増加した理由をわかりません。同じ昇格値は、次の 2 つの異なる条件から発生する可能性があります。

  • モデルでトークンの生成が遅くなっています。これは、サービス側のスループットの変化です。

  • モデルはリクエストごとにより多くのトークンを生成しています。長いプロンプト、更新されたシステムプロンプト、長いレスポンスを生成するモデル更新などのワークロードの変更です。

1 秒あたりの出力トークン (OTPS) はスループットコンポーネントを分離するため、出力長が長くなると誤検出を発生させることなく、サービス側の劣化をアラームできます。

注記

OTPS 計算には、Amazon Bedrock がストリーミング API オペレーション ConverseStream および InvokeModelWithResponseStream に対してのみ発行する TimeToFirstTokenメトリクスが必要です。このセクションの手順は、これらのオペレーションのトラフィックにのみ適用されます。

InvocationLatency、TimeToFirstToken、および OTPS の関係

推論リクエストは、モデルホストの 2 つのコンピューティングバウンドステージを通過します。

  • 事前入力。モデルは入力プロンプト全体を 1 回のフォワードパスで処理し、最初の出力トークンを生成します。このステージの期間は、主に入力長でスケールされ、 の主なドライバーですTimeToFirstToken。

  • デコードします。モデルは後続の各出力トークンを順番に生成し、フォワードパスごとに 1 つのトークンを生成します。このステージの合計時間は、出力トークンの数に応じてスケールされます。トークンごとのデコード時間は、特定のモデルとホストの負荷に対してかなり安定しているため、OTPS は有用なスループットシグナルになります。

これらのステージは、Amazon Bedrock ランタイムメトリクス間に次の関係を生成します。

InvocationLatency (ms) = TimeToFirstToken (ms) + (OutputTokenCount / OTPS) * 1000

OTPS を解決すると、公開された CloudWatch メトリクスから計算できる式が得られます。

OTPS = OutputTokenCount / (InvocationLatency - TimeToFirstToken) * 1000

時間の経過とともに安定した OTPS は、プロンプトが長くなったりレスポンスが長くなったりした場合でも、モデルInvocationLatencyが予想スループットで生成していることを示します。OTPS の低下は、モデル側のスループットの変化を示します。これは、通常アラームを実行するシグナルです。

CloudWatch メトリクス数式を使用して OTPS を計算する

公開された Amazon Bedrock ランタイムメトリクスをメトリクス数式と組み合わせることで、CloudWatch コンソールで OTPS をグラフ化できます。必要なメトリクスは InvocationLatency、OutputTokenCount、および でTimeToFirstToken、すべて AWS/Bedrock名前空間にあります。これらのメトリクスの詳細については、「Amazon Bedrock ランタイムメトリクス」を参照してください。

  1. CloudWatch コンソールを開き、メトリクスを選択し、次にすべてのメトリクスを選択します。

  2. ModelId ディメンションで を検索Bedrockして選択します。

  3. モニタリングするモデル ID TimeToFirstTokenに InvocationLatency、OutputTokenCount、 を選択します。

  4. 選択したメトリクスごとに、統計を に設定p50し、期間を 5 分に設定します。

  5. 数学を追加を選択し、空の式で開始します。

  6. 次の式を入力し、 というラベルを付けますOTPS。選択した m1、m2、および IDs に割り当てられた IDs と一致するm3ようにメトリクス ID (InvocationLatency、OutputTokenCount、) TimeToFirstTokenを調整します。

    m2 / (m1 - m3) * 1000

グラフに、選択したモデルの 5 分ウィンドウあたりの p50 OTPS が表示されるようになりました。このメトリクス数式をアラームの基礎として使用できます。

OTPS で CloudWatch アラームを作成する

OTPS は公開されたメトリクスではなくメトリクス数式であるため、メトリクス数学アラームを作成してアラームを発します。確立されたスループットベースラインがあるかどうかに応じて、2 つのパターンが役立ちます。

静的しきい値アラーム

ベンチマークや履歴トラフィックなど、モデルのベースライン OTPS が確立されている場合は、静的しきい値アラームを使用します。

  1. 前の手順で作成した OTPS メトリクス数式から、アラームアイコンを選択してアラームを作成します。

  2. [Threshold type] で [静的] を選択します。

  3. アラーム条件には、「Lower than」を選択し、しきい値を入力します。一般的な開始点は、予想されるベースラインの 80% です。たとえば、モデルが通常 1 秒あたり 55 トークンを達成した場合、しきい値を 1 秒あたり 44 トークンに設定します。

  4. 追加設定で、評価を 5 つのデータポイントのうち 3 つに設定し、一時的なディップによるノイズを減らします。

  5. 欠落データの処理を、ギャップを低下としてカウントする場合は欠落データを違反として扱う、トラフィックが少ない期間に欠落データが予想される場合は欠落として扱うに設定します。

異常検出アラーム

ワークロードパターンが時間の経過とともに変化し、しきい値を自動的に調整する場合は、異常検出アラームを使用します。異常検出には、正確なモデルを構築するための十分な履歴データ (少なくとも 2 週間) が必要です。新しいデプロイの場合は、静的しきい値から開始します。

  1. 前述の手順のように OTPS メトリクス数式からアラームを作成しますが、しきい値タイプで異常検出を選択します。

  2. バンドよりも低い を選択します。OTPS の低下は、スパイクではなく、低下を示します。

  3. 異常検出しきい値を 2 または 3 標準偏差に設定します。値を小さくすると、より機密性の高いアラームが生成されます。

  4. 5 つの評価期間のうち 3 つを使用します。

  5. 静的しきい値手順の説明に従って、欠落データ処理を設定します。

AWS SDK for Python (Boto3) を使用してプログラムでアラームを作成する

次の Python の例では、 AWS SDK for Python (Boto3) を使用して、前のセクションで説明した静的しきい値アラームを作成します。MODEL_ID、OTPS_THRESHOLD、 を環境に適した値AlarmActionsに置き換えます。

import boto3 cw = boto3.client("cloudwatch", region_name="us-east-1") MODEL_ID = "us.anthropic.claude-sonnet-4-5-20250929-v1:0" ALARM_NAME = "Bedrock-OTPS-Low" OTPS_THRESHOLD = 44 # tokens/s; set to ~80% of your expected baseline cw.put_metric_alarm( AlarmName=ALARM_NAME, AlarmDescription="Fires when Bedrock OTPS drops below threshold, indicating model-side throughput degradation.", Metrics=[ { "Id": "m1", "MetricStat": { "Metric": { "Namespace": "AWS/Bedrock", "MetricName": "InvocationLatency", "Dimensions": [{"Name": "ModelId", "Value": MODEL_ID}], }, "Period": 300, "Stat": "p50", }, "ReturnData": False, }, { "Id": "m2", "MetricStat": { "Metric": { "Namespace": "AWS/Bedrock", "MetricName": "OutputTokenCount", "Dimensions": [{"Name": "ModelId", "Value": MODEL_ID}], }, "Period": 300, "Stat": "p50", }, "ReturnData": False, }, { "Id": "m3", "MetricStat": { "Metric": { "Namespace": "AWS/Bedrock", "MetricName": "TimeToFirstToken", "Dimensions": [{"Name": "ModelId", "Value": MODEL_ID}], }, "Period": 300, "Stat": "p50", }, "ReturnData": False, }, { "Id": "otps", "Expression": "m2 / (m1 - m3) * 1000", "Label": "OTPS", "ReturnData": True, }, ], ComparisonOperator="LessThanThreshold", Threshold=OTPS_THRESHOLD, EvaluationPeriods=5, DatapointsToAlarm=3, TreatMissingData="ignore", AlarmActions=[], # add SNS ARN, for example "arn:aws:sns:us-east-1:123456789012:my-topic" ) print(f"Alarm '{ALARM_NAME}' created.")