트레이스 재생

트레이스 재생 (Trace Replay)

트레이스 재생은 디코딩 중에 엔진이 미리 정해진 토큰 시퀀스를 내보내도록 강제하면서, 모델의 변경되지 않은 logit 분포에서 실제 logprob을 계산하게 합니다. 주요 용도는 서로 다른 구성 간 logprob 분포를 비교하는 것입니다.

출처: 문서

본문

트레이스 재생은 디코딩 중에 엔진이 미리 정해진 토큰 시퀀스를 내보내도록 강제하면서, 모델의 수정되지 않은 logit 분포에서 실제 logprob을 계산합니다. 주요 용도는 서로 다른 구성 간 logprob 분포 비교입니다:

  • 추론 구성 비교 (Inference config diff): 같은 모델에 대해 서로 다른 양자화 방식, tensor parallelism 레이아웃, 어텐션 백엔드 간 logprob 비교
  • 학습 vs 추론 비교 (Train vs inference diff): 학습 시점 토큰 시퀀스를 추론 엔진으로 재생해, 트레이닝과 서빙 프레임워크 간 수치 차이로 인한 logprob 발산을 감지

요구사항 (Requirements)

트레이스 재생은 요청별 트레이스 버퍼를 예약하므로 기본적으로 꺼져 있습니다. --enable-trace-replay(또는 LLM(..., enable_trace_replay=True))로 활성화합니다. 모델 러너 V2에서만 지원되며, 두 조건 중 하나라도 충족되지 않으면 요청이 거부됩니다.

사용법 (Usage)

from vllm import LLM, SamplingParams

llm = LLM(model="Qwen/Qwen3-0.6B", enable_trace_replay=True)

# Token sequence captured from a previous run or training log
trace_tokens = [15, 284, 1026, 374]

params = SamplingParams(
    trace_decode_token_ids=trace_tokens,
    logprobs=5,
)
outputs = llm.generate(["Once upon a time"], sampling_params=params)

for token, logprob in zip(
    outputs[0].outputs[0].token_ids,
    outputs[0].outputs[0].logprobs,
):
    print(f"token={token}  logprob={logprob[token].logprob:.4f}")

출력 토큰은 항상 [15, 284, 1026, 374]가 됩니다. logprob은 현재 추론 구성에서 각 강제 토큰에 대한 모델의 실제 확률을 반영합니다.

구성을 비교하려면 두 엔진 설정에 같은 트레이스를 실행하고 per-token logprob을 diff하세요.

동작 (Behavior)

trace_decode_token_ids가 설정되면:

  • max_tokens가 자동으로 트레이스 길이로 설정됩니다.
  • 트레이스가 프롬프트 길이를 감안해 max_model_len에 들어가지 않으면 잘립니다.
  • 모든 정지 조건(EOS, stop 문자열, stop 토큰 ID)이 비활성화됩니다.
  • 생성은 정확히 트레이스 토큰을 만든 뒤 멈춥니다.

제한 사항 (Limitations)

trace_decode_token_ids는 다음 기능과 호환되지 않습니다(ValueError 발생):

기능 이유
n > 1 트레이스 재생은 단일 결정적 시퀀스를 만듦
prompt_logprobs 확장된 logit 레이아웃이 트레이스 커널 인덱싱과 충돌
Speculative decoding 멀티 토큰 추측이 단일 토큰 트레이스 스테핑과 충돌
Structured outputs 문법 제약이 강제 토큰 주입과 충돌
repetition_detection 트레이스에서 반복 패턴이 나오면 요청을 종료함
thinking_token_budget Logit masking이 트레이스 토큰의 logprob을 손상
bad_words Logit masking이 트레이스 토큰의 logprob을 손상

더 알아보기 (Learn more)