70B 이상의 대규모 언어 모델(LLM)을 단일 사용자 요청으로 서비스할 때 엔지니어가 마주하는 근본적인 물리적 한계는 연산 능력(FLOPs)의 부족이 아니라 메모리 대역폭 병목(Memory Bandwidth Bound)입니다.
자기회귀(Autoregressive) 생성 단계에서는 단 1개의 토큰을 생성하기 위해 수십 기가바이트에 달하는 모델의 전체 가중치 파라미터를 고대역폭 메모리(HBM)에서 GPU 연산 코어(SRAM)로 통째로 읽어와야 합니다. 즉, 1개 토큰을 생성하는 데 걸리는 시간과 배치 단위로 여러 토큰을 병렬 검증하는 데 걸리는 시간이 거의 동일합니다. 본 글에서는 가벼운 초안 모델(Draft Model)이 미리 추측한 K개의 토큰을 타깃 모델(Target Model)이 단 한 번의 순전파로 병렬 검증하여 모델 품질 저하 없이 추론 속도를 2~3배 향상시키는 투기적 디코딩(Speculative Decoding)의 수학적 메커니즘과 아키텍처를 분석합니다.
1. 메모리 대역폭 병목과 투기적 디코딩의 기본 가설
현대 하이엔드 GPU(H100, A100)는 수백 TFLOPs의 연산 성능을 갖추고 있지만, 메모리 대역폭은 초당 2~3TB 수준으로 제한되어 있습니다. 배치 크기가 1인 추론 환경에서는 산술 강도(Arithmetic Intensity = FLOPs / Byte)가 극히 낮아 GPU 연산 유닛의 90% 이상이 유휴(Idle) 상태로 메모리 전송을 대기하게 됩니다.
- 토큰당 가중치 재전송 낭비: 70B 모델(FP16 기준 140GB)이 1개 토큰을 생성할 때마다 140GB의 가중치를 매번 로드해야 하므로 토큰 생성 속도가 물리적 대역폭에 갇히게 됩니다.
- 병렬 검증의 동일 비용 원리: 이미 제시된 K개의 후보 토큰 시퀀스에 대해 로짓(Logit)을 계산하는 검증 연산은 완전 병렬화(Parallel Forward Pass)가 가능하므로, 1개 토큰 생성과 거의 동일한 메모리 읽기 시간으로 K개 토큰을 동시에 채점할 수 있습니다.
- 무손실 수학적 보장: 거부 샘플링(Rejection Sampling) 알고리즘을 통해 투기적 디코딩으로 생성된 최종 토큰 분포는 타깃 거대 모델이 직접 단독 생성했을 때의 확률 분포와 100% 수학적으로 일치합니다.
3. 결론 및 기대 성과
투기적 디코딩의 핵심은 초안 모델(예: 1B/3B 소형 모델)의 빠른 생성 속도를 활용하되, 타깃 모델(예: 70B 모델)의 엄격한 확률 분포를 기준으로 토큰 수락 여부를 결정하는 수정된 거부 샘플링에 있습니다.
# 투기적 디코딩 거부 샘플링 검증 루프 개념 구현체 import random from typing import List, Tuple def verify_speculated_tokens( draft_tokens: List[int], p_draft: List[dict], # 초안 모델의 토큰별 조건부 확률 분포 P(x) p_target: List[dict] # 타깃 모델의 병렬 순전파 조건부 확률 분포 Q(x) ) -> Tuple[List[int], int]: """ 수정된 거부 샘플링(Modified Rejection Sampling) 검증 수락 확률: min(1, Q(x) / P(x)) """ accepted_tokens = [] for i, token in enumerate(draft_tokens): p_val = p_draft[i].get(token, 1e-9) q_val = p_target[i].get(token, 1e-9) acceptance_prob = min(1.0, q_val / p_val) rand_val = random.random() if rand_val <= acceptance_prob: # 타깃 모델 기준 수락: 토큰 채택 accepted_tokens.append(token) else: # 거절 발생: 잔여 분포(Residual Distribution)에서 보정 토큰 샘플링 후 즉시 조기 종료 # 보정 분포: max(0, Q(x) - P(x)) 정규화 rejected_pos = i corrected_token = sample_from_residual(p_target[rejected_pos], p_draft[rejected_pos]) accepted_tokens.append(corrected_token) return accepted_tokens, len(accepted_tokens) # 모든 K개 초안 토큰이 수락된 경우, 타깃 모델이 계산한 K+1번째 보너스 토큰 샘플링 bonus_token = sample_from_distribution(p_target[len(draft_tokens)]) accepted_tokens.append(bonus_token) return accepted_tokens, len(accepted_tokens)
위 알고리즘에 의해 만약 초안 모델이 제안한 토큰의 타깃 확률이 더 높다면(Q(x) >= P(x)) 무조건 100% 수락되며, 낮더라도 확률적 비율로 수락됩니다. 거절된 시점에서는 Q(x) - P(x)의 양의 차이로 정의되는 잔여 분포에서 새 토큰을 즉시 샘플링하므로 단 한 번의 순전파로 최소 1개에서 최대 K+1개의 검증된 토큰을 확정 획득합니다.
1. 초안 모델과 타깃 모델의 어휘집(Tokenizer) 일치성: 초안 모델과 타깃 모델은 동일한 토크나이저와 어휘집(Vocabulary)을 공유해야 토큰 인덱스 변환 오버헤드 없이 즉시 병렬 매핑이 가능합니다.
2. 최적 투기 길이(Lookahead Window K) 선정: K가 너무 크면 거절 확률이 높아져 초안 연산 시간이 낭비되고, 너무 작으면 대역폭 절감 효과가 미미합니다. 도메인 일치도에 따라 통상 K=3~5가 최적입니다.
3. 드래프트리스 대안(Medusa / Eagle) 고려: 별도의 초안 모델 프로세스를 띄우는 메모리/GPU 공간이 부족한 경우, 타깃 모델 상단에 다중 디코딩 헤드를 추가하여 자체적으로 토큰을 추측하는 헤드 기반 아키텍처를 적용합니다.
3. 결론 및 기대 성과
투기적 디코딩은 LLM의 자기회귀적 토큰 생성이 갖는 물리적 메모리 대역폭 한계를 정면으로 돌파한 시스템 레벨 혁신입니다. 모델 파라미터 경량화나 양자화(Quantization) 없이도 원래 모델의 정밀한 추론 품질을 100% 유지한 채 지연 시간을 2배 이상 단축할 수 있어, 실시간성이 필수적인 코딩 어시스턴트, 챗봇, AI 에이전트 인프라의 표준 배포 패턴으로 자리잡고 있습니다.