스펙큘레이티브 디코딩
스펙큘레이티브 디코딩 (Speculative Decoding)
LLM 추론에서 토큰당 지연 시간(inter-token latency) 을 줄이고 싶다면 스펙큘레이티브 디코딩(Speculative Decoding)이 강력한 기법이에요. 특히 중간~낮은 QPS(초당 쿼리), 메모리 바운드 워크로드에서 효과적이죠. 이 페이지에서 vLLM이 지원하는 스펙큘레이티브 디코딩 방법들을 개관하고, 설정 방법을 살펴볼게요.
vLLM의 스펙큘레이션 방법 (Speculation methods)
vLLM은 다양한 스펙큘레이티브 디코딩 방법을 지원해요. 모델 기반 방법(EAGLE, MTP, 드래프트 모델, PARD, MLP)이 가장 큰 지연 시간 감소를 주고, 더 단순한 방법(n-gram, suffix decoding)은 피크 트래픽 중 워크로드를 늘리지 않으면서 적당한 속도 향상을 제공해요.
지원되는 방법:
- EAGLE
- Multi-Token Prediction (MTP)
- Draft Model
- Parallel Draft Model (PARD)
- Multi-Layer Perceptron (MLP)
- N-Gram
- Suffix Decoding
- Hidden State Extraction
- Custom Proposer Backend (Experimental)
- Dynamic Speculative Decoding
- Adaptive Verification
- Per-Request Acceptance Metrics
한눈에 보는 방법 선택 (Method selection at a glance)
아래 표는 방법 선택의 출발점이에요. 실제 이득은 모델 계열, 트래픽 패턴, 하드웨어, 샘플링 설정에 따라 달라져요.
| 방법 | 낮은 QPS (지연 집약) | 높은 QPS (처리량 집약) | 비고 |
|---|---|---|---|
| EAGLE | 높은 이득 | 중~높은 이득 | 강력한 범용 모델 기반 방법 |
| MTP | 높은 이득 | 중~높은 이득 | 타겟 모델이 네이티브 MTP를 지원할 때 최고 |
| Draft model | 높은 이득 | 중간 이득 | 별도 드래프트 모델 필요 |
| Parallel Draft Model | 높은 이득 | 중~높은 이득 | 드래프트 모델 지연이 낮음 |
| MLP speculator | 중~높은 이득 | 중간 이득 | 호환 MLP 스펙큘레이터가 있을 때 좋음 |
| N-gram | 낮~중 이득 | 중간 이득 | 가볍고 활성화가 쉬움 |
| Suffix decoding | 낮~중 이득 | 중간 이득 | 추가 드래프트 모델 없음, 동적 스펙큘레이션 깊이 |
| Custom Proposer | 다양 | 다양 | 직접 만든 proposer 클래스 (실험적) |
| Dynamic SD | 높은 이득 | 기본 SD보다 높음 | RL 또는 QPS가 변동하는 워크로드에 유용 |
| Adaptive Verification | 높은 이득 | 기본 SD보다 높음 | 드래프터 신뢰도로 요청별 검증 크기 조절, 현재 DSpark 전용 |
재현 가능한 측정을 원하면 examples/features/speculative_decoding/spec_decode_offline.py나 벤치마크 CLI 가이드를 사용하세요.
커스텀 Proposer 백엔드 (Custom proposer, experimental)
method를 custom_class로 설정하고 클래스의 전체 모듈 경로를 주면, 스펙큘레이티브 디코딩용 커스텀 proposer 클래스를 꽂을 수 있어요. 커스텀 클래스는 인스턴스화 시 VllmConfig를 받고 propose 메서드를 구현해야 해요.
speculative_config.method = "custom_class"
speculative_config.model = "your_module.YourCustomProposerClass"
--speculative-config 스키마
CLI에서 --speculative-config에 JSON 객체로 스펙큘레이션 설정을 넘겨요.
vllm serve <target-model> \
--speculative-config '{
"method": "draft_model",
"model": "<draft-model>",
"num_speculative_tokens": 5
}'
같은 키를 Python에서는 LLM(..., speculative_config={...})로 받아요. 아래 테이블은 이 JSON 객체에서 흔히 쓰는 사용자용 키를 강조한 것으로, 전체 스키마 레퍼런스는 아니에요.
공통 키 (Common keys)
| 키 | 타입 | 기본값 | 허용 값 / 의미 |
|---|---|---|---|
| method | string | None | 스펙큘레이션 방법. draft_model, ngram, suffix, mtp, eagle3, dflash 등. 생략 시 구성에서 추론 |
| model | string | None | 드래프트 모델, EAGLE 헤드, 또는 보조 모델 식별자. ngram, ngram_gpu, suffix, mtp에서는 생략 가능 |
| num_speculative_tokens | integer > 0 | None | 스텝당 제안할 스펙큘레이티브 토큰 수. 모델 메타데이터에서 추론하지 못하는 방법에 필수 |
| draft_tensor_parallel_size | integer >= 1 | None | 드래프트 모델의 텐서 병렬 크기 |
| max_model_len | integer >= 1 | None | 드래프트 모델의 최대 컨텍스트 길이 |
| parallel_drafting | boolean | false | 병렬 드래프트 토큰 생성. EAGLE·draft-model 방법에서만 호환 |
| rejection_sample_method | string | standard | standard, synthetic, block |
| use_heterogeneous_vocab | boolean | false | 서로 다른 어휘의 드래프트·타겟 모델 허용. 초기화 시 토큰 수준 교집합을 만들고 드래프트 로짓을 공유 토큰으로 제한. method=draft_model에서만 호환 |
스펙큘레이티브 디코딩의 무손실 보장 (Lossless guarantees)
vLLM에서 스펙큘레이티브 디코딩은 정확도를 유지하면서 추론 효율을 높이는 게 목표예요. 무손실 보장은 세 영역으로 나뉘어요.
- 이론적 무손실: 스펙큘레이티브 샘플링은 하드웨어 수치 정밀도 한계까지 이론적으로 무손실이에요. 부동소수점 오류가 출력 분포에 약간의 변이를 만들 수는 있어요.
- 알고리즘적 무손실: vLLM의 구현은 알고리즘적으로 무손실인 것으로 검증됐어요. 주요 검증 테스트로 greedy 샘플링 동일성(스펙큘레이션 유무의 greedy 샘플링 일치)과 거부 샘플러 수렴(샘플이 타겟 분포와 일치)이 있어요.
- vLLM 로그프롭 안정성: vLLM은 현재 토큰 로그 확률(logprob)의 안정성을 보장하지 않아요. 같은 요청도 실행마다 출력이 달라질 수 있죠.
알려진 기능 비호환성 (Known feature incompatibility)
- 스펙큘레이티브 디코딩은 일부 다른 기능과 함께 쓸 때 호환되지 않을 수 있어요. 자세한 항목은 원문을 참고하세요. (확인 필요)