

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用每秒输出令牌 (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)本节中的程序仅适用于这些操作的流量。

## `InvocationLatencyTimeToFirstToken`、和 OTPS 有何关系
<a name="monitoring-runtime-otps-formula"></a>

推理请求在模型主机上经过两个计算绑定阶段：
+ **预填充。**该模型在一次向前传递中处理整个输入提示并生成第一个输出标记。该阶段的持续时间主要随输入长度而变化，是其主要驱动力`TimeToFirstToken`。
+ **解码。**该模型按顺序生成每个后续输出标记，每次向前传递一个标记。该阶段的总时间随输出令牌的数量而变化。 Per-token 对于给定的模型和主机负载，解码时间相当稳定，这使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>

您可以通过在指标数学表达式中组合已发布的 Amazon Bedrock 运行时指标，在 CloudWatch 控制台中绘制 OTPS 图。所需的指标是`InvocationLatency``OutputTokenCount`、和`TimeToFirstToken`，都在`AWS/Bedrock`命名空间中。有关这些指标的说明，请参阅 [Amazon Bedrock 运行时指标](monitoring-runtime-metrics.md#runtime-cloudwatch-metrics)。

1. 打开 CloudWatch 控制台，选择**指标**，然后选择**所有指标**。

1. 搜索`Bedrock`并选择 “**依**据” ModelId 维度。

1. 为要监控`TimeToFirstToken`的型号 ID 选择`InvocationLatency``OutputTokenCount`、和。

1. 对于每个选定的指标，将**统计数据**设置为，`p50`将**周期**设置为 **5 分钟**。

1. 选择**添加数学**，然后选择从**空表达式开始**。

1. 输入以下表达式并对其进行标记`OTPS`。调整指标 ID (`m1`、`m2`、`m3`)，使其与您选择的`InvocationLatency``OutputTokenCount`、和`TimeToFirstToken`中分配的 ID 相匹配。

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

现在，该图表显示所选型号每5分钟窗口的p50 OTPS。您可以使用此指标数学表达式作为警报的基础。

## 在 OTP CloudWatch S 上创建警报
<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. 按照静态阈值过程中的说明设置缺失数据处理。

## 使用以编程方式创建警报 AWS 适用于 Python 的 SDK（Boto3）
<a name="monitoring-runtime-otps-boto3"></a>

以下 Python 示例使用 AWS 适用于 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.")
```