Per-Request Acceptance Metrics
Per-Request Acceptance Metrics (요청별 수락 지표)
추측 디코딩이 활성화되면 vLLM은 응답의 metrics.speculative_decoding 아래에 요청별 수락 지표를 보고할 수 있어요. 이를 통해 클라이언트는 개별 요청에 대한 평균 수락 길이(mean acceptance length)와 수락된 드래프트 길이 분포를 계산할 수 있고, /metrics에 노출되는 서버 집계 spec-decode 지표를 보완해요.
출처: 문서
본문
실험 기능:
metrics.speculative_decoding은 실험 기능이며 향후 릴리스에서 형태가 바뀔 수 있어요. 이 값에 의존한다면 vLLM 버전을 고정(pin)하세요.
활성화
서버를 --per-request-spec-decode-metrics 값을 summary 또는 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
| Level | 동작 |
|---|---|
none (기본값) |
수집하지 않음. 응답은 변경 없음 |
summary |
요청별 수락 지표 |
detailed |
summary에 순서 있는 스텝별 배열 추가 |
수집은 소스에서 게이트(gate)돼요. none이면 아무것도 누적되지 않아요.
응답 형식
수락 지표는 타이밍 요청별 지표와 최상위 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
}
}
}
| Field | 설명 |
|---|---|
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의 밀집(dense) 리스트. 인덱스 j는 정확히 j개의 드래프트 토큰을 수락한 스텝 수. 항상 수락되는 보너스 토큰은 제외 |
num_spec_steps |
이 요청의 검증 스텝 수 (히스토그램의 합) |
num_accepted_draft_tokens |
보너스 토큰을 제외한 총 수락 드래프트 토큰 수 |
num_draft_tokens |
구조화 출력 제약으로 무효화된 드래프트를 뺀 총 제안 드래프트 토큰 수 |
num_spec_tokens |
설정된 num_speculative_tokens(k), 즉 스텝당 최대 드래프트 길이 |
detailed에서는 검증 스텝 하나당 하나씩, 순서 있는 두 배열이 추가돼요:
| Field | 설명 |
|---|---|
per_step_accepted |
각 스텝에서 수락된 드래프트 수 |
per_step_drafted |
각 스텝에서 제안된 드래프트 수. 스텝별 유효 제안 길이를 기록하므로, 가변 길이 드래프팅(예: adaptive speculation)이 스키마 변경 없이 표현돼요 |
metrics.speculative_decoding은 --per-request-spec-decode-metrics가 summary/detailed이고, 추측 디코딩이 활성화되어 있으며, n == 1일 때 존재해요 (요청이 아무것도 드래프트하지 않았다면 전부 0인 히스토그램). 그 외에는 null이에요.
스트리밍
스트리밍 응답에서 metrics(스펙큘레이티브 디코딩 포함)는 마지막 usage 청크에 실려 와요. usage 청크는 usage 보고가 활성화될 때만 방출되므로, stream_options.include_usage: true를 설정하거나 서버를 --enable-force-include-usage로 시작하세요.
Prometheus 지표와의 관계
요청별 필드는 /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 |