0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

3ビットKVキャッシュは無損失か、TurboQuantを読む

0
Posted at

「3ビットのKVキャッシュでも精度は落ちない」という見出しを、この数週間で何度か見た。llama.cppのフォークで実際に動かせるようになり、界隈がざわついたTurboQuantの話だ。ただ元論文を開くと、無損失をうたっているのは3ビットではなく3.5ビットで、実務家が勧めているのは4ビットだった。この0.5〜1ビットのずれは細かい話に見えて、実は「なぜ回転させると圧縮できるのか」というこの手法の核心にそのまま繋がっている。順を追って読んでいく。

なぜKVキャッシュが長文の敵になるのか

LLMが長い文脈を扱うとき、生成の速度と使えるメモリを決めているのは重みの大きさではなく、KVキャッシュのほうだ。Transformerは過去のトークンごとに各層のKey/Valueベクトルを保存しておき、新しいトークンを出すたびにそれを読み直す。この仕組みのおかげで1トークンあたりの計算が毎回やり直しにならず済むのだが、代償としてキャッシュはトークン数・層数・バッチサイズに比例して線形に膨らむ。

数字で見ると重さが伝わる。llama.cppの実装検証によれば、Qwen3.5-27B級のモデルでFP16のKVキャッシュは1トークンあたり約64KB。32Kトークンも詰めればそれだけで数GBがVRAMから消える。70Bクラスになると、FP16のKVで34GBのGPUに載る文脈長は約109Kトークンが上限になる。長文脈が欲しいほどGPUが足りなくなる、という構図だ。

だから「KVキャッシュを何ビットまで削れるか」は、そのまま「同じGPUで何倍長い文脈を扱えるか」の問題になる。ここに切り込んだのがGoogle ResearchとNYUのAmir Zandiehらによる論文 TurboQuant: Online Vector Quantization with Near-optimal Distortion Rate(arXiv:2504.19874、ICLR 2026)だ。

回転させてから量子化する、という発想

量子化そのものは新しくない。FP16の各数値を少ないビット数の代表値に丸めてしまえばメモリは減る。問題は、素朴にやると精度が崩れることだ。KVベクトルの中には値が突出した次元(outlier)が混じっていて、そこに丸めの粒度を合わせると他の大多数の次元が潰れ、逆に多数派に合わせると外れ値の情報が飛ぶ。単一のスケールで全次元を量子化する方式が長く苦しんできたのはこの偏りだった。

TurboQuantの一手目は、量子化する前にベクトルへランダムな直交回転をかけることだ。回転行列はデータから学習するのではなく、数学的に生成する。これが効く理屈はこうだ。ランダムな直交変換を通すと、回転後の各座標の値は一点に集中したBeta分布(頭の次元数が普通の大きさなら、ほぼ平均0・分散1/dの正規分布で近似できる)に従うようになる。エネルギーが特定の座標に偏らず全体へ均されるので、突出した外れ値の次元が消える。

そこまで整えたうえで、各座標に対して独立に最適なスカラー量子化器(Lloyd-Max量子化器。ある分布のもとで丸め誤差の二乗を最小化する古典的な最適化)をかける。分布が事前に分かっているからこそ、座標ごとに理論的な最適解を当てられる。回転で分布を既知の形に押し込み、既知だからこそ最適に丸める、という二段構えだ。

回転行列が学習不要である点は実務的に大きい。モデルに依存しないので、追加の学習(fine-tuning)もキャリブレーションデータも要らずに、GemmaでもLlamaでもMistralでも同じ仕掛けをそのまま被せられる。論文はGemma、Mistral、Llama-3.1-8B-InstructでLongBench、RULER、ZeroSCROLLSといった長文脈ベンチマーク上で検証している。

Attentionが壊れないための、もう一段

ここで見落とされがちなのが、KVキャッシュの量子化は「元のベクトルをどれだけ忠実に復元できるか」だけでは足りない、という点だ。Attentionが実際にやっているのはQueryとKeyの内積の計算であって、ベクトルそのものの再構成ではない。復元誤差を小さくしても、内積に偏り(バイアス)が乗ればスコアが系統的にずれてしまう。

TurboQuantが二段階量子化を名乗るのはこの部分だ。まず二乗誤差を最小化する量子化器で本体を丸め、その残差に対して1ビットのQuantized JL変換(Johnson-Lindenstrauss、内積をおおむね保ったまま次元を圧縮するランダム射影の一種)をかける。これで内積推定量のバイアスが消え、不偏な内積が得られる。復元の忠実さと内積の正しさは別物で、後者を保証するために残差へもう一手間かける。この設計思想は、KVキャッシュ圧縮を「ベクトル復元」ではなく「Attentionスコアの保存」として捉え直しているところに新しさがある。

「無損失」はどのビット幅の話なのか

冒頭のずれに戻る。論文が実際に報告している精度は、次のようになっている。

設定 精度への影響(論文)
3.5 bit / channel 絶対的な品質中立(FP16と差なし)
2.5 bit / channel わずかな劣化

つまり論文が「無損失」と言い切っているのは3.5ビットであって、3.0ビットちょうどではない。歪み率(distortion rate)は情報理論的な下限に対して小さな定数倍(およそ2.7倍)まで近づく、というのが理論側の主張だ。

一方でllama.cpp側の実装は、より実務寄りの数字を出している。

方式 ビット/値 FP16比の圧縮率 品質
TQ3(turbo3) 3.25 bit 約4.9倍 PPLが約1%上昇
TQ4(turbo4) 4.25 bit 約3.8倍 ほぼFP16と同等

実測では、35Bモデルの温度0で「出力がFP16と完全一致」し、パープレキシティは6.20対6.19という誤差レベルの差に収まったと報告されている。ただしこれは大きめのモデルでの話で、llama.cppのTurboQuant議論スレッドでも、実装者やDEVコミュニティの解説でも、3ビット帯は8Bを下回る小型モデルで劣化が目立ち始めると口を揃えている。推奨は4ビットだ。

見出しの「3ビット無損失」は、厳密には言い過ぎで、正しくは「大きめのモデルなら3ビット帯でも実用上ほぼ無損失、安全策は4ビット」あたりが実態になる。ここは丸めずに押さえておきたい。圧縮率と品質はトレードオフで、モデルサイズという第三の変数がその線を動かす。

手元で試すとき、何にぶつかるか

圧縮率だけ見れば魅力は明快だ。同じ70Bモデル・34GBのVRAMで、KVキャッシュをFP16からTQ3に切り替えると、扱える文脈が約109Kトークンから約536Kトークンへ伸びる。100万トークンのKVキャッシュが約9.6GBに収まる、という数字も出ている。

llama.cppのフォークでは、Key/Value双方のキャッシュ型を指定して有効化する。

# 3ビット(圧縮重視)
--cache-type-k turbo3 --cache-type-v turbo3

# 4ビット(品質重視の安全策)
--cache-type-k turbo4 --cache-type-v turbo4

ただし現時点で注意すべき点が二つある。一つは、これがまだ本家llama.cppのmainには入っておらず、Metal/CUDA/Vulkanそれぞれの専用フォークをビルドする必要があること。もう一つ、そして見落としやすいのが速度だ。量子化のたびにベクトルを回転させる処理(実装によってはWalsh-Hadamard変換で近似する)が余分にかかるため、バックエンドや最適化状況によっては生成が0.78倍から数倍遅くなる報告がある。メモリは確かに減るが、その回転コストをどこかで払っている。

この速度ペナルティをどう読むかは、実は素直だと思う。自己回帰デコードのボトルネックは計算そのものよりメモリ帯域、つまりHBMからどれだけ読み出すかにある。KVキャッシュが小さくなれば読み出し量が減り、メモリ圧迫でGPUがスワップ寸前に追い込まれるような状況ではむしろスループットが上がる。逆に、メモリに余裕があってバッチも軽い局面では、回転の追加計算が純粋な足かせになる。TurboQuantが刺さるのは「文脈を伸ばしたいがVRAMが足りない」ケースであって、余っているGPUを速くする道具ではない。効く場所を見極める種類の最適化だ。

何を持ち帰るか

TurboQuantの面白さは、圧縮率の数字より「データに頼らず、分布を数学的に既知の形へ押し込んでから最適に丸める」という設計にある。学習もキャリブレーションも要らないので、既存の推論スタックへ後付けしやすい。内積の不偏性まで作り込んでAttentionを壊さない配慮も、KVキャッシュ量子化を単なるベクトル圧縮と切り分けている点で見るべきところだ。

実務者としての持ち帰りは三つに絞れる。長文脈をVRAM制約で諦めていたなら、まずTQ4から試す価値がある。3ビット帯の無損失うたい文句は大きめモデル前提で、小型モデルでは効き方が変わる。そして、メモリと引き換えに回転計算のコストを払うので、自分のボトルネックがメモリ帯域なのか計算なのかを先に見ておく。ここを取り違えると、数字上は圧縮できているのに体感が遅くなる、という落とし穴にはまる。

まだ本家に入っていない技術ではあるが、KVキャッシュを削る方向は今後の長文脈・エージェント用途で避けて通れない。回転という一手で分布を整える発想は、他の量子化にも波及していくはずだ。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?