동적 스펙큘레이티브 디코딩

동적 스펙큘레이티브 디코딩 (Dynamic Speculative Decoding)

스펙큘레이티브 디코딩(SD)은 보통 고정된 수의 드래프트 토큰(K)을 검증해요. 그런데 동시성(concurrency)이 변하는 워크로드에서는 고정 K가 최선이 아닐 수 있어요. 동적 스펙큘레이티브 디코딩(Dynamic SD)은 동시성 범위에 따라 K를 조절해서 SD의 이점을 계속 누리게 해주는 기법이에요. 이 페이지에서 그 원리와 설정을 살펴볼게요.

출처: vLLM 공식 문서 — Dynamic Speculative Decoding

왜 필요한가 (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 값으로 폴백해요.

더 알아보기 (Learn more)