스펙큘레이티브 디코딩

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

LLM 추론에서 토큰당 지연 시간(inter-token latency) 을 줄이고 싶다면 스펙큘레이티브 디코딩(Speculative Decoding)이 강력한 기법이에요. 특히 중간~낮은 QPS(초당 쿼리), 메모리 바운드 워크로드에서 효과적이죠. 이 페이지에서 vLLM이 지원하는 스펙큘레이티브 디코딩 방법들을 개관하고, 설정 방법을 살펴볼게요.

출처: vLLM 공식 문서 — Speculative Decoding

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)

methodcustom_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)

  1. 스펙큘레이티브 디코딩은 일부 다른 기능과 함께 쓸 때 호환되지 않을 수 있어요. 자세한 항목은 원문을 참고하세요. (확인 필요)

더 알아보기 (Learn more)