vLLM 0.6대에 들어 speculative decoding이 꽤 안정됐다. 드래프트 모델로 작은 거 쓰고, 타깃 모델로 검증하는 구조.
원리 요약
드래프트가 여러 토큰을 미리 예측 → 타깃이 한번의 forward로 그 토큰들을 다 검증 → 일치하는 만큼 수용, 불일치 지점에서 재시작. 평균적으로 타깃 호출 횟수가 줄어 latency 감소.
세팅
- 타깃: Llama 3.1 70B Instruct (FP8, H100 4장 tp=4)
- 드래프트: Llama 3.2 1B Instruct
vllm serve meta-llama/Llama-3.1-70B-Instruct \
--tensor-parallel-size 4 --quantization fp8 \
--speculative-model meta-llama/Llama-3.2-1B-Instruct \
--num-speculative-tokens 5
결과
| 조건 | TTFT | tok/s |
|---|---|---|
| no spec | 280 ms | 74 |
| spec (k=5) | 310 ms | 118 |
| spec (k=8) | 330 ms | 127 |
throughput 약 1.6~1.7배. TTFT가 살짝 오르지만 체감 안 됨(인터랙티브 채팅).
주의
- 드래프트가 너무 다른 분포면 수용률이 낮아져서 오히려 느려짐. 같은 제품군(같은 토크나이저, 가까운 학습셋)이 중요.
- temperature 높은 케이스(창의적 생성)는 수용률 하락. 코드·문서 생성에서 이점이 크고, 시적 생성에선 덜.
- num_speculative_tokens를 너무 키우면 이득이 역전됨. 5~7 근처가 우리 sweet spot.
비용
GPU는 그대로. throughput 1.6배 = 비용 1/1.6. 같은 QPS 감당에 인스턴스 수를 줄일 수 있어서 월 단위로 실질 절감. 특히 출력 길이 긴 요약 같은 워크로드에 드라마틱.
spec decoding은 "공짜 점심"처럼 보이지만 드래프트/타깃 조합·분포 매칭이 관건. 운영 전 워크로드별 수용률부터 측정할 것.