요청별 수용 지표

요청별 수용 지표 (Per-Request Acceptance Metrics)

스펙큘레이티브 디코딩을 켰다면, 이제 그 게 실제로 얼마나 효과가 있는지 알고 싶어지죠. vLLM은 서버 전체 집계 지표뿐 아니라 요청별 수용 지표(per-request acceptance metrics) 를 응답에 담아 줄 수 있어요. 이 지표로 개별 요청의 평균 수용 길이와 수용된 드래프트 길이 분포를 계산할 수 있습니다. 이 페이지에서 그 설정과 응답 형식을 살펴볼게요.

출처: vLLM 공식 문서 — Per-Request Acceptance Metrics

개요와 주의 (Overview)

metrics.speculative_decoding/metrics에서 노출되는 서버 집계 spec-decode 지표를 보완하는, 개별 요청 기준의 지표예요. 다만 실험적(experimental) 이라 향후 릴리스에서 형태가 바뀔 수 있어요. 이 기능에 의존한다면 vLLM 버전을 고정해 두는 걸 권장해요.

활성화 (Enabling)

--per-request-spec-decode-metricssummary 또는 detailed로 설정해 서버를 시작해요(기본값 none).

vllm serve <target-model> \
    --speculative-config '{"method": "ngram", "num_speculative_tokens": 3, "prompt_lookup_min": 1, "prompt_lookup_max": 3}' \
    --per-request-spec-decode-metrics summary
레벨 동작
none (기본) 수집 없음, 응답은 변경 없음
summary 요청별 수용 지표
detailed summary + 정렬된 스텝별 배열

수집은 소스에서 게이팅돼서, none이면 아무것도 누적되지 않아요.

응답 형식 (Response format)

수용 지표는 타이밍 요청별 지표와 함께 최상위 metrics 객체를 공유해요 — metrics.speculative_decoding이 타이밍 필드 옆에 자리잡죠. 타이밍과 마찬가지로 단일 시퀀스 요청만 대상이라, n > 1 요청에서는 null로 보고돼요.

summary 응답의 metrics는 이런 모습이에요.

{
  "choices": [ ... ],
  "usage": { ... },
  "metrics": {
    "speculative_decoding": {
      "mean_acceptance_length": 1.2325581395348837,
      "draft_acceptance_rate": 0.07751937984496124,
      "acceptance_histogram": [39, 1, 0, 3],
      "num_spec_steps": 43,
      "num_accepted_draft_tokens": 10,
      "num_draft_tokens": 129,
      "num_spec_tokens": 3
    }
  }
}
필드 설명
mean_acceptance_length 검증 스텝당 평균 방출 토큰 수(보너스 토큰 포함): 1 + num_accepted_draft_tokens / num_spec_steps. 범위는 1.0(아무것도 수용 안 됨)부터 num_spec_tokens + 1
draft_acceptance_rate 제안된 드래프트 토큰 중 수용된 비율: num_accepted_draft_tokens / num_draft_tokens
acceptance_histogram 길이 num_spec_tokens + 1의 밀집 리스트. 인덱스 j는 정확히 j개의 드래프트 토큰을 수용한 스텝 수. 항상 수용되는 보너스 토큰은 제외
num_spec_steps 이 요청의 검증 스텝 수(히스토그램의 합)
num_accepted_draft_tokens 수용된 총 드래프트 토큰(보너스 토큰 제외)
num_draft_tokens 구조화 출력 제약으로 무효화된 드래프트를 뺀, 제안된 총 드래프트 토큰
num_spec_tokens 설정된 num_speculative_tokens(k), 즉 스텝당 최대 드래프트 길이

detailed에서는 검증 스텝당 항목 하나씩, 두 개의 정렬된 배열이 추가돼요.

필드 설명
per_step_accepted 각 스텝에서 수용된 드래프트 개수
per_step_drafted 각 스텝에서 제안된 드래프트 개수. 적응형 스펙큘레이션 같은 가변 길이 드래프팅을 스키마 변경 없이 표현

metrics.speculative_decoding--per-request-spec-decode-metricssummary/detailed이고, 스펙큘레이티브 디코딩이 켜져 있으며, n == 1일 때 존재해요(요청이 아무것도 드래프트하지 않았다면 all-zero 히스토그램). 그 외에는 null이에요.

스트리밍 (Streaming)

스트리밍 응답에서 metrics(그리고 speculative_decoding)는 마지막 usage 청크에 실려 와요. 이 청크는 usage 보고가 켜져 있을 때만 방출되므로, stream_options.include_usage: true를 설정하거나 --enable-force-include-usage로 서버를 시작해야 해요.

Prometheus 지표와의 관계 (Relationship to Prometheus metrics)

요청별 필드는 /metrics의 서버 집계 spec-decode 카운터의 개별 요청 대응물이에요. 이걸 보고한 단일 시퀀스 요청에 걸쳐 합치면 집계 카운터와 조화돼요(n > 1 요청도 세는 집계 카운터들 때문에 총계는 모든 n == 1 워크로드에서만 일치해요).

요청별 필드 (합계) Prometheus 카운터
num_spec_steps vllm:spec_decode_num_drafts_total
num_draft_tokens vllm:spec_decode_num_draft_tokens_total
num_accepted_draft_tokens vllm:spec_decode_num_accepted_tokens_total

더 알아보기 (Learn more)