← Lab 전체 데모

#002 · Speculative Decoding · 2026-07

공짜 점심? 추측이 맞을 때만

작은 draft 모델이 다음 토큰 여러 개를 한꺼번에 제안하면, 큰 target 모델이 한 번의 병렬 검증으로 확인한다 — target이 어차피 뽑았을 앞부분은 채택하고, 어긋나는 순간 버린다. 출력 분포는 target 단독과 동일(무손실)하다. 하지만 실제로 빨라지느냐는 draft 제안이 채택되는 비율(수락률)에 전적으로 달렸다 — 자주 맞으면 큰 모델 호출이 줄어 날아가고, 자주 틀리면 검증 오버헤드가 이득을 넘어 오히려 느려진다. 아래는 홈랩에서 직접 측정해 바로 그 손익 경계에 걸친 결과를 토큰 단위로 재생한 기록이다.

📄 논문

Fast Inference from Transformers via Speculative Decoding (Leviathan, Kalman & Matias, 2023). draft 모델이 γ개 토큰을 자기회귀로 제안 → target이 한 번의 forward로 그 γ개를 병렬 검증 → 수정된 rejection sampling으로 앞부분을 채택하고 첫 불일치에서 잘라낸다. 채택된 만큼 + 보너스 1개를 target forward 한 번에 확정한다. 단, draft를 돌리는 비용도 공짜가 아니라서 손익분기 수락률이 존재한다.

⚙️ 코드

측정 데이터 로딩 중…

💡 배운 것

측정 데이터 로딩 중…

결과 한눈에

토큰 생성 속도 (tok/s) — 프롬프트별

막대가 길수록 빠름. speculative 막대가 baseline보다 길면 순이득, 짧으면 draft 오버헤드가 이득을 잡아먹은 것.

표로 보기

타임라인 리플레이 — 토큰이 달리는 걸 지켜보기

같은 프롬프트를 두 구성으로, 실측 속도에 맞춰 재생합니다. 아래 토큰 스트립은 라운드마다: 초록 = target이 채택한 draft 토큰, 보라 = target의 보너스 토큰, 빨강 = 거절된 draft 추측(폐기). 거절이 나오면 그 라운드는 거기서 끝납니다.

baseline 0 tok · 0.00 s
speculative 0 tok · 0.00 s

🐍 계산 코드 직접 실행 — 고쳐서 다시 계산해보기

아래 파이썬은 당신의 브라우저 안(WebAssembly·Pyodide)에서 실행됩니다 — 서버로 아무것도 전송되지 않습니다. 실측 runs가 미리 로드돼 있습니다. speculative decoding의 비용 모델을 직접 바꿔보세요: draft가 3배 싸다면? γ(draft 길이)가 8이 아니라 4라면 예상 속도 향상은 얼마나 될까?

여기에 실행 결과가 표시됩니다.

어떻게 돌리나 — 명령 한 줄

# llama.cpp — draft 모델 하나만 더 붙이면 된다 (-md / --spec-draft-n-max)
llama-speculative \
  -m  Qwen2.5-7B-Instruct-Q4_K_M.gguf    \  # target (검증자)
  -md Qwen2.5-0.5B-Instruct-Q4_K_M.gguf  \  # draft  (제안자)
  --spec-draft-n-max 8 -ngl 99 -ngld 99  \
  -n 256 -p "..."
# → 로그에 tokens/sec 와 n_drafted / n_accepted (수락률)이 찍힌다
정직한 각주
  • 측정 데이터 로딩 중…
  • 하드웨어/모델 치환: 원 스펙은 RTX 3090 + 27B/8B였지만, 실제 실행 환경은 16GB 애플 실리콘 Mac Mini(NVIDIA GPU 없음)라 27B+8B를 못 올린다. 들어맞는 같은 계열 실모델 쌍(target 7B, draft 0.5B, 둘 다 Metal 오프로드)으로 치환해 실측했다. 큰 장비에선 절대 tok/s가 다르겠지만, speculative vs baseline 비교와 수락률 방법론은 그대로 유효하다.
  • speculative decoding은 무손실이다 — 출력 분포가 target 단독과 동일하다. 품질을 바꾸는 게 아니라, draft 연산을 써서 큰 모델 forward 횟수를 줄이는 지연시간 레버다.
  • 수락률은 draft가 target과 얼마나 잘 일치하냐에 달려 있다 — 코드/정형 텍스트는 잘 채택되고, 열린 산문은 덜 채택된다. 아주 작은 0.5B draft는 자주 어긋나서, 이번 결과의 이득이 들쭉날쭉한 이유다.
  • 표본이 작다(프롬프트 5개, 단일 시드, 생성 상한 256토큰 — 일부는 EOS로 더 일찍 종료). 벤치마크가 아니라 경향 데모다.
  • 타임라인 스트립은 재구성이다 — 실측 처리량·수락률을 시드 기반 채택/거절 패턴으로 재생한 것으로, 토큰별 원본 로그는 아니다. tok/s와 수락률 수치 자체는 실측값이다.