

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 초당 출력 토큰(OTPS)을 사용하여 `InvocationLatency` 증가 진단
<a name="monitoring-runtime-otps"></a>

`InvocationLatency` 지표는 요청이 수신된 시점부터 마지막 출력 토큰이 생성된 시점까지 추론 요청의 벽시계 시간을 보고합니다. 이 지표 자체로는 지연 시간이 증가한 *이유를* 알 수 없습니다. 동일한 상승된 값은 두 가지 조건에서 발생할 수 있습니다.
+ 모델이 토큰을 더 느리게 생성하여 서비스 측 처리량이 변경됩니다.
+ 모델은 더 긴 프롬프트, 업데이트된 시스템 프롬프트 또는 더 긴 응답을 생성하는 모델 업데이트와 같은 워크로드 변경 등 요청당 더 많은 토큰을 생성하고 있습니다.

초당 출력 토큰(OTPS)은 처리량 구성 요소를 격리하므로 출력 길이가 늘어날 때 거짓 긍정을 생성하지 않고 서비스 측 성능 저하를 경고할 수 있습니다.

**참고**  
OTPS 계산에는 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)에 대해서만 게시하는 `TimeToFirstToken` 지표가 필요합니다. 이 섹션의 절차는 해당 작업의 트래픽에만 적용됩니다.

## `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>

게시된 Amazon Bedrock 런타임 지표를 지표 수학 표현식에 결합하여 CloudWatch 콘솔에서 OTPS를 그래프로 표시할 수 있습니다. 필요한 지표는 `AWS/Bedrock` 네임스페이스`TimeToFirstToken`의 `InvocationLatency``OutputTokenCount`, 및 입니다. 이러한 지표에 대한 자세한 설명은 [Amazon Bedrock 런타임 지표](monitoring-runtime-metrics.md#runtime-cloudwatch-metrics) 섹션을 참조하세요.

1. CloudWatch 콘솔을 열고 **지표**를 선택한 다음 **모든 지표**를 선택합니다.

1. **ModelId **차원을 검색`Bedrock`하고 선택합니다.

1. 모니터링할 모델 ID에 `TimeToFirstToken` 대해 `InvocationLatency``OutputTokenCount`, 및를 선택합니다.

1. 선택한 각 지표에 대해 **통계**를 로 설정하고 `p50` **기간을** **5분**으로 설정합니다.

1. **수학 추가**를 선택한 다음 **빈 표현식으로 시작**을 선택합니다.

1. 다음 표현식을 입력하고 레이블을 지정합니다`OTPS`. 지표 IDs(`m1`, `m2`, `m3`)를 조정하여 선택 `TimeToFirstToken` 항목에서 `InvocationLatency`, `OutputTokenCount`및에 할당된 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>

시간이 지남에 따라 워크로드 패턴이 다양하고 임계값이 자동으로 조정되도록 하려는 경우 이상 탐지 경보를 사용합니다. 이상 탐지에는 정확한 모델을 구축하기 위한 충분한 기록 데이터(최소 2주)가 필요합니다. 새 배포의 경우 정적 임계값으로 시작합니다.

1. 이전 절차와 같이 OTPS 지표 수학 표현식에서 경보를 생성하지만 임계값 **유형**에서 **이상 탐지**를 선택합니다.

1. **밴드보다 낮음을** 선택합니다. OTPS는 급증하지 않고 저하를 나타냅니다.

1. 이상 탐지 임계값을 표준 편차 2 또는 3으로 설정합니다. 값이 낮을수록 경보가 더 민감해집니다.

1. 평가 기간 5개 중 3개를 사용합니다.

1. 정적 임계값 절차에 설명된 대로 누락된 데이터 처리를 설정합니다.

## AWS SDK for Python(Boto3)을 사용하여 프로그래밍 방식으로 경보 생성
<a name="monitoring-runtime-otps-boto3"></a>

다음 Python 예제에서는 Python용 AWS SDK(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.")
```