
Speculative Decoding 설명: 왜 7개의 토큰을 생성하는 비용이 1개와 같을 수 있는가
요약
Speculative Decoding이 LLM 추론 속도를 높이는 원리를 GPU 하드웨어의 메모리 로딩 특성을 중심으로 설명합니다. 추가 토큰을 생성하더라도 가중치 로딩 비용은 동일하다는 점을 활용해 연산 효율을 극대화하는 방법을 다룹니다.
핵심 포인트
- LLM 추론 병목은 연산이 아닌 가중치 로딩(Memory Bound)에 있음
- 행렬 크기가 커져도 가중치(Weights)는 메모리에서 단 한 번만 로드됨
- Speculative Decoding은 하드웨어적 이득을 활용한 속도 향상 기법임
- 추가 토큰 처리는 실제 시간 측면에서 비용이 거의 들지 않음
이 글은 쉬운 언어로 설명된 삽화 중심의 해설서입니다. 추론 (Inference)에 대한 배경지식이 없어도 읽을 수 있습니다. 모든 개념은 먼저 일상적인 비유(추측하는 작은 모델과 채점하는 큰 모델, 창고, 트럭, 작업장 등)로 제시된 후 수학적으로 설명되며, 등장하는 모든 공식 옆에는 쉬운 영어 번역이 함께 제공됩니다. 직관을 중심에 두기 위해 일부 구간에서는 의도적으로 단순화하였으며, 엄밀한 증명은 참고 문헌의 논문들을 확인하시기 바랍니다. 원문 논문을 읽다가 어려움을 느끼셨다면, 이 글이 그 입문 경로가 되어줄 것입니다.
🔑 모든 것을 이해하게 만드는 단 한 문장
왜 LLM 추론 (Inference)은 느리고, 왜 Speculative Decoding은 이를 빠르게 만드는가? 핵심은 단 한 문장으로 요약됩니다: 행렬 (Matrix)의 크기를 키우면 GPU의 곱셈 연산량은 늘어나지만, 행렬의 크기와 상관없이 단 한 번의 행렬 곱셈(Matrix Multiplication)은 가중치 (Weights)를 정확히 한 번만 로드합니다. 연산량이 많아진다고 해서 로딩이 늘어나는 것은 아닙니다. 그리고 LLM 추론에서 거의 모든 시간은 로딩 (GPU 메모리에서 연산 유닛으로 가중치를 이동시키는 과정)에 소요되는 반면, 연산 (Compute)은 비용이 거의 들지 않습니다. 따라서 몇 개의 추가 토큰을 처리하는 것은 실제 시간 (Wall-clock time) 측면에서 비용이 거의 들지 않습니다. 이것은 알고리즘적인 트릭이 아니라, GPU 하드웨어의 물리적 사실입니다. Speculative Decoding이 제공하는 모든 속도 향상은 바로 이 하드웨어적 이득을 실현하는 것입니다.
구체적인 예시: "the cat sat on the red mat"라는 문장은 그 자체로 하나의 행렬입니다. 각 토큰은 먼저 숫자의 행 (임베딩 (Embedding), 예를 들어 $d$ 차원)으로 변환됩니다. 이 7개의 행을 쌓으면 $7 imes d$ 행렬 $X$가 됩니다:
┌ ┐
the │ 0.12 -0.83 0.05 0.47 … │
cat │ -0.31 0.22 0.68 -0.10 … │
...
행(Rows) = 토큰 (여기서는 7개). 문장이 길어질수록 더 많은 행과 더 많은 곱셈이 필요하지만, 이 전체 블록 X를 가중치 행렬 W와 곱하는 과정에서 W는 메모리로부터 정확히 단 한 번 로드됩니다. 이것이 바로 "더 많은 로딩이 아닌, 더 많은 연산(more compute, not more loading)"이 실제로 어떻게 구현되는지를 보여주는 모습입니다. (이스터 에그: 두 개의 "the" 행은 동일합니다. 어텐션(attention)이 관여하기 전에는 동일한 토큰이며, 동일한 임베딩(embedding) 행입니다.)
문맥(Context): 이것은 2부작 시리즈 중 기술적 심층 분석(technical deep-dive) 파트입니다. 1부에서는 Speculative Decoding이 2025~2026년 LLM 추론(inference) 직무에서 가장 과소평가된 기술적 틈새 영역 중 하나라고 주장하며, 핵심 아이디어("작은 모델이 추측하고, 큰 모델이 채점한다")를 소개했습니다. 이번 파트에서는 전체 수학적 원리(거부 샘플링(rejection-sampling) 증명 포함), 지난 2년간의 주요 연구 방향, 그리고 실제 면접 질문 목록을 다룹니다.
읽는 법: 섹션 1은 기초입니다. 섹션 2는 수학(공식이 등장하지만, 모든 공식에 쉬운 영어 설명이 제공됩니다)입니다. 섹션 3은 연구 지형을 보여줍니다(학습 로드맵으로 활용하세요). 섹션 4는 면접에서 돋보일 수 있는 프레임워크 통찰력을 제공합니다. 섹션 5는 학습 경로와 면접 질문 뱅크입니다.
1. LLM 추론이 느린 이유: 두 가지 직교하는 병목 현상 (Two Orthogonal Bottlenecks)
Speculative Decoding이 왜 작동하는지 이해하려면, 먼저 추론이 왜 느린지를 명확하게 파악해야 합니다. 이 섹션은 아직 알고리즘을 다루지는 않지만, 이후의 모든 내용을 위한 기초가 됩니다. 또한 면접에서 이를 잘 설명하는 것만으로도 단순히 알고리즘을 암기한 지원자들과 즉시 차별화될 수 있습니다.
1.1 병목 현상 A: 자기회귀 생성(Autoregressive Generation)의 직렬 의존성
주류 LLM은 **자기회귀적(autoregressively)**으로 생성하는 인과적 트랜스포머(causal Transformers) [15]입니다:
P(x1, x2, …, xn) = ∏_{i=1}^{n} P(xi | x<i)
쉽게 말해, 모든 토큰은 이전의 모든 토큰을 입력으로 필요로 합니다. 100개의 토큰을 생성한다는 것은 100번의 순차적인 모델 호출(model calls)을 의미합니다.
이러한 순차적 특성은 알고리즘 수준에서 존재하며, 모델링 패러다임(modeling paradigm)을 바꾸지 않고서는 우회할 수 없습니다. 바로 이 지점에서 Lookahead Decoding이나 확산 언어 모델(diffusion language models)과 같은 더 근본적인 접근 방식들이 등장합니다.
1.2 병목 현상 B: 메모리 대역폭 제한 (Memory-Bandwidth Bound) (가장 중요한 것)
이 부분은 직관에 어긋나며 면접에서 자주 등장하는 주제입니다: LLM 추론(inference)의 병목 현상은 GPU 연산량(FLOPs)이 아니라, 바로 메모리 대역폭(memory bandwidth)입니다.
GPU 메모리는 **계층적(hierarchical)**입니다:
GPU 연산 코어는 SRAM에서만 작업할 수 있습니다. 매 순전파(forward pass)마다, 모든 모델 가중치는 연산에 참여하기 위해 HBM에서 SRAM으로 스트리밍되어야 합니다. 이는 GPU의 물리적 특성에 의해 결정되는 사항이며, 어떤 소프트웨어 계층도 이를 건너뛸 수 없습니다.
수치로 확인해 봅시다: FP16 정밀도의 70B 모델은 가중치 용량이 대략 140 GB입니다. H100의 약 ~3 TB/s인 HBM 대역폭을 기준으로 할 때, 단일 순전파의 하한선은 약 47 ms입니다. 이는 토큰당 지연 시간(per-token latency)의 물리적 하한선입니다.
하지만 더 중요한 사실은 이것입니다: 그 140 GB의 전송 비용은 처리하는 토큰의 수에 따라 거의 변하지 않습니다. 토큰 1개를 처리할 때도 모든 것을 한 번 로드해야 합니다. 토큰 7개를 처리할 때도 여전히 모든 것을 한 번 로드합니다. 몇 개의 위치(position)를 추가로 처리한다고 해서 해당 순전파의 시간에 거의 영향을 주지 않습니다.
왜 "몇 개의 추가적인 위치(position)"가 거의 비용이 들지 않을까요? 순전파 (forward pass)의 핵심 연산은 행렬 곱셈인 Y = X · W입니다. 입력 X의 형상 (shape)은 [N, d] (N개의 위치, 각 d 차원)이고, 가중치 (weights) W의 형상은 [d, d']입니다. GPU가 HBM에서 SRAM으로 W를 한 번 이동시키고 나면, W의 동일한 복사본을 X의 모든 N개 행 (rows)에 대해 곱합니다.
정확히 말하자면: 1개의 행에서 7개의 행으로 늘어나는 것은 GPU의 FLOPs (부동 소수점 연산량)를 증가시킵니다. 6개의 추가적인 행에 대한 곱셈-누산 (multiply-accumulate) 연산은 결코 작업량이 0인 것이 아닙니다. 핵심은 한 번의 행렬 곱셈이 W를 정확히 한 번만 로드하며, 로딩되는 데이터의 양은 행의 수에 의존하지 않는다는 점입니다. LLM 추론은 메모리 대역폭 제한 (memory-bound) 상황 — 즉, 연산 능력은 매우 풍부하지만 대역폭이 제약 사항인 상황 — 이기 때문에, 추가적인 연산은 가중치 로딩 시간 안에 숨겨집니다. 연산 코어들은 어차피 W가 도착하기를 기다리며 유휴 상태(idle)로 있었으므로, 몇 개의 행을 더 곱하는 것은 실제 실행 시간 (wall-clock time) 측면에서 비용이 거의 들지 않습니다. "추가 연산이 공짜다"라는 말은 연산이 말 그대로 아무런 비용이 들지 않는다는 뜻이 아니라, GPU의 연산 능력 ≫ 대역폭 특성에서 비롯된 직접적인 결과입니다.
1.3 두 병목 현상의 결합: 핵심적인 고통
병목 A (알고리즘): N번의 직렬 순전파 (serial forward passes)가 필수적입니다.
병목 B (하드웨어): 각 순전파는 고정된 로딩 비용을 지불하지만, 단 1개의 토큰만을 생성합니다.
이 둘이 결합되어 느린 추론의 본질을 만듭니다. 즉, 매 패스마다 "140 GB의 가중치를 이동"하는 비용을 지불하고 정확히 1개의 토큰만을 돌려받는 것은 최악의 교환 비율입니다.
Speculative decoding의 우아함은 B를 사용하여 A를 부분적으로 물리친다는 점에 있습니다. 추가 토큰은 공짜이므로, 한 번의 순전파로 많은 토큰을 검증 (verify) 할 수 있는 방법을 찾는 것입니다. 이 개념을 붙잡고 있으면 이 분야의 모든 논문이 제자리를 찾아가게 됩니다.
1.4 핵심 명확화: 한 번의 순전파는 실제로 무엇을 생성하는가?
매우 흔한 오해를 바로잡을 시간입니다. 이 부분을 정확히 이해하는 것이 이후의 모든 내용을 이해하는 핵심입니다.
대부분의 사람들은 Transformer의 한 번의 순전파 (forward pass)가 1개의 토큰을 계산한다고 생각합니다. 하지만 그렇지 않습니다.
💡 핵심 메커니즘: 한 번의 순전파 (forward pass) = 한 번의 가중치 로드 (weight load) + 한 번의 행렬 곱셈 (matrix multiplication)이며, 그 단 한 번의 행렬 곱셈이 모든 입력 위치를 동시에 계산합니다. 로드 (loading)와 계산 (computing)은 하나로 결합되어 있습니다. "한 번 로드한 뒤, N번 따로 계산한다"와 같은 연산은 존재하지 않습니다. "N번 계산한다"는 물리적으로 존재하지 않는 개념입니다. 존재하는 것은 "1번의 순전파 (forward pass)", "2번의 순전파 (forward pass)\
- 첫 번째 $\gamma$ 개의 분포(distributions)는 그에 대응하는 초안 토큰(draft tokens)을 검증합니다 ("나, 즉 거대 모델이 작은 모델의 추측에 동의하는가?")
- 마지막 분포는 (만약 모든 $\gamma$ 개의 초안이 수락되었다면) 보너스 토큰 1개를 무료로 제공합니다
일반적인 디코딩 (ordinary decoding)과 추측적 디코딩 (speculative decoding)을 나란히 놓고 비교하면 매우 명확해집니다 (둘 다 7개의 토큰을 생성하는 경우):
| 디코딩 방식 | 순전파 (Forward passes) | 가중치 로드 (Weight loads) | 행렬 곱셈 (matrix multiplies)이 계산하는 것 |
|---|---|---|---|
| 일반적 (Ordinary) | 7 | 7 ($\approx$ 7 $\times$ 47 ms) | $k$번째 패스는 $k$개의 위치를 계산하지만 마지막 것만 유지하며, 나머지는 낭비됨 |
| 추측적 (Speculative) | 1 | 1 ($\approx$ 47 ms) | 한 번의 패스로 7개 위치를 계산하며, 그들 모두가 초안 검증에 사용됨 |
여기서 직관에 반하는 부분이 있습니다: 일반적인 디코딩의 7번째 순전파 (forward pass) 또한 7개의 위치를 계산합니다 — 단지 처음 6개가 "이미 알고 있는 입력"을 예측하고 버려질 뿐입니다. 따라서 두 방식의 _전체 행렬 곱셈 작업량 (total matrix-multiply work)_은 거의 동일합니다. 진짜 차이점은 얼마나 많이 계산하느냐가 아니라, 얼마나 많이 로드하느냐에 있습니다. 일반적인 디코딩은 가중치를 7번 로드하지만, 추측적 디코딩은 이를 1번으로 압축합니다. 그리고 로딩이 지연 시간(latency)의 대부분을 차지하므로 (로드당 $\approx$ 47 ms), 7번의 로드를 1번으로 압축하는 것은 시간 그 자체를 압축하는 것과 같습니다.
그 단 한 번의 검증 패스(verification pass) 내에서도 비용은 매우 비대칭적입니다:
| 단계 (Stage) | 주체 (Who) | 작업 (What) | 비용 (Cost) |
|---|---|---|---|
| 검증 순전파 (Verification forward) | 거대 모델 (GPU) | 단 한 번의 순전파 (forward pass), 한 번의 가중치 로드, 모든 위치에서의 분포 (distributions)를 병렬로 계산 | 주요 비용 ($\approx$ 47 ms) |
| 수락/거절 결정 (Accept/reject decisions) | 알고리즘 레이어 (CPU 또는 아주 작은 GPU 커널) | 배치 단위의 분포에 대한 테이블 조회 (Table lookups) + 수정된 거절 샘플링 (corrected rejection sampling) | 사실상 무료 |
⚠️ 흔히 잘못된 공식화 중 하나는 "한 번의 순전파 (forward pass) 내에서의 다중 검증" 또는 "다중 순전파 (multiple forward passes)"입니다. 두 가지 모두 부정확합니다. 순전파 (forward pass)는 1회이며, 로드 (load) 또한 1회입니다. 검증은 단일 패스 (single pass)로부터 생성된 여러 분포 (distributions)를 외부 알고리즘이 병렬로 소비하는 것입니다. 이는 Transformer의 인과적 구조 (causal structure)가 제공하는 무료 배당금과 같습니다.
이 메커니즘과 증명을 내재화하면, 다음 섹션에 나오는 연구 현황과 인터뷰 질문들이 모두 직관적으로 다가올 것입니다.
2. 핵심 알고리즘 (The Core Algorithm)
2.1 절차 (The Procedure)
다음과 같이 정의합니다:
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기


