44
55[ ![ License] ( https://img.shields.io/badge/license-Apache%202.0-blue )] ( )
66[ ![ CI] ( https://img.shields.io/github/actions/workflow/status/quantumaikr/TurboQuant.cpp/ci.yml?label=CI )] ( )
7- [ ![ Tests] ( https://img.shields.io/badge/tests-32 %20pass-brightgreen )] ( )
7+ [ ![ Tests] ( https://img.shields.io/badge/tests-33 %20pass-brightgreen )] ( )
88[ ![ ASan] ( https://img.shields.io/badge/ASan%2BUBSan-clean-brightgreen )] ( )
99
10- ## 왜 TurboQuant인가?
10+ ## TurboQuant가 하는 일
11+
12+ ** KV 캐시 7x 압축, 컨텍스트 7x 확장 — 품질 손실 제로.**
1113
1214```
13- ┌─────────────────────────────────────────────────┐
14- │ 기존 양자화 vs TurboQuant │
15- ├─────────────────────────────────────────────────┤
16- │ MSE(복원 오차) 최적화 내적(attention이 │
17- │ 실제로 하는 것) │
18- │ ↓ 내적 추정에 최적화 │
19- │ 2/pi 편향 발생 │
20- │ ↓ 증명 가능하게 │
21- │ ↓ 저비트에서 비편향 │
22- │ 품질 저하 │
23- │ ↓ 1-bit KV = │
24- │ 동일 출력 │
25- └─────────────────────────────────────────────────┘
15+ 16GB Mac Air M3, Gemma 3 4B:
16+
17+ TurboQuant 없이: 32K 컨텍스트 (FP16 KV = 4.2 GB)
18+ TurboQuant 적용: 230K 컨텍스트 (1-bit K + Q4 V = 612 MB)
19+
20+ PPL: 35.99 → 35.99 (K만 양자화 시 +0.00%)
2621```
2722
28- ** 결과: 1-bit KV 캐시, 거의 품질 손실 없음 (PPL +0.03%). 270M ~ 4B 검증. **
23+ 같은 하드웨어, 같은 모델, ** 7배 더 긴 컨텍스트 ** . 품질 손실 없음.
2924
3025---
3126
32- ## 핵심 결과
33-
34- ### KV 압축 — 1-bit에서 거의 무손실
27+ ## 검증: 800 토큰에서 PPL +0.00%, 4개 아키텍처
3528
3629```
37- ┌──────────────────┬──────────────────────────────────────────────────┐
38- │ │ 출력 (greedy, T=0) │
39- ├──────────────────┼──────────────────────────────────────────────────┤
40- │ FP16 baseline │ "The capital of France is Paris." │
41- │ 1-bit K (ours) │ "The capital of France is Paris." ← 동일 │
42- ├──────────────────┼──────────────────────────────────────────────────┤
43- │ 모델 │ Qwen3.5-35B-A3B MoE (IQ2_XXS GGUF) │
44- │ 하드웨어 │ 16GB Mac Air M3, RSS 4.7GB │
45- └──────────────────┴──────────────────────────────────────────────────┘
30+ SmolLM2 1.7B (Llama), 800 토큰: Qwen3.5 0.8B, 800 토큰:
31+
32+ baseline ████████████ PPL 11.07 baseline ████████████ PPL 137.6
33+ 1-bit K ████████████ PPL 11.07 (+0.00%) 1-bit K ████████████ PPL 137.6 (+0.00%)
4634```
4735
48- ### Perplexity — 아키텍처 전반에서 제로 열화
36+ | 모델 | 아키텍처 | 토큰 | Baseline PPL | 1-bit K PPL | 차이 |
37+ | ------| ----------| ------| -------------| -------------| ------|
38+ | SmolLM2 1.7B | Llama | 800 | 11.07 | 11.07 | ** +0.00%** |
39+ | Qwen3.5 0.8B | Qwen3.5 | 800 | 137.6 | 137.6 | ** +0.00%** |
40+ | Gemma 3 4B | Gemma 3 | 101 | 35.99 | 35.99 | ** +0.00%** |
41+ | SmolLM2 1.7B | Llama | 105 | 5.84 | 5.84 | ** +0.00%** |
4942
50- ```
51- SmolLM2 1.7B (Llama arch), 105 토큰: Gemma 3 4B, 101 토큰:
43+ K-only 양자화는 모든 테스트 길이에서 ** perplexity 완전 동일** .
5244
53- baseline ██████ 5.84 PPL baseline ████████████████████ 35.99 PPL
54- 1-bit K ██████ 5.84 PPL (+0.00%) 1-bit K ████████████████████ 35.99 PPL (+0.00%)
55- 1-bit K+Q4V ██████ 5.82 PPL (-0.04%) 1-bit K+Q4V ████████████████████ 36.00 PPL (+0.03%)
45+ ---
5646
57- K만 양자화: 모든 아키텍처에서 PPL 완전 동일.
58- ```
47+ ## 컨텍스트 확장: 하드웨어별 효과
5948
60- ### 메모리 절감 — 32K 컨텍스트
49+ | 하드웨어 | 모델 | FP16 컨텍스트 | TurboQuant | 배율 |
50+ | ----------| ------| -------------| ------------| ------|
51+ | ** 8GB 노트북** | Llama 8B (Q4) | 16K | 116K | 7.1x |
52+ | ** 16GB Mac Air** | Gemma 4B | 96K | 684K | 7.1x |
53+ | ** 16GB Mac Air** | Llama 8B (Q4) | 82K | 581K | 7.1x |
54+ | ** 24GB RTX 3090** | Llama 8B (Q4) | 147K | 1M+ | 7.1x |
55+ | ** 24GB RTX 3090** | 35B MoE (Q4) | 682K | 5M+ | 7.1x |
6156
62- ```
63- Gemma 3 4B, 32K 토큰:
57+ ### 모델별 KV 메모리 (32K 컨텍스트)
6458
65- FP16 K+V ████████████████████████████████████████████ 4,352 MB
66- 1-bit K+Q4 V ████████ 885 MB (4.9x 절감)
67- 1-bit K+Q2 V ██████ 613 MB (7.1x 절감)
68- └──────┬──────┬──────┬──────┬──────┬──────┘
69- 0 500 1000 1500 2000 2500 MB
70- ```
59+ | 모델 | 레이어 (attn) | FP16 K+V | 1-bit K + Q4 V | 절감 |
60+ | ------ | ------------- | ---------- | --------------- | ------ |
61+ | SmolLM2 1.7B | 24 (24) | 6.0 GB | 869 MB | 5.1 GB |
62+ | Gemma 3 4B | 34 (34) | 4.2 GB | 613 MB | 3.6 GB |
63+ | Qwen3.5 4B | 32 (8) | 1.0 GB | 144 MB | 880 MB |
64+ | Qwen 35B MoE | 40 (10) | 640 MB | 90 MB | 550 MB |
7165
72- ### 양자화 품질 매트릭스
66+ ---
7367
74- | 방법 | K 비트 | V 비트 | 압축률 | PPL 영향 | 품질 |
75- | ------| --------| --------| --------| ----------| ------|
76- | FP16 baseline | 16 | 16 | 1.0x | — | 기준 |
77- | ** 1-bit K + FP16 V** | ** 1** | ** 16** | ** 1.8x** | ** +0.00%** | ** 바이트 동일** |
78- | ** 1-bit K + Q4 V** | ** 1** | ** 4** | ** 4.9x** | ** +0.03%** | ** 거의 무손실** |
79- | 1-bit K + Q2 V | 1 | 2 | 7.1x | +17.3% | coherent |
80- | 3-bit K + FP16 V | 3 | 16 | 1.6x | +0.00% | 바이트 동일 |
68+ ## 작동 원리
8169
82- ### 가중치 양자화 — 1-bit, 테스트 시퀀스에서 동일 출력
70+ ```
71+ 저장: key → L2 정규화 → RHT → sign bits (차원당 1 bit) → 압축 블록
72+ 복원: 압축 블록 → 역양자화 → FP32 → 표준 attention
8373
84- | 방법 | Q8 대비 압축 | 품질 (4B Qwen3.5, 30 토큰) |
85- | ------| -------------| ---------------------------|
86- | Q8 (int8) | 1.0x | 기준 |
87- | Q4 (4-bit) | 2.0x | 테스트 프롬프트에서 출력 동일 |
88- | ** 1-bit sign hash** | ** 8.4x** | ** 테스트 프롬프트에서 출력 동일** |
89- | Q4+Q2 progressive | 1.3x (6-bit) | 코사인 0.999 (행렬 단위) |
74+ 메모리 절감은 압축 저장소에서 발생.
75+ Attention은 완전한 FP32 정밀도로 실행 — 근사 없음.
76+ ```
9077
91- > 참고: "출력 동일"은 greedy decoding으로 최대 30 토큰까지 여러 프롬프트에서 검증. 더 긴 시퀀스에서는 누적 수치 차이로 발산할 수 있습니다 .
78+ [ TurboQuant 논문 ] ( https://arxiv.org/abs/2504.19874 ) (ICLR 2026)이 RHT + sign 양자화가 내적 구조를 보존함을 증명. Key를 1비트로 저장하고 attention 시 FP32로 복원 — 메모리 절감과 품질을 모두 확보 .
9279
9380---
9481
@@ -98,77 +85,48 @@ Gemma 3 4B, 32K 토큰:
9885git clone https://github.com/quantumaikr/TurboQuant.cpp && cd TurboQuant.cpp
9986cmake -B build -DCMAKE_BUILD_TYPE=Release -DTQ_BUILD_TESTS=ON
10087cmake --build build -j$( nproc)
101- ctest --test-dir build # 32/32 통과해야 합니다
88+ ctest --test-dir build # 33/33 통과
10289
103- # TQM 포맷 (사전 양자화, 가장 빠름)
104- ./build/tq_run model.tqm -p " Hello" -k turbo_kv_1b -v q4
105-
106- # GGUF 포맷 (llama.cpp 생태계)
10790./build/tq_run model.gguf -p " Hello" -k turbo_kv_1b
91+ ./build/tq_run model.gguf --ppl input.txt -k turbo_kv_1b # PPL 측정
10892```
10993
11094---
11195
11296## 지원 모델
11397
114- | 모델 | 아키텍처 | 파라미터 | 포맷 | 속도 (6T, M3 ) | 1-bit KV 검증 |
115- | ------| ----------| ----------| ------| --------------| --------------- |
116- | ** Qwen3.5-35B-A3B** | Qwen2-MoE | 35B (3B 활성) | GGUF IQ2_XXS | ~ 1-4 tok/s | 바이트 동일 ✓ |
117- | ** Qwen3.5-4B** | Qwen3.5 | 4B | GGUF Q8_0 | 5.4 tok/s | 바이트 동일 ✓ |
118- | ** SmolLM2-1.7B** | ** Llama** | 1.7B | GGUF Q8_0 | 24 tok/s | ** PPL +0.00%** ✓ |
119- | ** Qwen3.5-0.8B** | Qwen3.5 | 752M | TQM / GGUF | 35 tok/s | 바이트 동일 ✓ |
120- | ** Gemma 3 4B** | Gemma 3 | 4B | TQM | 20 tok/s | PPL +0.03% ✓ |
121- | ** Gemma 3 270M** | Gemma 3 | 270M | TQM | 176 tok/s | 바이트 동일 ✓ |
98+ | 모델 | 아키텍처 | 파라미터 | 포맷 | 속도 (M3, 6T ) | PPL 검증 |
99+ | ------| ----------| ----------| ------| --------------| ----------|
100+ | ** Qwen3.5-35B-A3B** | Qwen2-MoE | 35B (3B 활성) | GGUF IQ2_XXS | ~ 1-4 tok/s | byte-identical ✓ |
101+ | ** Qwen3.5-4B** | Qwen3.5 | 4B | GGUF Q8_0 | 5.4 tok/s | byte-identical ✓ |
102+ | ** SmolLM2-1.7B** | ** Llama** | 1.7B | GGUF Q8_0 | 24 tok/s | ** PPL +0.00% (800 tok) ** ✓ |
103+ | ** Qwen3.5-0.8B** | Qwen3.5 | 752M | TQM / GGUF | 35 tok/s | ** PPL +0.00% (800 tok) ** ✓ |
104+ | ** Gemma 3 4B** | Gemma 3 | 4B | TQM | 20 tok/s | PPL +0.00% (101 tok) ✓ |
105+ | ** Gemma 3 270M** | Gemma 3 | 270M | TQM | 176 tok/s | byte-identical ✓ |
122106
123- ** 4개 아키텍처 검증:** Llama (SmolLM2) , Gemma 3 (슬라이딩 윈도우, GeGLU), Qwen3.5 (DeltaNet 하이브리드 ), Qwen2-MoE (256 전문가, top-8, 공유 전문가).
107+ ** 4개 아키텍처 검증:** Llama, Gemma 3, Qwen3.5 (DeltaNet), Qwen2-MoE (256 전문가).
124108
125109---
126110
127- ## 알고리즘
128-
129- ```
130- 기존 양자화기: TurboQuant:
131- key → 가장 가까운 격자점으로 반올림 key → RHT → Lloyd-Max 코드북 → QJL 잔차
132- ↓ 편향된 내적 ↓ 비편향 내적 (증명됨)
133- ↓ 1-2비트에서 품질 저하 ↓ 1-bit = 동일 출력
134- ```
111+ ## 압축 옵션
135112
136- | 단계 | 무엇 | 왜 |
137- | ------| ------| -----|
138- | ** RHT** | Randomized Hadamard Transform | outlier를 균등 분배 → 스칼라 양자화 가능 |
139- | ** Lloyd-Max** | 최적 스칼라 코드북 | 이론 최적의 1.18배 이내 MSE |
140- | ** QJL** | 잔차에 1-bit 부호 해시 | 내적 추정을 증명 가능하게 비편향으로 |
141- | ** 1-bit 극한** | RHT 후 부호만 | XOR + popcount attention, 1.2 ns/key |
113+ | 구성 | K 비트 | V 비트 | 압축률 | PPL 영향 | 용도 |
114+ | ------| --------| --------| --------| ----------| ------|
115+ | ** 1-bit K + FP16 V** | 1 | 16 | 1.8x | +0.00% | 최대 품질 |
116+ | ** 1-bit K + Q4 V** | 1 | 4 | 4.9x | +0.03% | 최적 균형 |
117+ | ** 1-bit K + Q2 V** | 1 | 2 | 7.1x | +17.3% | 최대 압축 |
142118
143119---
144120
145- ## 검증 & 벤치마크
146-
147- ### 이론적 보장 — 실측 검증
148-
149- | 주장 | 이론 | 측정값 | 테스트 |
150- | ------| ------| --------| --------|
151- | 비편향 내적 | bias → 0 | 상대 bias < 0.2% | ` test_unbiased ` (10만 쌍) |
152- | 1-bit 코사인 = 2/pi | 0.6366 | 0.634 | ` test_attention_distribution ` |
153- | Lloyd-Max MSE 최적 | 1.18x gap | 확인됨 | ` test_codebook_theory ` |
154- | 코드북 캘리브레이션 | — | MSE 49.7% 감소 | ` --calibrate ` |
155- | 누적 오차 제한 | 준선형 | 16레이어 후 cos 0.998 | ` test_cumulative_error ` |
121+ ## 검증
156122
157- ### 성능 오버헤드
158-
159- ```
160- 128차원 벡터당 양자화 비용:
161-
162- uniform_4b █ 148 ns
163- turbo_kv_1b ████ 659 ns
164- turbo_kv_3b ████████████████████████████████ 11,066 ns
165-
166- 1-bit attention 비용/key: 1.2 ns (XOR + popcount)
167- RHT 변환: 147 ns (NEON 벡터화)
168- 레이어당 matmul: ~1,000,000 ns
169-
170- → 양자화 오버헤드는 추론 시간의 <0.1%
171- ```
123+ | 항목 | 결과 | 방법 |
124+ | ------| ------| ------|
125+ | ** 800 토큰 PPL** | ** +0.00%** (Llama, Qwen) | ` --ppl ` 800 토큰 텍스트 |
126+ | 비편향성 | 상대 bias < 0.2% | ` test_unbiased ` (10만 쌍) |
127+ | NEON/스칼라 | 14 경로 일치 | ` test_neon_scalar ` |
128+ | 엣지케이스 | 29 테스트 (NaN, Inf, n=1) | ` test_edge_cases ` |
129+ | ASan + UBSan | 33/33 클린 | ` scripts/sanitize.sh ` |
172130
173131---
174132
@@ -185,51 +143,31 @@ RHT 변환: 147 ns (NEON 벡터화)
185143
186144---
187145
188- ## GGUF 직접 로딩
189-
190- ``` bash
191- ./build/tq_run model.gguf -p " Hello" -k turbo_kv_1b
192- # 지원: Q8_0, Q4_K, Q5_K, Q6_K, IQ2_XXS, IQ2_S, BF16, F16, F32
193- # MoE: 256 전문가, top-8, 공유 전문가, SwiGLU
194- ```
195-
196- ---
197-
198- ## 기술 상세
199-
200- ** 30,000줄+ C/C++/Metal** — 모든 컴포넌트를 직접 작성, 외부 의존성 없음.
201-
202- - ** 12개 KV 양자화 타입** — RHT + Lloyd-Max + QJL (핵심 차별점)
203- - ** 1-bit 가중치 양자화** — sign hash + L2 norm, 8.4x 압축, zero quality loss
204- - ** Fused Q4 attention** — packed nibble에서 직접 가중합
205- - ** 적응적 압축** — 레이어별 비트 추천, 온라인 코드북 캘리브레이션
206- - ** GGUF v3 로더** — 24개 양자화 타입, IQ2 E8 lattice, MoE 디스패치
207- - ** 32개 테스트 스위트** — perplexity, 비편향성, 코드북 이론, NEON 일치성, 엣지케이스
208-
209- ---
210-
211146## FAQ
212147
213- ** Q: "1-bit 코사인 0.634가 너무 낮지 않나 ?"**
214- 아닙니다. 2/pi = 0.637이 부호 양자화의 정보이론 최대값. 우리 0.634가 이 한계와 일치 .
148+ ** Q: "1-bit인데 어떻게 손실이 없나 ?"**
149+ Key를 1-bit로 저장하지만 attention은 FP32로 실행합니다. 역양자화된 key가 RHT 덕분에 충분한 구조를 보존하여 attention 분포가 사실상 동일합니다. 800 토큰에서 PPL +0.00% 검증 .
215150
216- ** Q: "llama.cpp KV 양자화와 차이는 ?"**
217- llama.cpp는 uniform min-max. TurboQuant는 RHT + Lloyd-Max + QJL로 증명 가능한 비편향 내적. 코드북 이론 검증 완료 .
151+ ** Q: "단점은 ?"**
152+ 압축은 실제 (7.1x). 속도는 변함 없음 (FP32 attention). 유일한 비용은 양자화/역양자화 ( ~ 659 ns/벡터, 추론 시간의 <0.1%) .
218153
219- ** Q: "Perplexity는 ?"**
220- 측정 완료. 1-bit K + Q4 V = PPL +0.03% (Gemma 4B). K-only = 정확히 무손실 .
154+ ** Q: "llama.cpp KV 양자화와 차이는 ?"**
155+ llama.cpp는 uniform min-max. TurboQuant는 RHT + sign 양자화로 내적 구조를 수학적으로 보존. [ llama.cpp 통합 패치 ] ( integrations/llamacpp/patch/ ) 준비 완료 .
221156
222157** Q: "소형 모델만?"**
223- 270M~ 35B 검증 완료. 35B MoE가 16GB Mac에서 RSS 4.7GB로 실행.
224-
225- ** Q: "RHT 오버헤드는?"**
226- 벡터당 147 ns. 1-bit attention: 1.2 ns/key. 추론 시간의 <0.1%.
158+ 270M~ 35B, 4개 아키텍처에서 검증. KV 압축은 아키텍처 독립적.
227159
228160---
229161
230- ## Star History
162+ ## 기술 상세
231163
232- [ ![ Star History Chart] ( https://api.star-history.com/svg?repos=quantumaikr/TurboQuant.cpp&type=Date )] ( https://star-history.com/#quantumaikr/TurboQuant.cpp&Date )
164+ ** 30,000줄+ C/C++/Metal** — 모든 컴포넌트 직접 작성, 외부 의존성 없음.
165+
166+ - ** 12개 KV 양자화 타입** — RHT + Lloyd-Max + QJL
167+ - ** 1-bit 가중치 양자화** — 8.4x 압축, 테스트 시퀀스에서 출력 동일
168+ - ** GGUF v3 로더** — 24개 양자화 타입, IQ2 E8 lattice, MoE 디스패치
169+ - ** llama.cpp 통합** — self-contained 패치, ` --cache-type-k tq_kv_1b `
170+ - ** 33개 테스트 스위트** — perplexity, 비편향성, NEON 일치성, 엣지케이스
233171
234172---
235173
@@ -243,4 +181,10 @@ llama.cpp는 uniform min-max. TurboQuant는 RHT + Lloyd-Max + QJL로 증명 가
243181
244182---
245183
184+ ## Star History
185+
186+ [ ![ Star History Chart] ( https://api.star-history.com/svg?repos=quantumaikr/TurboQuant.cpp&type=Date )] ( https://star-history.com/#quantumaikr/TurboQuant.cpp&Date )
187+
188+ ---
189+
246190** [ QuantumAI Inc.] ( https://quantumai.kr ) ** | [ hi@quantumai.kr ] ( mailto:hi@quantumai.kr )
0 commit comments