• 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)์—์„œ 35BQ4 + 4K ์ปจํ…์ŠคํŠธ๋งŒ ๊ฐ€๋ŠฅQ4 + 32K ์ปจํ…์ŠคํŠธ ๊ฐ€๋Šฅ
A100 (80GB)์—์„œ 70B32K ์ปจํ…์ŠคํŠธ ํ•œ๊ณ„192K ์ปจํ…์ŠคํŠธ ๊ฐ€๋Šฅ
์„œ๋ฒ„ 1๋Œ€๋กœ ๋™์‹œ ์š”์ฒญ ์ฒ˜๋ฆฌ๋ฐฐ์น˜ ํฌ๊ธฐ ์ œํ•œ6๋ฐฐ ๋” ๋งŽ์€ ๋™์‹œ ์š”์ฒญ

ํ’ˆ์งˆ๊ณผ ์†๋„ โ€” ๋น„ํŠธ ์ˆ˜์— ๋”ฐ๋ฅธ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„

ํ’ˆ์งˆ: ๋น„ํŠธ ์ˆ˜์— ๋”ฐ๋ผ ์ŠคํŽ™ํŠธ๋Ÿผ์ด ์žˆ๋‹ค

โ€œ์ •ํ™•๋„ ์†์‹ค 0โ€์€ ๋งˆ์ผ€ํŒ… ํ‘œํ˜„์ด๊ณ , ์‹ค์ œ๋กœ๋Š” ๋น„ํŠธ ์ˆ˜์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง„๋‹ค.

๋น„ํŠธ ์ˆ˜์ฝ”์‚ฌ์ธ ์œ ์‚ฌ๋„์‹ค์šฉ์  ํ’ˆ์งˆ๊ถŒ์žฅ ๋Œ€์ƒ
4๋น„ํŠธ0.997์‚ฌ์‹ค์ƒ ๋™์ผ๋Œ€๋ถ€๋ถ„์˜ ์„œ๋น„์Šค
3.5๋น„ํŠธ~0.995LongBench ๊ธฐ์ค€ ๋™๋“ฑ or ์ดˆ๊ณผ๊ธด ๋ฌธ์„œ ์ฒ˜๋ฆฌ
3๋น„ํŠธ~0.988B ์ด์ƒ ๋ชจ๋ธ์—์„œ ๋ฌด์‹œ ๊ฐ€๋Šฅ๋ฉ”๋ชจ๋ฆฌ ์ตœ์šฐ์„ 
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-vllm
from turboquant_vllm import CompressedDynamicCache
 
cache = DynamicCache()
compressed = CompressedDynamicCache(cache, head_dim=128, bits=4)
# RTX 4090 ๊ธฐ์ค€ 3.76x ์••์ถ• + 3.7x ๋น ๋ฅธ decode

MLX (Apple Silicon)

Qwen 3.5 35B + 64K ์ปจํ…์ŠคํŠธ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ:

KV ์บ์‹œ ํฌ๊ธฐ: 4.9๋ฐฐ ๊ฐ์†Œ (2.5๋น„ํŠธ)
Needle-in-haystack: 6/6 ์™„๋ฒฝ ์ •๋‹ต ์œ ์ง€

์ปค๋ฎค๋‹ˆํ‹ฐ ๊ฒ€์ฆ ์ˆ˜์น˜

๊ตฌํ˜„์••์ถ• ๋ฐฉ์‹์••์ถ•๋ฅ ๋…ผ๋ฌธ MSE๊ตฌํ˜„ MSE
llama.cpp gistTQ3 (3๋น„ํŠธ)4.9x0.0340.034 โœ…
llama.cpp gistTQ4 (4๋น„ํŠธ)3.8x0.0090.009 โœ…
vLLM plugin4๋น„ํŠธ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๋น„ํŠธ)


์ฐธ๊ณ  ๋ฌธ์„œ