- TurboQuant๋ Google Research๊ฐ 2025๋ ๋ฐํํ LLM KV ์บ์ ๊ทนํ ์์ถ ์๊ณ ๋ฆฌ์ฆ
- ๋ชจ๋ธ ์ฌํ์ต ์์ด KV ์บ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ 6๋ฐฐ ์ถ์ํ๋ฉด์ ์ ํ๋ ์์ค 0์ธ ๋ฌด์์ค ์์ํ ๊ธฐ๋ฒ
- PolarQuant(๊ทน์ขํ ๋ณํ)์ QJL(1๋นํธ ์ค์ฐจ ๋ณด์ )์ 2๋จ๊ณ ํ์ดํ๋ผ์ธ
- ICLR 2026 ์ฑํ ๋ ผ๋ฌธ์ด์ ์ด๋ก ์ ์ต์ ํ๊ณ์ ๊ทผ์ ํ ์ํ์ ๋ณด์ฅ์ ๊ฐ์ง ์๊ณ ๋ฆฌ์ฆ
ํด๋น ๊ฐ๋ ์ด ํ์ํ ์ด์
LLM์ด ๊ธธ์ด์ง ๋ํ๋ฅผ ์ฒ๋ฆฌํ ์๋ก KV Cache ๊ฐ ์ฐจ์งํ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํญ๋ฐ์ ์ผ๋ก ๋์ด๋๋ค. ์ปจํ ์คํธ ์ฐฝ์ด 128K โ 1M ํ ํฐ์ผ๋ก ์ปค์ง๋ฉด์ KV ์บ์๊ฐ ๋ชจ๋ธ ๊ฐ์ค์น๋ณด๋ค ๋ ํฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํ๋ ์ญ์ ํ์๊น์ง ์๊ฒผ๋ค.
AS-IS
sequenceDiagram autonumber participant User as ์ฌ์ฉ์ participant LLM as LLM participant KVCache as KV ์บ์ (๋ฉ๋ชจ๋ฆฌ) User->>LLM: "์๊น ๋ด๊ฐ ํ ๋ง ๊ธฐ์ตํด?" LLM->>KVCache: ์ด์ ํ ํฐ ์ ์ฒด KยทV ํ ์ ์ ์ฅ (FP16) Note over KVCache: LLaMA-2 13B ๊ธฐ์ค<br/>4K ํ ํฐ = ์ฝ 4GB<br/>100K ํ ํฐ = ์ฝ 100GB KVCache-->>LLM: ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ โ ๋ํ ๊ธธ์ด ์ ํ LLM-->>User: ๊ธด ๋ฌธ์ ์ฒ๋ฆฌ ๋ถ๊ฐ / ๋๋ฆฐ ์๋ต
TO-BE
sequenceDiagram autonumber participant User as ์ฌ์ฉ์ participant LLM as LLM participant TurboQuant as TurboQuant participant KVCache as KV ์บ์ (๋ฉ๋ชจ๋ฆฌ) User->>LLM: "์๊น ๋ด๊ฐ ํ ๋ง ๊ธฐ์ตํด?" LLM->>TurboQuant: KยทV ๋ฒกํฐ ์์ถ ์์ฒญ TurboQuant->>TurboQuant: Stage 1: PolarQuant โ 3๋นํธ TurboQuant->>TurboQuant: Stage 2: QJL โ 1๋นํธ ์ค์ฐจ ๋ณด์ TurboQuant->>KVCache: 6๋ฐฐ ์์์ง ์บ์ ์ ์ฅ KVCache-->>LLM: ๋์ผ ๋ฉ๋ชจ๋ฆฌ์์ 6๋ฐฐ ๊ธด ๋ฌธ๋งฅ ์ฒ๋ฆฌ LLM-->>User: 104,000 ํ ํฐ๋ 100% ์ ํ ์๋ต
์ต๊ทผ ์ฃผ๋ชฉ๋ฐ๋ ์ด์ 3๊ฐ์ง
1. ์ปจํ ์คํธ ์ ์์ ๋ณ๋ชฉ์ด ์ ํํ KV ์บ์
2025๋ ์ดํ LLM๋ค์ด 32K โ 128K โ 1M ํ ํฐ์ผ๋ก ์ปจํ ์คํธ ์ฐฝ์ ํค์ฐ๋ฉด์ KV Cache ๊ฐ ์ฐจ์งํ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ชจ๋ธ ๊ฐ์ค์น๋ณด๋ค ๋ ์ปค์ง๋ ์ญ์ ํ์์ด ๋ฐ์ํ๋ค. TurboQuant๋ ์ด ๋ณ๋ชฉ์ ์ ์กฐ์คํ๋ค.
2. ์ฌํ์ต ์์ด ์ฆ์ ์ ์ฉ
๊ธฐ์กด ์์ํ ๊ธฐ๋ฒ์ ๋ชจ๋ธ์ ๋ค์ ํ์ธํ๋ํด์ผ ํ์ง๋ง, TurboQuant๋ ์๋น ์ค ๋ฐํ์์ ๋ฐ๋ก ์ ์ฉ ๊ฐ๋ฅํ๋ค. Gemma, Mistral์ ์ฝ๋ ํ ์ค ์ถ๊ฐ ์์ค์ผ๋ก ๋ถ์ผ ์ ์๋ค.
3. H100์์ 8๋ฐฐ ์๋ ํฅ์ โ ํด๋ผ์ฐ๋ ๋น์ฉ ์ง๊ฒฐ
์ด ์๋ ํฅ์์ ๋จ์ํ โ๋น ๋ฅด๋คโ๋ ๊ฒ ์๋๋ผ ํด๋ผ์ฐ๋ ๋น์ฉ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊พผ๋ค๋ ์๋ฏธ๋ค.
KV Cache ๋ฌธ์์์ ์ค๋ช ํ ๊ฒ์ฒ๋ผ LLM ํ ํฐ ์์ฑ(Decode Phase)์ ๋ณ๋ชฉ์ ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ์ด๋ค โ GPU๊ฐ ์บ์์์ KยทV ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ์๋๊ฐ ์ ์ฒด ์ฒ๋ฆฌ ์๋๋ฅผ ๊ฒฐ์ ํ๋ค.
FP16 KV ์บ์: ํ ํฐ๋น ์ฝ์ด์ผ ํ ๋ฐ์ดํฐ = 16๋นํธ
TurboQuant KV ์บ์: ํ ํฐ๋น ์ฝ์ด์ผ ํ ๋ฐ์ดํฐ = 3.5๋นํธ
โ ์ฝ์ด์ผ ํ ๋ฐ์ดํฐ ์ = ์ฝ 1/4.5
H100 ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ (3.35 TB/s)์ ๋์ผํ๊ฒ ์ด๋ค๊ณ ํ๋ฉด:
โ ๊ฐ์ ์๊ฐ์ ์ฒ๋ฆฌํ ์ ์๋ ํ ํฐ ์ โ 4~8๋ฐฐ ์ฆ๊ฐ
AWS H100 ์ธ์คํด์ค ๋น์ฉ์ด ์๊ฐ๋น ์์ญ ๋ฌ๋ฌ์ธ๋ฐ, ๊ฐ์ GPU๋ก 8๋ฐฐ ๋ง์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์๋ค๋ฉด ํ ํฐ๋น ๋น์ฉ์ด 1/8๋ก ์ค์ด๋๋ ๊ฒ๊ณผ ๊ฐ๋ค.
์๋ ์๋ฆฌ โ 2๋จ๊ณ ํ์ดํ๋ผ์ธ
์ ์ : ์ซ์๋ฅผ ์ค์ด๋ฉด ์ ๋ฌธ์ ๊ฐ ์๊ธฐ๋๊ฐ
LLM์ KV Cache์ ์ ์ฅ๋๋ KยทV ํ ์์ ๊ฐ ์ซ์๋ ๋ณดํต FP16(16๋นํธ)๋ก ์ ์ฅ๋๋ค. ์ด๋ฅผ 3๋นํธ๋ก ์ค์ด๋ฉด ์ ์ฅ ๊ณต๊ฐ์ด 5๋ฐฐ ์ด์ ์ค์ด๋ ๋ค.
๋ฌธ์ : ์ซ์ ์ ๋ฐ๋๋ฅผ ์ค์ด๋ฉด ์ค์ฐจ๊ฐ ์๊ธด๋ค. ๊ธฐ์กด ์์ํ ๋ฐฉ๋ฒ๋ค์ ์ด ์ค์ฐจ๋ฅผ ๋ณด์ ํ๊ธฐ ์ํด โ๋ณด์ ๊ฐ(normalization constant)โ์ ๋ธ๋ก๋ง๋ค ๋ฐ๋ก ์ ์ฅํ๋ค.
๊ธฐ์กด ๋ฐฉ๋ฒ:
[๋ฒกํฐ 16๊ฐ] โ ์์ถ โ [3๋นํธ ๊ฐ 16๊ฐ] + [๋ณด์ ์์ FP16 1๊ฐ]
์ค์ ์์ถ๋ฅ : (16 ร 3 + 16) รท (16 ร 16) โ ์ ๋ฐ๋ฐ์ ์ ๋จ
TurboQuant์ ํต์ฌ ์์ด๋์ด: ๋ณด์ ๊ฐ์ด ํ์ ์๋ ์ขํ๊ณ๋ก ๋ฐ๊พธ๋ฉด ์ด๋จ๊น?
Stage 1 โ PolarQuant: โ๋ฐฉํฅ๊ณผ ๊ฑฐ๋ฆฌโ๋ก ํํ์ ๋ฐ๊พผ๋ค
์ ์ขํ๊ณ ๋ณํ์ธ๊ฐ
๊ณ ๋ฑํ๊ต ์ํ์์ ๋ฐฐ์ฐ๋ ๊ทน์ขํ๊ณ(polar coordinates) ๋ฅผ ๋ ์ฌ๋ ค๋ณด์. ์ ์ ์์น๋ฅผ ํํํ๋ ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
| ๋ฐฉ๋ฒ | ํํ | ํน์ง |
|---|---|---|
| ์ง๊ต์ขํ (x, y) | โ์ค๋ฅธ์ชฝ 3, ์ 4โ | ๊ธฐ์ค์ ์ด ๋ฐ๋๋ฉด ๊ฐ๋ ๋ฐ๋ |
| ๊ทน์ขํ (r, ฮธ) | โ๊ฑฐ๋ฆฌ 5, ๊ฐ๋ 53ยฐโ | ๊ฑฐ๋ฆฌ์ ๋ฐฉํฅ์ด ๋ถ๋ฆฌ๋จ |
ํต์ฌ ๋น์ : ๋คํธํ๊ณผ ์ง๊ต ๊ฒฉ์
์ง๊ต์ขํ๋ก ํ์ํ ๋คํธ ์ ์ ๊ธฐ๋กํ:
์ ์๊ฐ ๋คํธ๋ฅผ ๋์ง ์์น๋ฅผ (x, y)๋ก ๊ธฐ๋ก
โ ๋งค ๊ฒฝ๊ธฐ ์ ์ "์ค๋ ๋คํธํ ํฌ๊ธฐ"(๋ณด์ ๊ฐ)๋ฅผ ๋ณ๋๋ก ๊ธฐ๋กํด์ผ ํจ
โ ํ ํฌ๊ธฐ ๋ชจ๋ฅด๋ฉด ์ขํ๊ฐ ์๋ฏธ ์์
๊ทน์ขํ๋ก ํ์ํ ๋คํธ ์ ์ ๊ธฐ๋กํ:
์ ์๊ฐ ๋คํธ๋ฅผ ๋์ง ์์น๋ฅผ (๊ฑฐ๋ฆฌ, ๊ฐ๋)๋ก ๊ธฐ๋ก
โ "์ ์ค์์์ 3cm ๊ฑฐ๋ฆฌ, ์๊ณ 2์ ๋ฐฉํฅ"
โ ๊ฐ๋๋ 360ยฐ ์ค ํ๋ โ ํ ํฌ๊ธฐ์ ๋ฌด๊ดํ๊ฒ ๊ณ ์ ๋ ์๋ฏธ
KV ์บ์ ๋ฒกํฐ๋ค์ ํน์ฑ์ ๋ฐฉํฅ(๊ฐ๋)์ด ์ข์ ๋ฒ์์ ๋ชฐ๋ ค ์๋ค. ์ด ๊ฐ๋๋ค์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด๋ ๊ณ ์ ๊ฒฉ์(codebook) ์ ๋งคํํ ์ ์์ด์ ๋ณด์ ๊ฐ ์์ด ์์ถ์ด ๊ฐ๋ฅํด์ง๋ค.
PolarQuant ์ฒ๋ฆฌ ๊ณผ์ :
[K ๋ฒกํฐ: (xโ, xโ, ..., xโโโ)]
โ ๊ทน์ขํ ๋ณํ
[๋ฐ์ง๋ฆ r (ํฌ๊ธฐ)] + [๊ฐ๋ ฮธโ, ฮธโ, ... (๋ฐฉํฅ๋ค)]
โ
๊ฐ๋๋ค์ ๊ณ ์ ์ฝ๋๋ถ์ ๊ฐ์ฅ ๊ฐ๊น์ด ๊ฒฉ์์ ์ ๋งคํ
โ
[r: 4๋นํธ] + [๊ฐ๋ ์ธ๋ฑ์ค: 3๋นํธ ร n๊ฐ]
๋ณด์ ๊ฐ(normalization constant): 0๋นํธ ํ์
์ด๊ฒ์ด ๊ธฐ์กด ๋ฐฉ๋ฒ์ด 1~2๋นํธ ์ค๋ฒํค๋๋ฅผ ํผํ ์ ์์๋ ๊ฒ์ ์์ ํ ์ ๊ฑฐํ๋ ๋ฐฉ์์ด๋ค.
Stage 2 โ QJL: โ๊ทธ๋ฆผ์โ๋ก ์ค์ฐจ๋ฅผ 1๋นํธ์ ๋ด๋๋ค
PolarQuant ์ดํ์๋ ์ค์ฐจ๊ฐ ๋จ๋ ์ด์
์๋ฌด๋ฆฌ ์ ๊ตํ๊ฒ ๊ทน์ขํ๋ก ๋ณํํด๋ 3๋นํธ๋ก ์ค์ธ ์ด์ ๋ฏธ์ธํ ์ค์ฐจ๊ฐ ๋จ๋๋ค. ์ด ์ค์ฐจ๊ฐ Attention ์ ์ ๊ณ์ฐ์ ์์ด๋ฉด:
์๋ ๊ณ์ฐ: score = Q ยท K_original
์์ถ ํ: score = Q ยท K_compressed
์ค์ฐจ: ฮ = Q ยท (K_original - K_compressed)
์ด ฮ๊ฐ ํฌ๋ฉด ๋ชจ๋ธ์ด โ์ด๋ ํ ํฐ์ ์ง์คํด์ผ ํ๋์งโ ํ๋จ์ ์๋ชป ๋ด๋ฆฐ๋ค.
์กด์จ-๋ฆฐ๋ด์ํธ๋ผ์ฐ์ค ๋ณํ โ ๊ณ ๋ฑํ์ ๋น์
์ฌ๋ก ์กฐ์ฌ ๋น์ :
์ ๊ตญ 5000๋ง ๋ช ์ ์ ์น ์ฑํฅ์ ํ์ ํ๊ณ ์ถ๋ค. ๊ฐ ์ฌ๋์ ์ฑํฅ์ 1~100์ ์ผ๋ก ์ ํํ ๋ฌผ์ ์๋ ์์ง๋ง, QJL์ ๋ค๋ฅธ ์ ๊ทผ์ ํ๋ค.
์ ํต์ ๋ฐฉ๋ฒ: "์ ์น ์ฑํฅ ์ ์ ๋งํด์ฃผ์ธ์" โ ์ ๋ฐํ ์ซ์ โ ์ ์ฅ ๊ณต๊ฐ ๅคง
QJL ๋ฐฉ๋ฒ: "์ด ์ ์ฑ
์ ์ฐฌ์ฑํ๋์?" (์/์๋์ค๋ง) โ 1๋นํธ โ ์ ์ฅ ๊ณต๊ฐ ๊ทน์
ํต์ฌ์ ๋ฌด์์๋ก ์ ํํ ์ง๋ฌธ ์ฌ๋ฌ ๊ฐ์ ์/์๋์ค๋ง ๋ชจ์๋, ๊ทธ ์งํฉ์ด ์ ์ฒด ์ค์ฐจ์ ๋ฐฉํฅ(ํธํฅ) ์ ์ถฉ๋ถํ ํฌ์ฐฉํ๋ค๋ ์ํ์ ์ฆ๋ช ์ด๋ค. ์ด๊ฒ์ด ์กด์จ-๋ฆฐ๋ด์ํธ๋ผ์ฐ์ค ์ ๋ฆฌ๋ค.
๊ทธ๋ฆผ์ ๋น์ (๋ ์ง๊ด์ ):
์ค์ฐจ ๋ฒกํฐ = 3D ๊ณต๊ฐ์ ๋ฌผ์ฒด
QJL์ด ํ๋ ์ผ:
1. ๋ฌด์์ ๋ฐฉํฅ์์ ์์ ๋ฑ์ผ๋ก ๋น์ถ๋ค (๋๋ค ์ฌ์)
2. ๊ทธ๋ฆผ์๊ฐ ์๊ธฐ๋์ง ์ ์๊ธฐ๋์ง๋ง ๊ธฐ๋ก (+1 ๋๋ -1, ๋จ 1๋นํธ)
3. ์ฌ๋ฌ ๋ฐฉํฅ์์ ๋ฐ๋ณต
โ ์ ๋ฐํ 3D ํ์์ ๋ชจ๋ฅด์ง๋ง, ๋ฌผ์ฒด์ "๊ธฐ์ธ์ด์ง ๋ฐฉํฅ"(ํธํฅ)์ ์ ํํ ํ์
โ ์ด ํธํฅ์ Attention ์ ์์์ ๋นผ๋ฉด ์ค์ฐจ ๋ณด์ ์๋ฃ
์ค์ ๊ณ์ฐ ํ๋ฆ
# Stage 1: PolarQuant ์์ถ
k_compressed = polar_quant(k_original) # 3๋นํธ๋ก ์์ถ
# Stage 2: QJL ์ค์ฐจ ๋ณด์
residual = k_original - k_compressed # ๋จ์ ์ค์ฐจ
random_proj = random_matrix @ residual # ๋ฌด์์ ์ฌ์ (๊ณ ์ ์๋)
sign_correction = sign(random_proj) # ๋ถํธ๋ง ์ ์ฅ (1๋นํธ)
# Attention ๊ณ์ฐ ์
score = query @ k_compressed + correction_factor(sign_correction)
# ์ค์ฐจ ๋ณด์ ๋ ์ ํํ Attention ์ ์์ฑ๋ฅ โ ์ซ์๋ก ๋ณด๋ ๊ฒฐ๊ณผ
| ํญ๋ชฉ | ๊ธฐ์กด (FP16) | TurboQuant (3.5๋นํธ) |
|---|---|---|
| KV ์บ์ ๋ฉ๋ชจ๋ฆฌ | ๊ธฐ์ค | 1/6 (83% ์ ๊ฐ) |
| Attention ์ฐ์ฐ ์๋ (H100) | ๊ธฐ์ค | ์ต๋ 8๋ฐฐ ๋น ๋ฆ |
| Needle-in-haystack ์ ํ๋ | 100% | 100% (104K ํ ํฐ) |
| LongBench ์ ์ | ๊ธฐ์ค | ๋๋ฑ or ์ด๊ณผ |
| ์ฌํ์ต ํ์ ์ฌ๋ถ | โ | ๋ถํ์ |
์ด๋ก ์ ๋ณด์ฅ โ โ์ฆ๋ช ๋ ํ๊ณ์นโ
TurboQuant์ ์ฐจ๋ณ์ ์ ์ํ์ ์ผ๋ก ์ต์ ์ ๊ฐ๊น๋ค๋ ์ฆ๋ช ์ด ์๋ค๋ ๊ฒ์ด๋ค.
์ ๋ณด์ด๋ก ์์ ์์ํ์ ์ด๋ก ์ ์ต์๊ฐ(MSE ์๊ณก ํํ)์ด ์กด์ฌํ๋ค. TurboQuant๋ ์ด ํ๊ณ์น์ ~2.7๋ฐฐ ์ด๋ด์์ ๋์ํ๊ณ , 1๋นํธ ๊ทนํ ์์ถ์์๋ ~1.45๋ฐฐ ์ด๋ด๋ค. โ์ ๋๋๋ผโ๊ฐ ์๋๋ผ โ์ผ๋ง๋ ์ต์ ์ ๊ฐ๊น์ด์ง ์ฆ๋ช ๋โ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
TurboQuant๋ VRAM์ ์ผ๋ง๋ ์ค์ฌ์ฃผ๋๊ฐ
TurboQuant๋ KV ์บ์๋ง ์์ถํ๋ค. ๋ชจ๋ธ ๊ฐ์ค์น(weights)๋ ๊ฑด๋๋ฆฌ์ง ์๋๋ค.
VRAM์ ๋ ๊ฐ์ง๋ฅผ ๋ด๋๋ค:
VRAM = [๋ชจ๋ธ ๊ฐ์ค์น] + [KV ์บ์]
๊ณ ์ ๋ณ๋ (์ปจํ
์คํธ ๊ธธ์ด์ ๋น๋ก)
| ํญ๋ชฉ | ๋ฌด์์ธ๊ฐ | TurboQuant ์ํฅ |
|---|---|---|
| ๋ชจ๋ธ ๊ฐ์ค์น | 35B ํ๋ผ๋ฏธํฐ ์์ฒด | โ ๊ฑด๋๋ฆฌ์ง ์์ |
| KV ์บ์ | ๋ํ ๊ธฐ๋ก ๋ฉ๋ชจ๋ฆฌ | โ 6๋ฐฐ ์์ถ |
Qwen 3.5 35B ์ค์ ๊ณ์ฐ
๋ชจ๋ธ ๊ฐ์ค์น:
FP16 ์๋ณธ: ~70GB โ 64GB GPU๋ ๋ถ์กฑ
Q4 ์์ํ: ~20GB โ 24GB GPU์์ ๊ฐ๋ฅ
KV ์บ์ (Q4 ๊ฐ์ค์น ๊ธฐ์ค, 32K ์ปจํ
์คํธ):
FP16 KV ์บ์: ~16GB
TurboQuant 3๋นํธ KV: ~3GB
ํฉ์ฐ:
Q4 ๊ฐ์ค์น + FP16 KV (32K): 20 + 16 = 36GB โ 40GB ํ์
Q4 ๊ฐ์ค์น + TurboQuant KV (32K): 20 + 3 = 23GB โ 24GB์์ ๊ฐ๋ฅ โ
Q4 ๊ฐ์ค์น + TurboQuant KV (64K): 20 + 6 = 26GB โ 32GB์์ ๊ฐ๋ฅ โ
TurboQuant์ ์ค์ ๊ฐ์น๋ โ๋ ์์ GPU์์ ๊ฐ์ ๋ชจ๋ธโ์ด ์๋๋ผ โ๊ฐ์ GPU์์ ํจ์ฌ ๊ธด ๋ํโ ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์ด๋ค.
| ์๋๋ฆฌ์ค | TurboQuant ์ด์ | TurboQuant ์ดํ |
|---|---|---|
| RTX 4090 (24GB)์์ 35B | Q4 + 4K ์ปจํ ์คํธ๋ง ๊ฐ๋ฅ | Q4 + 32K ์ปจํ ์คํธ ๊ฐ๋ฅ |
| A100 (80GB)์์ 70B | 32K ์ปจํ ์คํธ ํ๊ณ | 192K ์ปจํ ์คํธ ๊ฐ๋ฅ |
| ์๋ฒ 1๋๋ก ๋์ ์์ฒญ ์ฒ๋ฆฌ | ๋ฐฐ์น ํฌ๊ธฐ ์ ํ | 6๋ฐฐ ๋ ๋ง์ ๋์ ์์ฒญ |
ํ์ง๊ณผ ์๋ โ ๋นํธ ์์ ๋ฐ๋ฅธ ํธ๋ ์ด๋์คํ
ํ์ง: ๋นํธ ์์ ๋ฐ๋ผ ์คํํธ๋ผ์ด ์๋ค
โ์ ํ๋ ์์ค 0โ์ ๋ง์ผํ ํํ์ด๊ณ , ์ค์ ๋ก๋ ๋นํธ ์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
| ๋นํธ ์ | ์ฝ์ฌ์ธ ์ ์ฌ๋ | ์ค์ฉ์ ํ์ง | ๊ถ์ฅ ๋์ |
|---|---|---|---|
| 4๋นํธ | 0.997 | ์ฌ์ค์ ๋์ผ | ๋๋ถ๋ถ์ ์๋น์ค |
| 3.5๋นํธ | ~0.995 | LongBench ๊ธฐ์ค ๋๋ฑ or ์ด๊ณผ | ๊ธด ๋ฌธ์ ์ฒ๋ฆฌ |
| 3๋นํธ | ~0.98 | 8B ์ด์ ๋ชจ๋ธ์์ ๋ฌด์ ๊ฐ๋ฅ | ๋ฉ๋ชจ๋ฆฌ ์ต์ฐ์ |
| 2๋นํธ | 0.94 | ์ฒด๊ฐ ๊ฐ๋ฅํ ํ์ง ์ ํ | ๋น๊ถ์ฅ |
TurboQuant๊ฐ ์์ถํ๋ ๊ฑด KV ์บ์ โ ์ฆ โ์ด๋ฏธ ์ฒ๋ฆฌํ ์ด์ ํ ํฐ๋ค์ ๊ธฐ์ตโ์ด๋ค. ๋ชจ๋ธ์ ์ถ๋ก ๋ฅ๋ ฅ ์์ฒด(๊ฐ์ค์น)๋ ๊ทธ๋๋ก๋ผ์ ์งง์ ๋ํ์์๋ ํ์ง ์ฐจ์ด๊ฐ ๊ฑฐ์ ์๋ค. ์ปจํ ์คํธ๊ฐ ๊ธธ์ด์ง์๋ก(50K+ ํ ํฐ) ๋์ ์ค์ฐจ๊ฐ ์กฐ๊ธ์ฉ ์ํฅ์ ์ค ์ ์๋ค.
์๋: ์คํ๋ ค ๋นจ๋ผ์ง๋ค
KV Cache Decode Phase์ ๋ณ๋ชฉ์ ๋ฉ๋ชจ๋ฆฌ ์ฝ๊ธฐ ์๋(bandwidth) ๋ค. ๋ฐ์ดํฐ๊ฐ ์์์ง๋ฉด ์ฝ๋ ์๊ฐ๋ ์ค์ด๋ ๋ค.
FP16 (16๋นํธ): GPU๊ฐ ํ ํฐ๋น 16๋นํธ ร N๊ฐ ์ฝ์
TurboQuant 3๋นํธ: GPU๊ฐ ํ ํฐ๋น 3๋นํธ ร N๊ฐ ์ฝ์
โ ์ฝ์ด์ผ ํ ๋ฐ์ดํฐ ์ = ์ฝ 1/5
โ ๊ฐ์ bandwidth์์ 5๋ฐฐ ๋น ๋ฅธ ์ฒ๋ฆฌ ๊ฐ๋ฅ
| ํ๊ฒฝ | ์๋ ํฅ์ |
|---|---|
| H100 (4๋นํธ ๊ธฐ์ค) | ์ต๋ 8๋ฐฐ (attention logit ์ฐ์ฐ) |
| RTX 4090 (vLLM ํ๋ฌ๊ทธ์ธ) | 3.7๋ฐฐ (decode throughput) |
KV ๋ฒกํฐ๋ฅผ ์์ถํ๋ ์ค๋ฒํค๋๋ ๋ ผ๋ฌธ ๊ธฐ์ค โnegligibleโ โ GPU ์ฐ์ฐ ๋๋น ๋ฌด์ ๊ฐ๋ฅํ ์์ค์ด๋ค.
์ปค๋ฎค๋ํฐ ๊ตฌํ ํํฉ (2026๋ 3์ ๊ธฐ์ค)
๋ ผ๋ฌธ ๋ฐํ(2026.03.24) ์ผ์ฃผ์ผ ๋ง์ llama.cpp, vLLM, MLX ๋ชจ๋ ์ปค๋ฎค๋ํฐ ๊ตฌํ์ด ๋์๋ค. Google ๊ณต์ ๋ฆด๋ฆฌ์ฆ(Q2 2026) ์ ์ ์ด๋ฏธ ์ฌ์ฉ ๊ฐ๋ฅํ ์ํ๋ค.
llama.cpp (๋ก์ปฌ ์คํ)
./build/bin/llama-server \
-m models/your-model.gguf \
--cache-type-k turbo4 \ # Key ์บ์ โ 4๋นํธ
--cache-type-v turbo4 \ # Value ์บ์ โ 4๋นํธ
-ngl 99 \
-c 262144 \ # 262K ํ ํฐ ์ปจํ
์คํธ
-fa on \
--host 0.0.0.0 --port 8080๊ธฐ์กด q8_0, q4_0 KV ์บ์ ํ์
๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ๊ต์ฒดํ๋ฉด ๋๋ค.
vLLM (ํ๋ก๋์ ์๋ฒ)
pip install turboquant-vllmfrom turboquant_vllm import CompressedDynamicCache
cache = DynamicCache()
compressed = CompressedDynamicCache(cache, head_dim=128, bits=4)
# RTX 4090 ๊ธฐ์ค 3.76x ์์ถ + 3.7x ๋น ๋ฅธ decodeMLX (Apple Silicon)
Qwen 3.5 35B + 64K ์ปจํ ์คํธ ํ ์คํธ ๊ฒฐ๊ณผ:
KV ์บ์ ํฌ๊ธฐ: 4.9๋ฐฐ ๊ฐ์ (2.5๋นํธ)
Needle-in-haystack: 6/6 ์๋ฒฝ ์ ๋ต ์ ์ง
์ปค๋ฎค๋ํฐ ๊ฒ์ฆ ์์น
| ๊ตฌํ | ์์ถ ๋ฐฉ์ | ์์ถ๋ฅ | ๋ ผ๋ฌธ MSE | ๊ตฌํ MSE |
|---|---|---|---|---|
| llama.cpp gist | TQ3 (3๋นํธ) | 4.9x | 0.034 | 0.034 โ |
| llama.cpp gist | TQ4 (4๋นํธ) | 3.8x | 0.009 | 0.009 โ |
| vLLM plugin | 4๋นํธ | 3.76x | โ | cos_sim=0.997 โ |
์ค์ ์ฃผ์์ฌํญ
| ์ด์ | ๋ด์ฉ |
|---|---|
| fp32 ํ์ | FP16 ๊ณ์ฐ ์ 36 ๋ ์ด์ด ๋์ ์ค์ฐจ โ 11,397 ํ ํฐ ์ดํ ์ถ๋ ฅ ๊นจ์ง |
| ๋นํธ ์ ํ | 4๋นํธ๊ฐ ์์ค ์๋ ์ต์ ๊ท ํ์ . 2๋นํธ๋ ์ํ ๋ชจ๋ธ์์ ํ์ง ์ ํ |
| ๋ ์ด์ด ์ ํ | Full attention ๋ ์ด์ด๋ง ์ง์, Mamba/Linear attention ๋ฏธ์ง์ |
๊ถ์ฅ ์ค์ : --cache-type-k turbo4 --cache-type-v turbo4 (4๋นํธ)