로컬 AI 인프라 노트 (8/15) — 로컬 LLM 가속·양자화 심화
같은 모델, 같은 하드웨어인데 누군가는 200 tok/s를 뽑고 누군가는 30 tok/s에 그친다. 차이는 알고리즘이다.
2026년 1분기에 세 가지 기술이 LLM 추론 속도의 한계를 다시 그었다. DFlash (Z Lab, Feb 2026 — 블록 디퓨전 speculative decoding), DDTree (Ringel & Romano, Apr 2026 — 트리 어텐션 검증), TurboQuant (Google Research, ICLR 2026 — 3-bit KV 캐시 무손실 양자화). 셋은 서로 간섭하지 않는다 — 동시에 쓰면 누적 효과가 난다.
이 글은 세 기술을 1차 자료(arXiv, GitHub, 공식 발표)로 정리하고, prefill/decode/KV cache 기초부터 실전 적용까지 다룬다. 개발자 대상이지만, "왜 M4 Pro가 base M4보다 추론이 두 배 빠른가" 같은 질문에 답이 될 것이다.
핵심 요약
- Prefill = compute-bound, Decode = memory-bandwidth-bound. 둘은 다른 게임이고 최적화 대상도 다르다.
- DFlash: 블록 디퓨전으로 K개 토큰을 한 번에 추측 → 6× 속도, EAGLE-3 대비 2.5×.
- DDTree: 디퓨전 드래프트 분포로 트리 구성 → MATH 7.5×, HumanEval 8.2×.
- TurboQuant: 랜덤 회전 + QJL → KV 캐시 3.5-bit 무손실. H100에서 8×.
- 셋은 직교적. 이론적 누적 8~10×.
1. 기초 다시 — Prefill과 Decode는 다른 게임
LLM 추론은 두 단계다. 많은 글이 이걸 같은 것으로 다루는데, 둘은 본질이 다르다.
Prefill — 입력 처리
프롬프트 전체를 병렬로 처리한다. 모든 입력 토큰의 K(Key), V(Value)를 한 번에 계산하고 KV cache를 만든다. 행렬곱이 거대하기 때문에 GPU 텐서 코어(또는 Apple M5의 Neural Accelerators)를 최대로 사용한다 — 연산이 병목(compute-bound).
H100에서 10K 토큰 프롬프트 prefill: 200~400ms. M5에서 14B dense 모델: <10초. 30B MoE: <3초.
이 단계의 지표는 TTFT (Time To First Token).
Decode — 출력 생성
토큰을 한 개씩 순차적으로 만든다. 매 단계마다 KV cache 전체와 모델 가중치 전체를 메모리에서 읽어야 한다. 연산은 작지만 메모리 접근이 한계 — 메모리 대역폭이 병목(memory-bandwidth-bound).
이 단계의 지표는 TPOT (Time Per Output Token), 또는 그 역수인 tok/s. 일반적으로 30~150 tok/s.
KV cache의 역할
KV cache가 없으면 토큰 t를 만들 때 1~t-1 모든 attention을 다시 계산해야 한다 — O(n²). 캐시가 있으면 새 토큰의 K, V만 추가 → O(n). 그래서 LLM 추론에서 KV cache는 없으면 안 되는 자료구조다.
문제는 크기다. 70B 모델 + 200K 컨텍스트 = KV cache 40~80 GB. 모델 가중치보다 클 수 있다.
메모리 대역폭이 결정한다 — Apple Silicon 비교
| 칩 | Bandwidth |
|---|---|
| M3 base | 100 GB/s |
| M4 base | 120 GB/s |
| M5 base | 153 GB/s |
| M3 Pro | 150 GB/s |
| M4 Pro | 273 GB/s (M4 base 대비 2.3×) |
| M3 Max | 400 GB/s |
| M4 Max | 546 GB/s |
| M5 Max | ~600 GB/s |
M4 Pro가 base M4 대비 추론 속도 2배 가까이 빠른 이유는 메모리 대역폭이 2.3배이기 때문이다. Decode가 메모리 바운드이니 당연한 결과.
같은 양의 KV cache를 더 빠르게 읽을 수 있으면 → 더 많은 토큰을 만들 수 있다. 이게 핵심.
2. DFlash — 블록 디퓨전 Speculative Decoding
Speculative Decoding 자체부터
일반 decode는 토큰 1개를 만들고 검증하고 다음 토큰. Speculative은: 1. Draft 모델(작은 모델)이 K개 토큰을 추측 2. Target 모델(큰 모델)이 K개를 한 번에 검증 3. 일치 prefix까지 수락, 불일치부터 재생성
큰 모델 forward pass 1번으로 K개 토큰 생성 가능 — 이론 최대 K배.
EAGLE-3의 한계
EAGLE-3는 draft 모델도 autoregressive다. Draft 자체가 또 한 번 병목이 된다.
DFlash의 해결책
Draft 모델을 block diffusion으로 만들어 K개 토큰을 한 forward pass에 병렬 생성.
기술 세부: - Block diffusion drafter: K=4~8 토큰을 한 번에 노이즈 제거 - Feature extraction: Target 모델 깊은 레이어에서 context features 추출 - KV injection: Draft 모델의 모든 레이어에 target features 주입 (EAGLE-3는 단일 레이어만)
검증된 성능
- Qwen3-8B (greedy): 6× lossless 가속
- EAGLE-3 대비: 2.5× 빠름
- Qwen3.6-27B-DFlash on RTX 3090: 207 tok/s @ 256K context
- GSM8K, MATH-500, AIME24/25, HumanEval, chat 모두 일관된 가속
- Temperature sampling, reasoning mode에서도 가속 유지
가용성
- Paper: arXiv:2602.06036 (Z Lab — Jian Chen, Yesheng Liang, Zhijian Liu, Feb 2026)
- Code: github.com/z-lab/dflash
- Models: Hugging Face
z-lab/dflashcollection (Qwen3-4B/8B, Qwen3-Coder-30B-A3B, LLaMA-3.1-8B 변형) - 통합: SGLang (production), Transformers (실험), vLLM (진행), llama.cpp (커뮤니티 논의)
3. DDTree — 트리로 확장한 디퓨전 드래프트
DFlash가 버리는 정보
DFlash는 단일 시퀀스를 빠르게 만든다. 하지만 draft 모델은 여러 가능성에 대한 분포를 알고 있다. 그 분포 정보를 그냥 버린다.
DDTree의 아이디어
Draft 모델의 per-position 확률 분포를 트리로 확장하고, target 모델이 트리 전체를 한 forward pass에서 tree attention으로 검증.
4단계 동작
- Draft 모델이 다음 블록의 per-position distribution 생성
- 노드 예산 내에서 트리 구성 (가능성 높은 가지 우선)
- Target 모델이 tree attention으로 한 번에 트리 전체 검증
- 매칭 가지 따라 walk → 불일치 지점부터 재생성
검증된 성능
| 벤치마크 | 가속 |
|---|---|
| MATH-500 | 7.5× |
| HumanEval (T=0.0) | 8.2× |
| GSM8K | 6.6× |
| AIME'24 | 7.3× |
| AIME'25 | 7.2× |
| MBPP | 6.4× |
| LiveCode | 6.8× |
| SWE Lite | 4.3× |
| MT | 4.2× |
| Alpaca | 3.3× |
→ 수학·코드 같은 결정적 작업에서 효과 극대 (가지가 빨리 수렴)
트레이드오프
노드 예산을 키우면 acceptance length가 늘지만, 검증 비용이 dominant해지면 속도 plateau. 작업별 calibration 필요.
가용성
- Paper: arXiv:2604.12989
- Code: github.com/liranringel/ddtree
- 저자: Liran Ringel, Yaniv Romano
- vLLM 통합 진행: vllm-project/vllm#40809
4. TurboQuant — KV Cache를 3-Bit로
왜 KV cache 양자화가 중요한가
70B 모델 + 200K context = KV cache 40~80 GB. 모델 가중치만 줄여서는 안 된다. KV cache가 메모리 대역폭과 용량을 같이 잡아먹기 때문에 KV cache 자체를 압축해야 한다.
기존 양자화의 한계
- INT8/FP8: 무손실에 가깝지만 2배 압축이 한계
- INT4/FP4: 4배 압축이지만 정확도 1~3% 손실
- GPTQ류 vector quantization: 학습 데이터 기반 calibration 필요
TurboQuant의 접근
입력 벡터에 랜덤 회전(random rotation)을 적용해서 모든 좌표가 비슷한 분포(베타분포)를 갖도록 만들고, 표준 스칼라 양자화기로 균일하게 처리.
알고리즘 2단계
- 회전 + 스칼라 양자화: 입력 → 임의 회전 → 좌표별 MSE-최적 스칼라 양자화
- QJL error correction: 1-bit 추가로 Quantized Johnson-Lindenstrauss 변환 → 잔차 보정 + bias 제거
검증된 성능 (논문)
- 3.5비트/채널: 절대적 품질 중립 (no degradation)
- 2.5비트/채널: 한계적 품질 저하만
- 3-bit KV cache: training-free, data-oblivious에서 무손실
- 4-bit on H100: 32-bit unquantized keys 대비 8×
- 정보이론 하한 대비 2.7× 차이만 (이론 최적에 매우 근접)
TurboQuant+ — Apple Silicon 변형
기본 TurboQuant + PolarQuant + Walsh-Hadamard rotation. Apple Silicon 최적화.
- 3.8~6.4× 압축
- M5 Max 128K context: q8_0 prefill 동급, decode 0.9× (사실상 동등)
학습 불필요
이게 진짜 차별점이다.
"TurboQuant can quantize the key-value cache to just 3 bits without requiring training or fine-tuning and causing any compromise in model accuracy."
추론 시점에 적용. 모델 학습 다시 안 한다.
가용성
- Paper: arXiv:2504.19874 (Zandieh, Daliri, Hadian, Mirrokni — Google Research)
- 발표: ICLR 2026 채택
- Code: github.com/0xSero/turboquant (Triton kernels + vLLM 통합), github.com/tonbistudio/turboquant-pytorch (PyTorch from-scratch)
- 공식 발표: research.google/blog/turboquant (2026-03-25)
5. 셋은 직교적이다 — 동시 적용 가능
공격하는 대상이 다르다
| 기술 | 공격 대상 | 단계 |
|---|---|---|
| DFlash / DDTree | Decode 토큰 수 (1 → K) | 추론 알고리즘 |
| TurboQuant | KV cache 메모리 (FP16 → 3-bit) | 메모리 표현 |
| MLX UMA | CPU↔GPU 복사 제거 | 하드웨어 가속 |
서로 간섭하지 않는다. 동시에 켤 수 있다.
이론적 누적 효과 (어림)
기준: Qwen3.6-27B on M4 Max 64GB, FP16, 일반 decode.
| 적용 | tok/s (예상) |
|---|---|
| Baseline (llama.cpp) | ~30 |
| + MLX | ~50 (1.6×) |
| + TurboQuant 3-bit | ~70 (1.4× 추가, KV 메모리 압박 감소) |
| + DFlash speculative | ~150 (2.1× 추가) |
| + DDTree (코드/수학 한정) | ~250 (1.7× 추가) |
→ 이론적으로 8~10× 누적 가능. 단, 실측은 작업·모델·하드웨어 의존이고, 위 표는 이론 어림이지 실측이 아니다.
작업별 권장
- 챗·요약 (스트리밍 짧음): DFlash 단독으로 충분
- 코딩·수학 (트리 분기 많음): DDTree
- 긴 컨텍스트 (RAG, 100K+): TurboQuant 필수
- 에이전트 (반복 시스템 프롬프트): oMLX SSD 캐시 + TurboQuant
6. 도구별 통합 현황 (2026-04-29 기준)
| 도구 | DFlash | DDTree | TurboQuant |
|---|---|---|---|
| SGLang | ✅ Production | 통합 진행 | 실험적 |
| vLLM | 진행 중 | 통합 진행 | ✅ (0xSero 분기) |
| Transformers | 실험적 | — | — |
| llama.cpp | 커뮤니티 논의 | — | 부분적 (PolarQuant) |
| MLX (Apple) | 미통합 | 미통합 | TurboQuant+ 지원 |
| oMLX | 미통합 | 미통합 | 통합 검토 |
| Ollama 0.19 | 미통합 | — | NVFP4 (다른 계열) |
권장 행동
- NVIDIA GPU 보유 (RTX 3090/4090, H100): DFlash + TurboQuant 즉시 시도 가능 (vLLM, SGLang)
- Apple Silicon (M3/M4/M5): TurboQuant+ 직접 시도 (
tonbistudio/turboquant-pytorch), DFlash는 MLX 포팅 대기 - Mac + 단순 사용: oMLX 기본값 사용. 향후 통합 모니터링.
7. 한계와 주의
"8배 빨라진다"는 착시
위의 8~10× 누적은 이론이다. 실제로는: - DFlash 가속률은 모델·하드웨어·temperature에 따라 1.5~6× 범위 - TurboQuant 3-bit가 완전 무손실은 3.5비트 기준. 3비트는 거의 무손실이지만 일부 작업 미세 저하 가능 - 도구별 통합 미완료 → 현재는 단계적 도입만 가능
Apple Silicon 한정 관점
oMLX/MLX 사용자는 지금 당장 가속 받을 수 있는 게 TurboQuant+ 정도다. DFlash·DDTree의 MLX 포팅은 진행 중이지만 시점 미확정.
보안/정확도 절충
3-bit 양자화는 이론적으로 정확도가 보존되지만, 의료·금융 같은 도메인에서는 추가 검증 필수. 일반 챗·코딩은 영향 거의 없음.
정리
세 기술의 핵심 정수:
| 기술 | 한 문장 | 가속 |
|---|---|---|
| DFlash | 블록 디퓨전으로 K개 토큰 동시 추측 | 6× |
| DDTree | 디퓨전 분포로 트리 구성 + tree attention | 7.5× (수학) |
| TurboQuant | 랜덤 회전 + QJL → 3-bit KV cache | 8× (H100) |
핵심 한 문장: "Prefill은 연산, Decode는 메모리. 세 기술은 메모리 측에서 직교적으로 공격한다."
오늘 당장 적용할 수 있는 건 NVIDIA GPU 보유자 한정 — DFlash + TurboQuant. Apple Silicon 사용자는 6~8주 후 MLX 통합이 끝나면 동일 효과를 누릴 수 있을 것이다. 그동안은 oMLX 기본값으로 시작하고, vLLM·SGLang 환경에서 테스트한다.
참고 자료 (1차 출처)
- DFlash 논문: arxiv.org/abs/2602.06036, Z Lab
- DDTree 논문: arxiv.org/abs/2604.12989, GitHub liranringel/ddtree
- TurboQuant 논문: arxiv.org/abs/2504.19874, Google Research blog
- Apple ML Research M5: machinelearning.apple.com/research/exploring-llms-mlx-m5
- Prefill/Decode 기초: morphllm.com/llm-inference, morphllm.com/kv-cache-explained
시리즈 전체 안내: 시리즈 목차
댓글
댓글 쓰기