로컬 LLM 속도를 공짜로 올리기 — speculative decoding 쉽게 이해하기
요약: 로컬 LLM의 생성 속도를 품질 손실 없이 실질적으로 향상시킬 수 있는 speculative decoding(추측 디코딩)은 작은 초안 모델이 여러 토큰을 미리 추측하고 큰 본 모델이 한 번의 검증 단계에서 이를 확인하여 맞은 추측은 그대로 채택하고 틀린 부분부터 본 모델이 다시 생성하는 원리로 작동하며 llama.cpp나 vLLM 같은 로컬 프레임워크에서 손쉽게 적용 가능하다.
로컬 LLM의 생성 속도를 품질 손실 없이 실질적으로 향상시킬 수 있는 speculative decoding(추측 디코딩)은 작은 초안 모델이 여러 토큰을 미리 추측하고 큰 본 모델이 한 번의 검증 단계에서 이를 확인하여 맞은 추측은 그대로 채택하고 틀린 부분부터 본 모델이 다시 생성하는 원리로 작동하며 llama.cpp나 vLLM 같은 로컬 프레임워크에서 손쉽게 적용 가능하다.
한 줄 요약: 추측 디코딩은 작은 초안 모델의 빠른 예측 + 큰 본 모델의 정확한 검증을 통해 로컬 LLM 속도를 공짜로 높이는 실용적인 가속 기술이다.
speculative decoding은 공개 측정에서 대략 1.5~3배 생성 속도 향상 — 초안 모델의 토큰 수용률과 모델쌍에 좌우되며 출력은 본 모델과 수학적으로 동일(품질 무손실)
토큰을 하나씩 만드는 게 왜 느릴까?#
LLM은 기본적으로 자기회귀 방식으로 작동한다. 즉, 첫 번째 토큰을 생성한 후 그 결과를 입력에 추가해 두 번째 토큰을, 다시 그 결과를 추가해 세 번째 토큰을 생성하는 과정을 출력 길이만큼 반복해야 한다. 각 단계마다 모델 전체를 한 번씩 실행해야 하므로, 특히 GPU 메모리 대역폭이 병목이 되거나 연산 유닛이 대기하는 시간이 길어져 전체 생성 속도가 느려진다. 로컬 환경에서 70B급 모델을 CPU나 중간 사양 GPU로 돌릴 때 이 순차적 특성이 체감상 큰 지연을 만든다. 초보자 관점에서 보면 매번 한 글자씩 글을 쓰고 다음 글자를 생각하는 것처럼 비효율적인 과정이다.
추측 디코딩은 어떻게 공짜로 빨라질까?#
이 기술의 핵심은 '추측과 검증'의 분리다. 빠른 인턴이 문장을 미리 여러 개 써오면, 바쁜 편집장이 한 번에 훑어 맞은 부분만 통과시키는 것처럼, 작은 초안 모델이 먼저 4~8개 정도의 토큰을 연속 생성한다. 이어서 큰 본 모델이 이 초안 시퀀스를 한 번의 forward pass로 처리하면서 각 위치에서 '이 토큰이 맞을 확률'을 계산한다. 초안이 제안한 토큰이 본 모델이 생각한 것과 일치하면 그대로 수락하고 다음으로 넘어가며, 첫 번째로 불일치하는 지점에서는 본 모델의 확률 분포에서 새 토큰을 직접 샘플링한 후 그 뒤부터는 일반 디코딩으로 전환한다.
여기서 중요한 점은 '검증' 단계에서 품질이 떨어지지 않는 이유다. 본 모델이 직접 후보 토큰들의 적합성을 평가하고, 거부되는 순간부터 본 모델 자신의 분포를 사용해 생성을 이어가기 때문이다. 수학적으로 증명된 바에 따르면, 이 과정에서 생성되는 전체 시퀀스의 확률 분포는 본 모델을 혼자 사용했을 때와 정확히 동일하다. 따라서 속도는 빨라지지만 출력되는 내용이나 품질은 전혀 손상되지 않는 '공짜' 가속이 실현된다.
| 방식 | 원리 | 속도 이득(추정) | 품질 영향 | 대표 지원 |
|---|---|---|---|---|
| 일반 디코딩 | 한 토큰씩 순차 생성 | 기준(1배) | 기준 | 사실상 전부 |
| speculative(초안 모델) | 작은 모델이 여러 토큰 초안 → 본 모델이 한 번에 검증 | 대략 1.5~3배(수용률·모델쌍 의존) | 없음(출력 동일) | llama.cpp·vLLM |
| 프롬프트 lookup(n-gram) | 입력에서 반복될 구절을 예측 | 반복 많은 입력에서 큰 이득 | 없음 | vLLM 등 |
일반 디코딩은 위에서 설명했듯이 토큰을 하나씩 순차적으로 만들어 내기 때문에 가장 기본적이지만 느린 방식이다. speculative(초안 모델) 방식은 초안 모델의 빠른 추측 덕분에 본 모델의 호출 횟수를 줄여 속도를 높인다. 프롬프트 lookup(n-gram) 방식은 입력 프롬프트 내에서 자주 나타나는 반복 패턴이나 n-gram을 미리 예측해 토큰 생성을 건너뛰는 식으로, 특히 코드나 리스트 같은 반복 구조가 많은 콘텐츠에서 큰 효과를 발휘한다. 이 세 방식 모두 최종 출력의 품질은 본 모델 기준으로 유지된다.
로컬에서 언제 쓰면 좋을까?#
로컬에서 speculative decoding 같은 가속 기법을 도입할 때는 다음과 같은 상황에서 특히 효과를 볼 수 있다.
- 같은 패밀리의 작은 모델을 초안으로 활용할 때. Llama 3.1 8B 모델의 초안으로 Llama 3.2 1B나 3B 모델을 사용하면 모델 간 호환성이 좋아 수용률이 높아져 속도 향상이 안정적으로 나타난다.
- 코드·구조화 출력처럼 예측이 쉬운 작업에 유리하다. 다음 토큰이 문법적으로나 형식적으로 제한되는 경우(예: 프로그래밍 코드, JSON 객체 생성) 초안 모델의 추측이 맞을 확률이 높아져 검증 통과율이 올라간다.
- VRAM 여유가 있을 때 적용하는 것이 좋다. 초안 모델은 본 모델보다 훨씬 작지만 동시에 메모리에 올려야 하므로, 여유 메모리가 충분한 환경에서 본 모델과 함께 로드해 병렬로 활용하면 체감 속도가 크게 개선된다.
이러한 조건을 만족하는 경우 로컬 LLM 사용 경험이 눈에 띄게 쾌적해지며, 특히 긴 문서 요약이나 코드 작성 작업에서 시간 절약 효과가 두드러진다.
참고: 2026-07-12 KST 기준으로 작성된 내용이며, 실제 속도 이득은 사용 중인 하드웨어 사양, 초안 모델과 본 모델의 조합, 입력 유형에 따른 수용률에 따라 크게 달라질 수 있다. 따라서 실제 배포나 일상 사용 전에 본인의 환경에서 직접 측정하고 최적의 초안 길이와 모델 쌍을 찾아보는 것을 권장한다.
이 시리즈: 이 시리즈 허브 — 로컬 LLM·RAG 7가지 관문 · 프롬프트 캐싱으로 속도 올리기 · 함수 호출(tool calling) 첫걸음
함께 읽기: 로컬 LLM에 JSON을 강제하기 — 구조화 출력으로 파싱 실패 없애기, 일상 업무에 붙이는 Llama 3.3 70B
참고 링크
Responses
No responses yet. Be the first to respond.