동적 스펙큘레이티브 디코딩
동적 스펙큘레이티브 디코딩 (Dynamic Speculative Decoding)
스펙큘레이티브 디코딩(SD)은 보통 고정된 수의 드래프트 토큰(K)을 검증해요. 그런데 동시성(concurrency)이 변하는 워크로드에서는 고정 K가 최선이 아닐 수 있어요. 동적 스펙큘레이티브 디코딩(Dynamic SD)은 동시성 범위에 따라 K를 조절해서 SD의 이점을 계속 누리게 해주는 기법이에요. 이 페이지에서 그 원리와 설정을 살펴볼게요.
왜 필요한가 (Why is Dynamic SD needed?)
SD 방법은 디코딩 중 각 시퀀스에 대해 K개의 토큰을 검증해야 해요. 배치 크기(BS)가 커지면 실제 배치 크기는 BS×K가 되어 검증 중 컴퓨트 요구량이 늘어나죠. 이 BS×K가 임계 배치 크기를 넘어서면 SD가 디코드 속도(TPOT)에 오히려 나쁜 영향을 주게 됩니다. DSD는 K를 최적값으로 튜닝해서 SD의 이점을 계속 누리게 해줘요.
사용 사례 (Use cases)
- 변동 동시성 워크로드: 같은 배포에서 동시성이 올라가면 K가 줄어들어요.
- RL 롤아웃: 높은 BS로 시작하지만, 롤아웃 말미에는 소수의 long-tail 요청이 많은 토큰을 생성하면서 말려드는 상황. 이때 롤아웃 끝에서 K가 올라가요.
--speculative-config 스키마
Dynamic SD를 쓰려면 SD 방법의 config에 num_speculative_tokens_per_batch_size(리스트의 리스트)를 추가해요. 항목은 [start_bs, end_bs, optimal_K]로, 동시성이 [start_bs, end_bs] 범위 안에 있을 때 optimal_K개의 드래프트 토큰을 쓴다는 뜻이에요.
--speculative-config '{
"method": "eagle",
"model": "yuhuili/EAGLE-LLaMA3.1-Instruct-8B",
"num_speculative_tokens": 3,
"num_speculative_tokens_per_batch_size": [
[1, 64, 3],
[65, 128, 1],
[129, 512, 0]
]
}'
위 설정의 의미는:
- 동시성 범위 [1, 64] → K=3 사용
- 동시성 범위 [65, 128] → K=1 사용
- 동시성 범위 [129, 512] → K=0 사용, 즉 드래프트 토큰을 생성하지 않음
온라인 예시 (Online examples)
Dynamic SD Eagle Drafter
VLLM_USE_V2_MODEL_RUNNER=0 vllm serve meta-llama/Llama-3.1-8B-Instruct \
--speculative-config '{
"method": "eagle",
"model": "yuhuili/EAGLE-LLaMA3.1-Instruct-8B",
"num_speculative_tokens": 3,
"num_speculative_tokens_per_batch_size": [
[1, 64, 3],
[65, 128, 1],
[129, 512, 0]
]
}'
Dynamic SD Eagle3 Drafter
VLLM_USE_V2_MODEL_RUNNER=0 vllm serve meta-llama/Llama-3.1-8B-Instruct \
--speculative-config '{
"method": "eagle3",
"model": "yuhuili/EAGLE3-LLaMA3.1-Instruct-8B",
"num_speculative_tokens": 3,
"num_speculative_tokens_per_batch_size": [
[1, 16, 5],
[17, 32, 4],
[33, 64, 3],
[65, 128, 1],
[129, 512, 0]
]
}'
제한 사항 (Limitations)
- Eagle, Eagle-3, DFlash로 테스트됐어요. 다른 SD 방법은 기본적으로 동작할 수도 있고 아닐 수도 있어요.
- 전체 Cudagraph는 Model Runner V2에서만 동작해요. MRv1은 이 기능과 함께 piece-wise cuda graph만 지원해요.
- 데이터 병렬(
--data-parallel-size > 1)과는 호환되지 않아요. 각 DP 랭크가 독립적으로 스케줄하므로, 랭크마다 다른 K 값을 고르면 DP 집단 발산과 교착 상태가 생길 수 있어요. DP가 켜지면 vLLM이 자동으로num_speculative_tokens_per_batch_size를 비활성화하고 정적num_speculative_tokens값으로 폴백해요.