Suffix Decoding

Suffix Decoding (접미사 디코딩)

Suffix Decoding은 마지막 n개의 생성 토큰을 사용해 패턴 매칭으로 드래프트 토큰을 생성하는 추측 디코딩 방법이에요. n-gram과 비슷하지만, 프롬프트와 이전 생성 모두에서 패턴을 매칭하고, 빈도 수(frequency counts)를 사용해 가장 가능성 높은 연속을 제안하며, 요청마다 적응형 토큰 수를 추측해 더 나은 수락율을 얻어요. 기술 보고서에서 자세한 내용을 확인할 수 있어요.

출처: 문서

본문

Suffix Decoding은 n-gram과 달리 다음 세 가지 특징이 있어요:

  1. 프롬프트와 이전 생성 모두에서 패턴 매칭을 할 수 있어요.
  2. 빈도 수(frequency counts)를 사용해 가장 가능성 높은 연속을 제안해요.
  3. 각 요청·각 반복에서 적응형(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은 별도의 드래프트 모델이 필요 없고 동적 추측 깊이를 가지므로, 반복 패턴이 많은 워크로드에서 가볍게 지연 시간과 처리량을 개선할 수 있어요.

더 알아보기 (Learn more)