공짜 점심? 추측이 맞을 때만
작은 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 추측(폐기). 거절이 나오면 그 라운드는 거기서 끝납니다.
🐍 계산 코드 직접 실행 — 고쳐서 다시 계산해보기
아래 파이썬은 당신의 브라우저 안(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와 수락률 수치 자체는 실측값이다.