Speculative Decoding

메모리 I/O 호출 빈도를 지배하는 시간적 최적화

1. Introduction: 왜 I/O 호출 횟수가 문제인가?

거대 언어 모델(LLM)의 자기회귀(Autoregressive) 디코딩은 매 스텝마다 단 하나의 토큰을 생성합니다. 문제는 이 하나의 토큰을 얻기 위해 수십 GB에 달하는 Target Model의 가중치(Weights) 전체를 느린 DRAM에서 연산기(SRAM/Core)로 매번 끌고 와야 한다는 점입니다.

디바이스의 메모리 대역폭(Memory Bandwidth)이 초당 100GB/s이고 모델 크기가 50GB라면, 토큰 하나를 생성하는 데 무조건 최소 0.5초의 물리적 시간이 소요됩니다. 연산기가 아무리 빠르더라도 메모리에서 데이터를 가져오는 속도에 갇혀버리는 전형적인 Memory-bound 상태입니다. Speculative Decoding은 이 거대한 가중치를 메모리에서 불러오는 횟수 자체를 획기적으로 줄이는 알고리즘적 우회로입니다.


2. 핵심 아키텍처: Draft-then-Verify (초안 작성 후 검증)

이 기술은 크기가 서로 다른 두 개의 모델을 병렬로 활용하여 I/O 비용을 최소화합니다.

2.1. Drafting (초안 생성)

  • Draft Model (보조 모델): Target 모델보다 파라미터 수가 훨씬 적고(예: 1/10 크기) 속도가 빠른 모델입니다.
  • 이 모델은 메모리에 올리기 가볍기 때문에, 빠르게 γ\gamma개의 토큰을 연속으로 추측(Speculation)하여 생성합니다.

2.2. Verification (병렬 검증)

  • Target Model (메인 모델): 거대한 크기를 가진 원래의 고성능 모델입니다.
  • Target 모델은 Draft 모델이 생성한 γ\gamma개의 토큰을 입력으로 받아, 시퀀스를 한 번에 처리하는 단 한 번의 Forward Pass(병렬 연산) 로 검증을 수행합니다.
  • 즉, 가중치를 DRAM에서 한 번만 읽어와서 여러 토큰을 동시에 검사합니다.

3. 수학적 무손실 보장 (Lossless Guarantee)

Draft 모델은 크기가 작아 성능이 떨어집니다. 그렇다면 이 방법이 어떻게 Target 모델이 단독으로 생성한 것과 수학적으로 완벽히 동일한 결과 분포(Exact Same Distribution) 를 보장할 수 있을까요? 핵심은 기각 샘플링(Rejection Sampling) 을 응용한 수락 확률(Acceptance Probability)에 있습니다.

특정 위치의 토큰 xx에 대해, Target 모델의 확률 분포를 p(x)p(x), Draft 모델의 확률 분포를 q(x)q(x)라고 합시다. Draft 모델이 예측한 토큰 xx를 Target 모델이 수락할 확률 α\alpha는 다음과 같이 정의됩니다.

α=min(1,p(x)q(x))\alpha = \min\left(1, \frac{p(x)}{q(x)}\right)

동작 원리 분석:

  1. p(x)q(x)p(x) \ge q(x) 인 경우: Target 모델도 해당 토큰을 높게 평가한다는 뜻이므로, α=1\alpha = 1이 되어 100% 수락(Accept) 합니다.
  2. p(x)<q(x)p(x) < q(x) 인 경우: Draft 모델이 과대평가한 토큰입니다. 이 경우 p(x)q(x)\frac{p(x)}{q(x)}의 확률로 수락 여부를 결정(동전 던지기)합니다.
  3. 거절(Reject) 발생 시: 즉시 검증을 중단하고, Target 모델은 남은 확률 분포 (p(x)q(x))(p(x) - q(x))에 비례하여 올바른 토큰을 **재샘플링(Resampling)**하여 정정합니다.

이 엄밀한 검증 로직 덕분에, 최종 출력 토큰의 분포는 항상 Target 모델의 분포 p(x)p(x)와 완벽하게 일치하게 됩니다.


4. 성능 최적화의 수학적 기댓값 (Expected Speedup)

Speculative Decoding의 효율성은 Draft 모델의 적중률(Hit Rate)에 달려 있습니다. 단 한 번의 Target Model 메모리 접근(1 Step)으로 얻을 수 있는 평균 생성 토큰 수, 즉 기댓값 EE는 다음과 같습니다. (수락 확률을 평균적으로 α\alpha라고 가정)

E[tokens]=i=1γiαi(1α)+(γ+1)αγE[\text{tokens}] = \sum_{i=1}^{\gamma} i \alpha^{i} (1 - \alpha) + (\gamma + 1) \alpha^{\gamma}

  • 해석: γ\gamma개의 토큰이 모두 수락되면, 마지막 토큰 예측 결과 1개를 보너스로 얻어 총 γ+1\gamma + 1개의 토큰을 단 한 번의 I/O만으로 생성합니다.
  • Trade-off: α\alpha가 너무 낮으면(Draft 모델이 멍청하면) 토큰이 줄줄이 거절당해 오히려 Draft 모델을 돌린 연산 오버헤드만 커집니다. 반면 α\alpha를 높이기 위해 Draft 모델 크기를 키우면 Drafting 시간 자체가 길어집니다. 따라서 최적의 Draft 모델 크기와 γ\gamma 값을 찾는 것이 시스템 엔지니어링의 핵심입니다.

5. System Impact: Edge 환경에서의 시너지

Token-level Sparsity와 결합할 때, Speculative Decoding은 Edge 디바이스에서 한계를 뛰어넘는 성능을 냅니다.

  • DRAM 병목 우회: 제한된 대역폭 환경에서 무거운 가중치를 부르는 횟수를 1E[tokens]\frac{1}{E[\text{tokens}]} 수준으로 감소시킵니다.
  • 병렬 연산기 극대화: Edge NPU/GPU의 병렬 연산 유닛(ALU)은 보통 Batch 연산이 아닐 때 놀고 있는 경우가 많습니다. Target 모델이 γ\gamma개의 토큰을 한 번에 검증하는 과정은 이 유휴 연산 자원을 100% 활용하는 완벽한 하드웨어 친화적(Hardware-aware) 작업입니다.

한계:하지만 Target 모델이 γ\gamma개의 토큰을 한 번에 검증(병렬 처리)할 때, 내부의 Attention 연산에서 또 다른 병목이 발생할 수 있습니다.