Zettelkasten

SageMaker Async Inference는 ApproximateBacklogSizePerInstance로 Scale-to-Zero가 가능하다

·수정 2026.05.04·수정 1

요약

  • SageMaker Async Inference 엔드포인트는 min-capacity=0으로 등록하면 백로그가 없을 때 인스턴스를 0개까지 축소할 수 있다.
  • Target Tracking Scaling은 ApproximateBacklogSizePerInstance 메트릭과 TargetValue=1로 동작시키는 것이 표준 패턴이다.
  • CloudWatch 알람의 Dimensions에 VariantName을 넣으면 INSUFFICIENT_DATA 상태가 되어 autoscaling이 멈춘다 — EndpointName만 넣어야 한다.

본문

Async Inference 핵심 메트릭

메트릭 설명
ApproximateBacklogSize 대기 중인 총 요청 수
ApproximateBacklogSizePerInstance 인스턴스당 대기 중인 요청 수 (스케일링 기준)
HasBacklogWithoutCapacity 인스턴스 0개인데 백로그가 있으면 1

ApproximateBacklogSizePerInstance가 Scale-to-Zero 정책의 핵심. TargetValue=1은 인스턴스당 백로그 1개를 목표로 한다는 의미.

1단계: Scalable Target 등록

aws application-autoscaling register-scalable-target \
  --service-namespace sagemaker \
  --resource-id "endpoint/<ENDPOINT_NAME>/variant/AllTraffic" \
  --scalable-dimension "sagemaker:variant:DesiredInstanceCount" \
  --min-capacity 0 \
  --max-capacity 2 \
  --region ap-northeast-2

min-capacity=0이 핵심. 이게 있어야 인스턴스를 0까지 줄일 수 있다.

2단계: Target Tracking Scaling Policy

aws application-autoscaling put-scaling-policy \
  --service-namespace sagemaker \
  --resource-id "endpoint/<ENDPOINT_NAME>/variant/AllTraffic" \
  --scalable-dimension "sagemaker:variant:DesiredInstanceCount" \
  --policy-name "scale-on-backlog" \
  --policy-type "TargetTrackingScaling" \
  --target-tracking-scaling-policy-configuration '{
    "TargetValue": 1.0,
    "CustomizedMetricSpecification": {
      "MetricName": "ApproximateBacklogSizePerInstance",
      "Namespace": "AWS/SageMaker",
      "Dimensions": [
        {"Name": "EndpointName", "Value": "<ENDPOINT_NAME>"}
      ],
      "Statistic": "Average"
    },
    "ScaleOutCooldown": 60,
    "ScaleInCooldown": 300
  }' \
  --region ap-northeast-2
파라미터 권장값
TargetValue 1.0
ScaleOutCooldown 30-60초
ScaleInCooldown 120-300초

함정: Dimensions에 VariantName을 넣지 말 것

올바른 설정 (EndpointName만):

"Dimensions": [
  {"Name": "EndpointName", "Value": "utterance-embedding-service-dev"}
]

잘못된 설정 (VariantName 포함):

"Dimensions": [
  {"Name": "EndpointName", "Value": "utterance-embedding-service-dev"},
  {"Name": "VariantName", "Value": "AllTraffic"}
]

VariantName을 추가하면 CloudWatch 알람이 메트릭과 매칭되지 않아 INSUFFICIENT_DATA 상태가 된다. 결과적으로 ALARM이 절대 트리거되지 않아 autoscaling이 멈춘다.

동작 흐름

요청 없음 (백로그=0) → AlarmLow → ScaleInCooldown → 인스턴스 0개
요청 도착 (백로그>0) → AlarmHigh → ScaleOutCooldown → 인스턴스 1개

디버깅 명령어

# 현재 인스턴스 수
aws sagemaker describe-endpoint \
  --endpoint-name <ENDPOINT_NAME> \
  --query 'ProductionVariants[0].{Current:CurrentInstanceCount,Desired:DesiredInstanceCount}'

# 알람 상태 (INSUFFICIENT_DATA면 Dimensions 설정 의심)
aws cloudwatch describe-alarms \
  --alarm-name-prefix "TargetTracking-endpoint/<ENDPOINT_NAME>" \
  --query 'MetricAlarms[*].{Name:AlarmName,State:StateValue}'

알람 상태:

  • OK: 정상 (임계값 이내)
  • ALARM: 트리거됨 (스케일링 실행)
  • INSUFFICIENT_DATA: 메트릭 매칭 실패 (Dimensions 오설정 가능성)

환경별 권장 설정

환경 Min Max TargetValue ScaleOut ScaleIn
dev 0 1 1.0 30초 120초
qa 0 2 1.0 60초 300초

참고