https://arxiv.org/abs/2504.19874
TurboQuant: Online Vector Quantization with Near-optimal Distortion Rate
Vector quantization, a problem rooted in Shannon's source coding theory, aims to quantize high-dimensional Euclidean vectors while minimizing distortion in their geometric structure. We propose TurboQuant to address both mean-squared error (MSE) and inner
arxiv.org
AI 모델이 커질수록 가장 먼저 문제가 되는 것은 단순한 연산량이 아니다. 실제 서비스 환경에서는 메모리 사용량, GPU 대역폭, 그리고 데이터 이동 비용이 더 큰 병목이 된다. 특히 LLM은 모델 파라미터 자체도 크지만, 추론 과정에서 생성되는 KV Cache와 중간 activation까지 포함하면 막대한 자원을 요구한다. 이 때문에 최근 AI 인프라에서는 모델을 더 빠르게 만드는 기술만큼 벡터를 얼마나 효율적으로 저장하고 저장하고 전송하느냐가 중요해졌다.
이 지점에서 등장하는 기술이 바로 Quantization이다. 그리고 이번에 소개하는 TurboQuant는 단순히 숫자의 정밀도를 낮추는 수준을 넘어, 고차원 벡터를 매우 적은 비트로 압축하면서도 성능 저하를 최소화하는 새로운 방식의 Vector Quantization 알고리즘이다.
왜 벡터 양자화가 중요한가?
현대 AI 시스템은 대부분 벡터를 중심으로 동작한다. LLM 내부의 attention key/value 벡터, 검색 시스템의 embedding 벡터, 추천 시스템의 사용자 표현값, 멀티모달 모델의 이미지 특징값까지 모두 고차원 벡터이다.
문제는 이 벡터들이 대부분 float16, float32 형태로 저장된다는 점이다. 차원이 커질수록 메모리 사용량은 급격히 증가하고, GPU 내부 메모리(HBM)와 연산 캐시(SRAM) 사이에서 데이터를 옮기는 비용도 커진다. 결국 모델이 느려지는 이유는 계산이 아니라 데이터를 읽고 쓰는 과정인 경우가 많다.
그래서 많은 연구들이 벡터를 int8, int4처럼 더 작은 정밀도로 압축하려고 시도한다. 하지만 단순히 숫자 비트만 줄이면 벡터의 의미 구조가 망가질 수 있다. 예를 들어 원래 비슷했던 두 벡터가 압축 후에는 멀어질 수 있고, 검색 정확도나 attention score도 크게 흔들릴 수 있다.
즉, 핵심은 단순 압축이 아니라, 벡터의 기하학적 구조를 유지하면서 압축하는 것이다.
기존 방식의 한계
기존의 대표적인 벡터 양자화 방식으로는 Product Quantization(PQ)이 있습니다. PQ는 벡터를 여러 구간으로 나눈 뒤 각각을 codebook 기반으로 압축하는 방식인데, 벡터 검색 분야에서는 오랫동안 표준처럼 사용되어 왔다.
다만 PQ는 사전에 학습된 codebook이 필요하고, 데이터셋마다 다시 최적화해야 하며, 대규모 인덱싱 시간이 길다는 단점이 있다. 검색 시스템에서는 유용하지만, 실시간으로 계속 생성되는 KV Cache 같은 환경에서는 적용이 쉽지 않다.
반대로 좌표별로 단순하게 int8/int4로 줄이는 방식은 매우 빠르고 구현도 쉽다. 하지만 고차원 벡터의 거리나 내적 구조를 제대로 보존하지 못해 품질 저하가 자주 발생한다.
결국 기존 기술은 대체로 두 갈래였다. 정확하지만 느리거나, 빠르지만 손실이 컸다.
TurboQuant의 출발점
TurboQuant는 이 두 문제를 동시에 해결하려는 시도이다. 논문은 "빠르고, 온라인 적용 가능하며, GPU 친화적이면서도 이론적으로 거의 최적 수준의 distortion을 달성하는 양자화기를 만들 수 있는가?"라는 질문에서 출발한다.
여기서 말하는 이론적 최적 수준이란, 어떠한 압축 알고리즘도 도달할 수 없는 절대적 한계치인 Shannon Lower Bound를 의미한다. 놀랍게도 TurboQuant는 모든 비트 폭과 차원에 걸쳐 이 수학적 하한선과 불과 약 2.7배 이내의 차이밖에 나지 않는 완벽에 가까운 최적화를 이뤄냈다.
그리고 그 해답으로 제시한 방식이 매우 흥미롭다. 복잡한 codebook 탐색 대신, 입력 벡터를 먼저 랜덤하게 회전시키고, 각 좌표를 독립적으로 처리하는 구조를 사용한다.
언뜻 단순해 보이지만, 고차원 공간에서는 이 접근이 놀라울 정도로 강력하게 작동한다.
랜덤 회전이 왜 중요한가
TurboQant는 먼저 입력 벡터($\mathcal{x}$)에 랜덤 회전을 적용한다.
$$\mathcal{y}=\Pi\mathcal{x}$$
여기서 $\PI$는 직교행렬이며, 벡터의 길이는 유지한 채 좌표축만 무작위로 바꾸는 역할을 한다.
이 과정을 거치면 특정 좌표 하나에 큰 값이 몰려 있던 벡터도 전체 차원에 값이 비교적 고르게 퍼지게 된다. 다시 말해 outlier가 완화되고, 각 좌표가 비슷한 통계적 성질을 갖게 된다.
이는 매우 중요하다. 기존에는 벡터 전체를 한 번에 다뤄야 했지만, 회전 이후에는 좌표 하나하나를 독립적으로 양자화해도 성능이 잘나온다.
즉 복잡한 고차원 문제를 단순한 1차원 문제 여러 개로 바꾸는 셈이다.
좌표 분포와 Beta Distsribution
논문은 랜덤 회전된 고차원 unit vector의 각 좌표가 특정 형태의 Beta 분포를 따른다는 사실을 활용한다. 고차원에서는 좌표값들이 중심에 몰리고, 서로 거의 독립적인 것처럼 행동한다.
이 성질 덕분에 각 좌표마다 최적의 scalar quantizer를 설계할 수 있다. 즉 벡터 전체를 위해 거대한 codebook을 만들 필요 없이, 좌표별 최적값만 계산하면 된다.
이것이 TurboQuant가 빠르면서도 정확한 이유이다.

Lloyd-Max Quantizer를 활용한 좌표별 최적화
TubeoQuant는 각 좌표에 대해 Lloyd-Max quantizer를 적용한다. 이는 주어진 확률분포에서 평균 제곱 오차(MSE)를 최소화하는 대표적인 스칼라 양자화 방식이다.
예를 들어 2bit라면 4개의 대표값을 만들고, 입력 좌표가 어느 구간에 속하는지에 따라 가장 가까운 대표값으로 치환한다. 3bit라면 8개 대표값을 사용한다.
이 과정은 GPU에서 병렬 처리하기 매우 좋다. 차원마다 독립적으로 계산하면 되기 때문에 SIMD 구조와도 잘 맞고, lookup 기반으로 매우 빠르게 동작한다.
그런데 MSE만 좋다고 끝이 아니다
벡터를 잘 복원하는 것과, 벡터 간 관계를 잘 보존하는 것은 다른 문제이다.
LLM의 attention score나 벡터 검색은 결국 두 벡터의 내적 값으로 결정된다.
$$\mathcal{x}^\mathrm{T}\mathcal{y}$$
즉 압축 후 벡터가 원본과 비슷해 보여도, 내적이 틀어지면 검색 결과나 모델 성능이 무너질 수 있다.
논문은 MSE 기준으로 최적인 양자화기가 inner product estimation에는 bias를 만들 수 있다고 지적한다.
$$\mathrm{E}[\hat{\mathcal{x}}^\mathrm{T}\mathcal{y}]\neq\mathcal{x}^\mathrm{T}\mathcal{y}$$
이 차이는 실제 서비스에서 상당히 치명적일 수 있다.

TurboQuant의 두 번째 핵심: Residual 보정
TurboQuant는 이 문제를 2단계 구조로 해결한다.
먼저 MSE 기준으로 벡터를 압축한 뒤, 남은 오차를 계산한다.
$$\mathcal{r=x-\hat{x}}$$
그리고 이 residual에 대해 1-bit Quantized Johnson-Lindenstrauss(QJL) 기법을 적용한다.
QJL은 랜덤 projection 후 부호만 저장하는 매우 가벼운 방식인데, 놀랍게도 inner product에 대해 unbiased estimator 성질을 제공한다.
여기서 핵심은 비트 예산(Bit-budget)의 분배이다. 만약 목표 압축 용량이 b비트라면, 1단계에 b-1비트를 할당하여 오차를 최소화하고, 남은 1비트를 2단계에 사용하여 정확히 목표 용량 b비트를 맞추게 된다.
즉 TurboQuant는 추가적인 메모리 낭비 없이 벡터 자체는 정확히 복원하면서도, 내적 계산의 편향까지 동시에 잡아낸다.
실험 결과
논문에서는 LLM KV Cache 압축 실험에서 3.5bit 수준만으로 full precision과 거의 동일한 품질을 달성했다고 보고한다. 2.5bit에서도 성능 저하는 매우 제한적이었다.
이는 단순 계산으로도 메모리를 4배 이상 절약할 수 있다는 뜻이다. 긴 context 모델이나 동시 사용자 수가 많은 서비스에서는 엄청난 차이이다.
또한 벡터 검색 실험에서는 기존 Product Quantization 대비 더 높은 recall을 보이면서도, 인덱싱 시간은 거의 0에 가깝다고 설명합니다. 즉 검색 품질과 구축 속도를 동시에 가져간 셈이다.

