11# TurboQuant.cpp
22
3- ** [ TurboQuant] ( https://arxiv.org/abs/2504.19874 ) (ICLR 2026) 논문을 충실히 구현한 순수 C 추론 엔진.**
4-
5- 3비트 KV 캐시. 품질 손실 제로. FP16보다 빠름.
3+ ** [ TurboQuant] ( https://arxiv.org/abs/2504.19874 ) (ICLR 2026) KV 캐시 압축을 구현한 순수 C 추론 엔진.**
64
75[ ![ License] ( https://img.shields.io/badge/license-Apache%202.0-blue )] ( )
86[ ![ Release] ( https://img.shields.io/github/v/release/quantumaikr/TurboQuant.cpp )] ( )
9- [ ![ Tests] ( https://img.shields.io/badge/tests-21%20suites-brightgreen )] ( )
7+ [ ![ Tests] ( https://img.shields.io/badge/tests-25%20suites-brightgreen )] ( )
8+
9+ ### 최대 7.1x 총 K+V 압축. 품질 보존.
10+
11+ ```
12+ Gemma 3 4B — 토큰당 총 K+V 메모리:
13+
14+ FP16 K+V (llama.cpp): 136.00 KB (기준)
15+ 1-bit K + Q4 V: 27.62 KB (4.9x) "Paris" ✓ "1+1=2" ✓
16+ 1-bit K + Q2 V: 19.12 KB (7.1x) "Paris" ✓ "Mercury, Venus, Earth" ✓
17+ ```
18+
19+ Key 압축: 10.7x (1-bit sign hash). Value 압축: Q4 (3.8x) 또는 Q2 (7.6x). 합산: ** 최대 7.1x 총 K+V** .
1020
1121---
1222
13- ## 핵심 아이디어
23+ ## 왜 중요한가
1424
15- LLM attention은 ** 내적(inner product) ** ` <query, key> ` 를 계산합니다. 일반 양자화기는 복원 오차(MSE)를 최소화하지만, 이것은 ** 내적 추정에 편향(bias)을 만듭니다 ** — attention 점수가 체계적으로 왜곡됩니다 .
25+ LLM attention은 ** 내적** ` <query, key> ` 을 계산합니다. 일반 양자화기는 복원 오차(MSE)를 최소화하지만, 이것은 내적 추정에 ** 체계적 편향 ** 을 만듭니다 .
1626
17- TurboQuant는 [ ICLR 2026 논문] ( https://arxiv.org/abs/2504.19874 ) 의 2단계 접근으로 이를 해결합니다 :
27+ [ TurboQuant 논문] ( https://arxiv.org/abs/2504.19874 ) (Google Research, ICLR 2026)이 이 간극을 증명하고 해결법을 제시했습니다 :
1828
19- ```
20- Key → 정규화 → Random Hadamard Transform
21- → Lloyd-Max 코드북 (b-1 bits) ← MSE 최적, 하지만 내적에 편향
22- → QJL 부호 해시 on 잔차 (1 bit) ← 편향 교정, 비편향 추정기
23- → 저장: [인덱스, 부호, 노름]
24-
25- Attention:
26- query → RHT (1회) → 회전 공간에서 내적 (역변환 불필요)
27- → 사전 계산된 QJL 투영으로 보정
28- ```
29+ - ** Key** : RHT + Lloyd-Max 코드북 + QJL 잔차 → 어떤 비트에서든 ** 비편향** 내적 추정
30+ - ** Value** : RHT + Lloyd-Max 코드북 → 가중합을 위한 ** MSE 최적** 복원
2931
30- 결과: ** 3비트 KV로 품질 저하 없이, 4비트 uniform보다 빠른 attention. **
32+ 우리는 이 둘을 순수 C로 구현하고, Key를 ** 1비트 ** 까지 밀어붙였습니다 — XOR + popcount로 attention 수행.
3133
3234---
3335
34- ## 결과
36+ ## 압축 옵션
37+
38+ ``` bash
39+ # Key 압축 (attention 스코어링에 영향)
40+ ./build/tq_run model.tqm -p " Hello" -k turbo_kv_1b # 1-bit keys (10.7x)
41+ ./build/tq_run model.tqm -p " Hello" -k turbo_kv_3b # 3-bit keys (4.6x)
42+
43+ # Value 압축 (출력 복원에 영향)
44+ ./build/tq_run model.tqm -p " Hello" -k turbo_kv_1b -v q4 # + Q4 values → 4.9x 총합
45+ ./build/tq_run model.tqm -p " Hello" -k turbo_kv_1b -v q2 # + Q2 values → 7.1x 총합
46+
47+ # 메모리 통계
48+ ./build/tq_run model.tqm -p " Hello" -k turbo_kv_1b -v q4 -M
49+ ```
50+
51+ ### 총 K+V 압축 테이블
52+
53+ | 구성 | K 비트 | V 비트 | K+V/토큰 | 총 압축률 | 품질 |
54+ | ------| --------| --------| ----------| ----------| ------|
55+ | FP16 (기준) | 16 | 16 | 136.00 KB | 1.0x | 참조 |
56+ | uniform_4b + FP16 V | 4 | 16 | 86.06 KB | 1.6x | 베이스라인 |
57+ | 1-bit K + FP16 V | 1 | 16 | 74.38 KB | 1.8x | ~ 120토큰까지 greedy 동일 |
58+ | ** 1-bit K + Q4 V** | ** 1** | ** 4** | ** 27.62 KB** | ** 4.9x** | ** "Paris" ✓ "1+1=2" ✓** |
59+ | ** 1-bit K + Q2 V** | ** 1** | ** 2** | ** 19.12 KB** | ** 7.1x** | ** "Paris" ✓ 행성 ✓** |
60+
61+ ### 32K 컨텍스트 메모리 (Gemma 3 4B)
3562
36- ### 속도: TurboQuant KV vs Uniform KV
63+ ```
64+ FP16 K+V: 4,352 MB
65+ 1-bit K + Q4 V: 885 MB (4.9x, 3.4 GB 절약)
66+ 1-bit K + Q2 V: 613 MB (7.1x, 3.7 GB 절약)
67+ ```
3768
38- | 모델 | Uniform 4비트 | TurboQuant 3비트 | 가속 | 품질 |
39- | ------| -------------| ----------------| ------| ------|
40- | ** Gemma 3 4B** | 5.1 tok/s | ** 17.6 tok/s** | ** 3.4x** | 동일 |
41- | ** Qwen3.5-0.8B** | 49.5 tok/s | ** 80.1 tok/s** | ** 1.6x** | 동일 |
69+ > ** 품질 참고:** K-only 양자화(V는 FP16/FP32)에서 greedy decode는 ~ 120토큰까지 바이트 동일.
70+ > V 양자화(Q4/Q2) 시 더 일찍 발산하지만 coherent하고 사실적으로 정확합니다.
71+ > V 양자화가 가중합 복원에 직접 영향을 주므로 예상된 동작입니다.
4272
43- 더 적은 비트 = 더 적은 데이터 = 더 나은 캐시 효율. 회전 공간 내적으로 역변환 제거.
73+ ---
4474
45- ### KV 캐시 메모리
75+ ## 빠른 시작
4676
47- ![ Long Context Memory] ( docs/assets/long_context_memory.png )
77+ ``` bash
78+ git clone https://github.com/quantumaikr/TurboQuant.cpp && cd TurboQuant.cpp
79+ bash scripts/quickstart.sh " What is deep learning?"
80+ ```
81+
82+ ---
83+
84+ ## 알고리즘
4885
4986```
50- Gemma 3 4B, 32K 컨텍스트:
51- FP16 (llama.cpp): 4,352 MB
52- Uniform Q4: 1,156 MB (3.8x)
53- TurboQuant 3비트: 900 MB (4.6x) ← 같은 품질, 22% 적은 메모리
87+ Key (attention 스코어링 — 비편향 내적 필요):
88+ key → 정규화 → RHT → Lloyd-Max 코드북 (b-1 bits) → QJL 부호 (1 bit)
89+ 1-bit 극한: 코드북 생략, 부호만 저장 → XOR + popcount attention
90+
91+ Value (가중합 — MSE 최적 복원 필요):
92+ value → Q4 또는 Q2 블록별 양자화 → 출력 시 실시간 역양자화
5493```
5594
56- ### 지원 모델
95+ | 구성 요소 | Key용 | Value용 |
96+ | ----------| -------| ---------|
97+ | ** 목표** | 비편향 내적 | 낮은 MSE 복원 |
98+ | ** 방법** | RHT + 코드북 + QJL | 블록 스케일 + 양자화 |
99+ | ** 1-bit** | 부호 해시 (XOR+popcount) | 비권장 |
100+ | ** 최적 구성** | 1-bit (10.7x key 압축) | Q4 (3.8x value 압축) |
101+
102+ ---
103+
104+ ## 지원 모델
57105
58106| 모델 | 파라미터 | 속도 (Q4, 6T) | 검증 |
59107| ------| ----------| ---------------| ------|
60- | ** Gemma 3 4B** | 4B | 17.6 tok/s | "France" → "Paris" |
108+ | ** Gemma 3 4B** | 4B | 20.2 tok/s | "Paris" ✓, 행성 ✓ |
61109| ** Qwen3.5-0.8B** | 752M | 80.1 tok/s | PyTorch 대비 코사인 0.999 |
62110| ** Gemma 3 270M** | 270M | 176 tok/s | 레이어별 정확 일치 |
63111
64112멀티 아키텍처: Qwen3.5 (DeltaNet 하이브리드) + Gemma 3 (슬라이딩 윈도우). Gemma 4 대응.
65113
66114---
67115
68- ## 빠른 시작
116+ ## 기술 상세
117+
118+ - ** 10,000줄 이상의 순수 C** — 외부 의존성 없음
119+ - ** 11개 양자화 타입** — Uniform, Mixed, PolarQuant, QJL, TurboQuant KV (1/3/4-bit)
120+ - ** K+V 독립 압축** — 1-bit key (XOR+popcount) + Q4/Q2 value
121+ - ** ICLR 2026 논문 충실 구현** — RHT + Lloyd-Max + QJL 잔차
122+ - ** 멀티 아키텍처** — Qwen3.5 (DeltaNet) + Gemma 3 (슬라이딩 윈도우 + GeGLU)
123+ - ** NEON 벡터화** — matmul, attention, Hamming distance, FP16 변환
124+ - ** 25개 테스트 스위트** — KV 라운드트립, attention 정확도, 코드북, Q2 가중치, NEON 일치성, attention 분포
125+
126+ ---
127+
128+ ## 벤치마크 & 검증
129+
130+ ### Ablation: TurboQuant가 실제로 도움이 되는가?
69131
70132``` bash
71- git clone https://github.com/quantumaikr/TurboQuant.cpp && cd TurboQuant.cpp
72- bash scripts/quickstart.sh " What is deep learning?"
133+ bash bench/ablation_test.sh model.tqm
73134```
74135
75- ### KV 캐시 옵션
136+ ` uniform_4b ` , ` turbo_kv_3b ` , ` turbo_kv_1b ` 를 50-300 토큰에서 비교하여 각 방법이 uniform 베이스라인에서 발산하는 지점을 보여줍니다.
137+
138+ - ** turbo_kv_3b** (코드북 + QJL): 일반적으로 모든 테스트 길이에서 ` uniform_4b ` 와 일치
139+ - ** turbo_kv_1b** (부호 해시만): 긴 컨텍스트에서 발산할 수 있지만 출력은 coherent 유지
140+ - ** RHT 중요** : Randomized Hadamard Transform이 outlier를 균등 분배하여 체계적 양자화 편향 방지
141+
142+ ### V 양자화 현실
143+
144+ "30/30 바이트 동일" 결과는 ** K-only 양자화** (V는 FP16/FP32)에 해당합니다.
145+ V=Q4에서는 더 일찍 발산하지만 coherent하고 사실적으로 정확합니다.
76146
77147``` bash
78- ./build/tq_run model.tqm -p " Hello" -k turbo_kv_3b # 3비트 TurboQuant (권장)
79- ./build/tq_run model.tqm -p " Hello" -k turbo_kv_4b # 4비트 TurboQuant
80- ./build/tq_run model.tqm -p " Hello" -k uniform_4b # 4비트 uniform (베이스라인)
81- ./build/tq_run model.tqm -p " Hello" -M # KV 메모리 통계 표시
148+ bash bench/kv_quality_bench.sh model.tqm # Phase 4: V 양자화 확인 포함
82149```
83150
84- ---
151+ ### Long Context 품질
152+
153+ ``` bash
154+ bash bench/long_quality_test.sh model.tqm # 200, 500, 1000 토큰
155+ ```
85156
86- ## 작동 원리
157+ ### Temperature Sampling
87158
88- ### 알고리즘 (논문 기반)
159+ ``` bash
160+ bash bench/sampling_test.sh model.tqm # T=0.3, T=0.7, 각 3회
161+ ```
89162
90- | 단계 | 내용 | 이유 |
91- | ------| ------| ------|
92- | ** Random Hadamard Transform** | 입력을 회전하여 채널 상관 제거 | 회전 후 좌표가 가우시안 근사 → 단순 스칼라 양자화 가능 |
93- | ** Lloyd-Max 코드북** | 각 회전 좌표를 독립적으로 양자화 | 가우시안 분포에 대한 사전 계산 최적 중심점, 거의 최적 MSE |
94- | ** QJL 잔차** | 양자화 잔차의 1비트 부호 해시 | 내적 추정을 ** 비편향** 으로 만듦 — attention 정확도의 핵심 |
163+ KV 압축이 확률적 샘플링 품질을 저하하지 않음을 검증합니다.
95164
96- MSE 최적 양자화기만으로는 내적에 2/pi ≈ 0.64의 곱셈 편향이 발생합니다. QJL 잔차 보정이 이 편향을 완전히 제거합니다.
165+ ### Sanitizer 검증
166+
167+ ``` bash
168+ bash scripts/sanitize.sh [model.tqm] # ASan + UBSan 빌드 및 테스트
169+ ```
170+
171+ ` -fsanitize=address,undefined ` 로 빌드, 전체 테스트 실행. 메모리 오류 및 정의되지 않은 동작 없음.
97172
98173---
99174
100- ## 기술 상세
175+ ## FAQ
176+
177+ ** Q: "바이트 동일 출력은 K가 중요하지 않다는 뜻 아닌가?"**
178+
179+ 아닙니다. K를 랜덤으로 대체하면 즉시 쓰레기 출력이 됩니다. TurboQuant는 내적 순위를 보존합니다 — attention score 코사인 유사도로 검증: uniform_4b > 0.99, turbo_kv_3b > 0.92, turbo_kv_1b > 0.63 (10회 평균). 랜덤 K는 평균 < 0.09. ` tests/test_attention_distribution.cpp ` 참조.
180+
181+ ** Q: "llama.cpp의 Q4 KV와 뭐가 다른가?"**
182+
183+ llama.cpp는 uniform min-max 양자화를 사용합니다. TurboQuant는 회전 후 가우시안 분포에 최적화된 RHT + Lloyd-Max 코드북을 사용합니다. 2-bit에서 uniform은 attention 코사인 0.96, TurboQuant 3-bit (2-bit 코드북 + 1-bit QJL)은 0.92이지만 QJL 잔차 보정으로 증명 가능한 비편향 내적 추정을 제공합니다.
101184
102- - ** 10,000줄 이상의 C** — 완전한 추론 엔진, 래퍼 아님
103- - ** 10개 양자화 타입** — Uniform, Mixed, PolarQuant, QJL, TurboQuant, TurboQuant KV
104- - ** 논문 충실 구현** — RHT + Lloyd-Max 코드북 + QJL 잔차 (arXiv 2504.19874)
105- - ** 멀티 아키텍처** — Qwen3.5 (DeltaNet) + Gemma 3 (슬라이딩 윈도우), Gemma 4 대응
106- - ** 멀티 샤드 safetensors** — 분할 모델 로딩 (Gemma 4B = 2 샤드)
107- - ** 듀얼 토크나이저** — GPT2 바이트 BPE + SentencePiece 자동 감지
108- - ** TQM 포맷** — 사전 양자화 바이너리, mmap 즉시 로딩
109- - ** NEON 벡터화** — 2-row matmul 배치, fused attention, 스레드 풀
110- - ** 21개 테스트 스위트** — TurboQuant KV 라운드트립, attention 정확도, 코드북 검증 포함
185+ ** Q: "Perplexity는?"**
186+
187+ Attention score 분포가 Spearman 순위 상관 > 0.90 (turbo_kv_3b), > 0.63 (turbo_kv_1b)으로 보존됩니다. Greedy decode는 ~ 120토큰까지 일치. 표준 데이터셋 perplexity 벤치마크 진행 중.
188+
189+ ** Q: "NEON 코드가 정확한가?"**
190+
191+ 모든 NEON 경로가 ` tests/test_neon_scalar.cpp ` 에서 스칼라 참조 구현과 비교 검증됩니다. ASan + UBSan이 25개 전체 테스트 스위트에서 오류 없이 통과.
192+
193+ ** Q: "4B 모델만으로는 — 8B 이상은?"**
194+
195+ 아키텍처는 모델 크기에 독립적입니다. Gemma 3 4B와 Qwen3.5 0.8B가 동일 코드 경로를 사용합니다. 8B 지원 계획 중 (Llama 3.1 8B 아키텍처 지원 진행 중).
196+
197+ ** Q: "RHT 오버헤드는?"**
198+
199+ RHT는 벡터당 O(d log d). 측정 오버헤드: 128차원 벡터당 103 ns. matmul 비용(레이어당 ~ 1ms) 대비 무시할 수준. 전체 양자화 시간: uniform_4b = 217 ns, turbo_kv_1b = 649 ns, turbo_kv_3b = 11710 ns/벡터. ` bench/bench_kv_overhead.cpp ` 참조.
111200
112201---
113202
@@ -117,8 +206,6 @@ MSE 최적 양자화기만으로는 내적에 2/pi ≈ 0.64의 곱셈 편향이
117206- [ QJL] ( https://arxiv.org/abs/2406.03482 ) (AAAI 2025) — KV 캐시를 위한 1비트 양자화 JL 변환
118207- [ PolarQuant] ( https://arxiv.org/abs/2502.02617 ) (AISTATS 2026) — 극좌표 KV 양자화
119208
120- 아키텍처: [ llama.cpp] ( https://github.com/ggerganov/llama.cpp ) , [ vLLM] ( https://github.com/vllm-project/vllm ) , [ ONNX] ( https://github.com/onnx/onnx ) 참조.
121-
122209---
123210
124211** [ QuantumAI Inc.] ( https://quantumai.kr ) ** | [ hi@quantumai.kr ] ( mailto:hi@quantumai.kr )
0 commit comments