

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用每秒輸出字符 (OTPS) 診斷`InvocationLatency`增加
<a name="monitoring-runtime-otps"></a>

`InvocationLatency` 指標會報告推論請求的時鐘時間，從收到請求的時間到產生最後一個輸出字符的時間。此指標本身無法告訴您延遲增加*的原因*。相同的升高值可能來自兩個不同的條件：
+ 模型產生字符的速度較慢 — 服務端輸送量變更。
+ 模型會在每次請求產生更多權杖：工作負載變更，例如較長的提示、更新的系統提示，或產生較長回應的模型更新。

每秒輸出字符數 (OTPS) 會隔離輸送量元件，因此您可以在服務端降級時發出警示，而不會在輸出長度增加時產生誤報。

**注意**  
OTPS 計算需要 `TimeToFirstToken` 指標，Amazon Bedrock 只會針對串流 API 操作 [ConverseStream](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html) 和 [InvokeModelWithResponseStream](https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModelWithResponseStream.html) 發佈該指標。本節中的程序僅適用於這些操作上的流量。

## `InvocationLatency`、 `TimeToFirstToken`和 OTPS 的關聯方式
<a name="monitoring-runtime-otps-formula"></a>

推論請求會通過模型主機上的兩個運算限制階段：
+ **預先填充。**模型會在單一向前傳遞中處理整個輸入提示，並產生第一個輸出字符。此階段的持續時間主要以輸入長度進行擴展，並且是 的主要驅動因素`TimeToFirstToken`。
+ **解碼。**模型會依序產生每個後續輸出字符，每個向前傳遞一個字符。此階段的總時間會隨著輸出字符的數量而擴展。對於指定的模型和主機負載，每個金鑰解碼時間相當穩定，這使得 OTPS 成為有用的輸送量訊號。

這些階段會在 Amazon Bedrock 執行時間指標之間產生下列關係：

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

解決 OTPS 提供您可以從已發佈 CloudWatch 指標運算的公式：

```
OTPS = OutputTokenCount / (InvocationLatency - TimeToFirstToken) * 1000
```

隨著時間的推移，穩定的 OTPS 表示模型以預期的輸送量產生，即使由於較長的提示或較長的回應`InvocationLatency`而升高。OTPS 下降表示模型端輸送量變更，這是您通常想要警示的訊號。

## 使用 CloudWatch 指標數學表達式計算 OTPS
<a name="monitoring-runtime-otps-metric-math"></a>

您可以在 CloudWatch 主控台中將發佈的 Amazon Bedrock 執行時間指標合併為指標數學表達式，以繪製 OTPS。所需的指標為 `InvocationLatency`、 `OutputTokenCount`和 `TimeToFirstToken`，全部都在 `AWS/Bedrock` 命名空間中。如需這些指標的說明，請參閱 [Amazon Bedrock 執行時期指標](monitoring-runtime-metrics.md#runtime-cloudwatch-metrics)。

1. 開啟 CloudWatch 主控台，然後選擇**指標**，然後選擇**所有指標**。

1. 搜尋`Bedrock`並選取 **By ModelId** 維度。

1. 針對您要監控`TimeToFirstToken`的模型 ID `InvocationLatency`選取 `OutputTokenCount`、 和 。

1. 對於每個選取的指標，將**統計資料**設定為 `p50`，並將**期間**設定為 **5 分鐘**。

1. 選擇**新增數學**，然後從**空表達式開始**。

1. 輸入下列表達式並標記 `OTPS`。調整指標 IDs (`m1`、`m2`、`m3`) 以符合指派給 `OutputTokenCount`、 `InvocationLatency`和 選項`TimeToFirstToken`中的 IDs。

   ```
   m2 / (m1 - m3) * 1000
   ```

圖形現在會顯示所選模型每 5 分鐘的 p50 OTPS 時段。您可以使用此指標數學表達式作為警示的基礎。

## 在 OTPS 上建立 CloudWatch 警示
<a name="monitoring-runtime-otps-alarm"></a>

由於 OTPS 是指標數學表達式而非發佈的指標，因此您可以透過建立指標數學警示來對其發出警示。兩種模式很有用，取決於您是否已建立輸送量基準。

### 靜態閾值警示
<a name="monitoring-runtime-otps-alarm-static"></a>

當您為模型建立基準 OTPS 時，請使用靜態閾值警示，例如基準測試或歷史流量。

1. 從上述程序中建立的 OTPS 指標數學表達式中，選擇警示圖示以建立警示。

1. 對於**閾值類型**，選擇**靜態**。

1. 針對警示條件，選擇**低於** 並輸入您的閾值。常見的起點是預期基準的 80%。例如，如果您的模型通常每秒達到 55 個字符，請將閾值設定為每秒 44 個字符。

1. **在其他組態**下，將評估設定為 **5 個資料點中的 3** 個，以減少暫時性下降的雜訊。

1. 如果您希望差距計為降級，請將遺失資料處理設定為**將遺失資料視為違規**，或者如果預期在低流量期間**遺失資料，則將遺失資料視為**遺失。

### 異常偵測警示
<a name="monitoring-runtime-otps-alarm-anomaly"></a>

當工作負載模式隨時間變化，且您希望閾值自動調整時，請使用異常偵測警示。異常偵測需要足夠的歷史資料 （至少兩週） 來建置準確的模型。對於新部署，請從靜態閾值開始。

1. 從 OTPS 指標數學表達式建立警示，如上述程序所示，但對於**閾值類型**，請選擇**異常偵測**。

1. 選擇**低於頻帶**。OTPS 下降，而不是峰值，表示降級。

1. 將異常偵測閾值設定為 2 或 3 個標準差。較低的值會產生更敏感的警示。

1. 使用 5 個評估期間中的 3 個。

1. 如靜態閾值程序所述，設定遺失的資料處理方式。

## 使用適用於 Python 的 AWS SDK (Boto3) 以程式設計方式建立警示
<a name="monitoring-runtime-otps-boto3"></a>

下列 Python 範例使用適用於 Python 的 AWS SDK (Boto3) 來建立上一節所述的靜態閾值警示。`AlarmActions` 將 `MODEL_ID`、 `OTPS_THRESHOLD`和 取代為您的環境適用的值。

```
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.")
```