Suffix Decoding
Suffix Decoding (접미사 디코딩)
Suffix Decoding은 마지막 n개의 생성 토큰을 사용해 패턴 매칭으로 드래프트 토큰을 생성하는 추측 디코딩 방법이에요. n-gram과 비슷하지만, 프롬프트와 이전 생성 모두에서 패턴을 매칭하고, 빈도 수(frequency counts)를 사용해 가장 가능성 높은 연속을 제안하며, 요청마다 적응형 토큰 수를 추측해 더 나은 수락율을 얻어요. 기술 보고서에서 자세한 내용을 확인할 수 있어요.
출처: 문서
본문
Suffix Decoding은 n-gram과 달리 다음 세 가지 특징이 있어요:
- 프롬프트와 이전 생성 모두에서 패턴 매칭을 할 수 있어요.
- 빈도 수(frequency counts)를 사용해 가장 가능성 높은 연속을 제안해요.
- 각 요청·각 반복에서 적응형(adaptive) 토큰 수를 추측해 더 나은 수락율을 얻어요.
코드 편집, 에이전트 루프(예: self-reflection, self-consistency), RL 롤아웃처럼 반복이 많은 작업에서 더 나은 성능을 낼 수 있어요.
참고 — Arctic Inference 설치: Suffix Decoding은 Arctic Inference가 필요해요.
pip install arctic-inference로 설치할 수 있어요.
참고 — 추측 토큰 수: Suffix Decoding은 각 요청에 대해 디코딩 스텝마다 동적 토큰 수를 추측해요. 따라서
num_speculative_tokens설정은 최대 추측 토큰 수를 지정해요.16이나32(기본값)처럼 높은 값을 사용하는 것이 좋아요.
오프라인 예시
from vllm import LLM, SamplingParams
prompts = ["The future of AI is"]
sampling_params = SamplingParams(temperature=0.8, top_p=0.95)
llm = LLM(
model="Qwen/Qwen3-8B",
tensor_parallel_size=1,
speculative_config={
"method": "suffix",
"num_speculative_tokens": 32,
},
)
outputs = llm.generate(prompts, sampling_params)
for output in outputs:
prompt = output.prompt
generated_text = output.outputs[0].text
print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
주요 설정 키
| Key | Type | Default | 의미 |
|---|---|---|---|
method |
string | None | suffix로 설정 |
num_speculative_tokens |
integer > 0 | 32 권장 | 최대 추측 토큰 수 (동적으로 조절되므로 상한값) |
suffix_decoding_max_tree_depth |
integer | 24 | 접두사 매칭과 추측 트리의 최대 결합 깊이 |
suffix_decoding_max_cached_requests |
integer | 10000 | 전역 suffix 트리에 캐시하는 최대 요청 수 (0이면 전역 캐시 비활성화) |
suffix_decoding_max_spec_factor |
float | 1.0 | 추측 길이를 접두사 매칭 길이의 배수로 제한 |
suffix_decoding_min_token_prob |
float | 0.1 | 토큰을 추측하기 위해 필요한 최소 추정 토큰 확률 |
Suffix Decoding은 별도의 드래프트 모델이 필요 없고 동적 추측 깊이를 가지므로, 반복 패턴이 많은 워크로드에서 가볍게 지연 시간과 처리량을 개선할 수 있어요.