콘텐츠로 이동

Speculative Decoding

Model implementation 지원

이 기능은 vllm model implementation에서만 동작합니다. 기능별 지원 여부는 Feature Matrix에 모두 정리되어 있습니다. 설정하기 전에 확인하는 것을 권합니다.

개요

Decode는 forward pass 한 번에 토큰 하나를 만들기 때문에, 다음 토큰이 얼마나 예측하기 쉬운지와 무관하게 매 스텝이 전체 pass 비용을 지불합니다. Speculative decoding은 더 저렴한 proposer로 여러 토큰을 미리 제안한 뒤, target 모델의 pass 한 번으로 이를 검증하고 target이 동의하는 가장 긴 앞부분을 채택합니다. 제안된 토큰이 충분히 많이 채택되면 speculative decoding이 토큰 간 지연을 줄일 수 있으므로, NPU가 아직 포화되지 않은 중간~낮은 요청량 구간에서 가장 유용합니다.

RBLN vLLM은 이를 upstream vLLM과 동일하게 speculative_config로 설정합니다.

지원하는 방식

method Proposer 비고
ngram Draft 없음 N-gram. 프롬프트와 지금까지의 출력에서 반복을 찾습니다
suffix Draft 없음 Suffix decoding. 요청 이력으로 만든 suffix tree와 대조합니다
eagle Draft 모델 EAGLE
eagle3 Draft 모델 EAGLE3
medusa Draft 모델 Medusa
mtp Draft 모델 Multi-token prediction. 대상 체크포인트의 MTP 레이어를 draft로 사용합니다

Draft가 없는 방식은 별도의 체크포인트가 필요하지 않아 가장 부담 없이 시도할 수 있습니다. 반복을 찾아 speculate하므로 입력이 반복적이거나 인용이 많은 워크로드에서 효과적이고, 자유롭게 생성되는 텍스트에서는 약합니다. Draft 모델 방식은 target에 맞는 draft 체크포인트가 필요합니다.

여기에 없는 upstream vLLM의 방식은 RBLN NPU에서 검증되지 않았습니다.

설정

LLM(...)에 speculative_config를 전달하거나, vllm serve에 같은 키를 JSON으로 담아 --speculative-config로 전달합니다.

공통 키:

method
사용할 proposer입니다. 위 표의 method 값 중 하나를 지정합니다.
model
Draft 체크포인트입니다. Draft 모델 방식에서 필수이며, draft가 없는 방식에서는 생략합니다.
num_speculative_tokens
Proposer가 스텝마다 제안할 토큰 수입니다. 값이 클수록 스텝당 절약할 수 있는 양이 커지지만, 제안이 거부될 때 버리는 계산도 함께 커집니다.

Draft가 없는 방식의 전용 키:

prompt_lookup_min / prompt_lookup_max
N-gram 전용입니다. Proposer가 대조할 n-gram의 최소 길이와 최대 길이입니다.
suffix_decoding_max_spec_factor
Suffix decoding 전용입니다. 찾은 일치 구간에 비례해 speculate할 토큰 수를 조정합니다.

Draft 체크포인트가 필요 없는 n-gram 예시:

1
2
3
vllm serve <MODEL_ID> \
  --model-impl vllm \
  --speculative-config '{"method":"ngram","prompt_lookup_min":3,"prompt_lookup_max":5,"num_speculative_tokens":3}'

Draft 체크포인트를 target과 함께 쓰는 EAGLE 예시:

1
2
3
vllm serve <MODEL_ID> \
  --model-impl vllm \
  --speculative-config '{"method":"eagle","model":"<DRAFT_MODEL_ID>","num_speculative_tokens":3}'

같은 설정을 오프라인 API로 지정하는 경우:

from vllm import LLM

llm = LLM(
    model="<MODEL_ID>",
    speculative_config={
        "method": "eagle",
        "model": "<DRAFT_MODEL_ID>",
        "num_speculative_tokens": 3,
    },
)

알려진 비호환 사항

  • transformers(optimum) model implementation. Speculative decoding은 vllm model implementation이 필요하며, 이 구현에서 speculative_config를 전달하면 엔진이 이를 거부합니다.
  • 비동기 스케줄링. 비동기 경로가 스텝마다 샘플링된 토큰 하나를 다음 스텝으로 전달하는 구조라 둘을 함께 쓸 수 없습니다. 둘 다 요청하면 엔진이 비동기 스케줄링을 비활성화하고 경고를 출력한 뒤 동기적으로 실행합니다.