AIの量子化とは?なぜVRAMが減り、なぜ品質に影響するのか

目次
ローカルAIのモデルでは、4bit、8bit、Q4、Q8といった量子化表記をよく見る。量子化するとモデルが小さくなり、少ないVRAMでも扱いやすくなる一方、なぜ小さくなるのかは分かりにくい。
量子化の基本は、「モデルの中にある数値を、もっと少ない情報量で表し直す」ことにある。ZIPのように元へ完全復元できる可逆圧縮ではない。元の数値に近い値へ置き換えるため、容量を減らせる代わりに小さな誤差が入ることがある。
この仕組みが分かると、なぜ4bitの方が小さくなりやすいのか、なぜ品質へ影響することがあるのか、なぜモデルが4分の1になっても総VRAMまで4分の1になるとは限らないのかを、同じ流れで理解できる。
図: 容量・設定値・段階差の判断軸を1枚に整理。数値の条件は本文を優先する。
量子化は、モデルの数値を少ない段階で表し直す
AIモデルには大量のパラメータがあり、その中心となる重みは数値として保存されている。高い精度で保存するほど、1つの値について細かな違いまで記録できる。
量子化では、その細かい違いをすべて残すのではなく、使える値の段階を減らす。
たとえば、量子化前には少しずつ違う3つの値があったとする。量子化後に使える段階が少なければ、そのうち2つが同じ値へ丸められることがある。元の値をそのまま保存するのではなく、近い段階へ寄せて保存するイメージだ。
このとき、1つの値を表すために必要なbit数を減らせる。32bitの浮動小数点で持っていた値を、8bitなどの低い精度へ写すのはその一例になる。
一方で、丸める前には別々だった値が同じ段階へ入ることがある。これが、量子化後のモデルが元モデルと完全には同じにならない理由の一つだ。
scaleやzero-pointは何をしているのか
量子化の仕組みをもう少し正確に見ると、代表的な方法の一つにaffine quantizationがある。
affine quantizationでは、元の数値が動く範囲と、量子化後に使える整数の範囲を対応させる。そのとき、1段階あたりの幅を表す値がscaleだ。0の位置を調整するためにzero-pointを使う方式もある。
概念的には、元の値xを量子化後の値qへ次のように対応させる。
q = round(x / scale + zero-point)
使うときは、量子化された値から元の値に近い数値へ戻す。
x ≈ scale × (q - zero-point)
この式ではroundによる丸めが入るため、復元した値は元の値と完全には一致しない場合がある。
すべての量子化方式がこの式をそのまま使うわけではない。対称量子化、ブロック単位の量子化、重要度を考慮する方式など実装はさまざまだ。ただ、限られた表現へ写して情報量を減らすという基本は共通している。
bit数が減ると、なぜファイルや重みのメモリが小さくなるのか
bit数は、1つの値を保存するために使う情報量だ。
まず重み本体だけを単純化して考える。必要な容量は、おおむね次の関係で決まる。
重みの数 × 1つの重みに使うbit数
たとえば10億個の重みを、すべて同じ形式で保存すると仮定する。重み本体だけの理論値は次のようになる。
| 1つの重みの表現 | 重み本体の理論上の容量 |
|---|---|
| 32bit | 約4GB |
| 8bit | 約1GB |
| 4bit | 約0.5GB |
32bitから8bitへ下げれば、1つの値に使うbit数は4分の1になる。4bitなら8分の1だ。だから量子化すると、モデルの重みを保存したりメモリへ置いたりする負担を大きく減らせる。
ただし、この比率を実際のGGUFファイルへそのまま当てはめることはできない。
実際の量子化形式にはscaleなどの補助情報があり、モデルのすべての部分が同じbit幅になるとも限らない。GGUFにはメタデータも含まれる。そのため、Q4ならFP32ファイルの容量が必ず正確に8分の1になるとは考えない方がよい。
要点は、bit数を下げると重み本体を小さくできる。ただし実ファイルの大きさは量子化方式全体で決まるということだ。
なぜ品質に影響することがあるのか
容量を減らせる理由と、品質へ影響することがある理由はつながっている。表現できる値の段階を減らすからだ。
量子化前の重みには細かな違いがある。量子化では、その値を限られた段階のどこかへ丸める。復元した値は元の値に近くても、完全に同じとは限らない。この差を量子化誤差と呼ぶ。
モデルでは非常に多くの重みが計算に使われる。どの重みにどの程度の誤差が入ったかによって、出力へ影響する可能性がある。
ただし、ここから「4bitなら必ず目に見えて悪くなる」「8bitなら元モデルと同じ」とは言えない。
品質への影響は、元モデルだけで決まるわけではない。何bitへ量子化したか、どの方式を使ったか、どの単位で値をまとめたかなどでも変わる。量子化時にcalibrationを使う方式や、重要な重みを考慮するためのimportance matrixを使う方法もある。
llama.cppにも複数の量子化方式があり、importance matrixを利用する方法がある。ただし、それを使っているだけで、どのモデルでも必ず高品質になるという意味ではない。
量子化は「容量を削った割合だけ品質も一定割合で落ちる処理」ではない。限られた情報量の中で、元モデルの性質をどこまで保てるかが方式ごとに違うと考える方が近い。
量子化しても、総VRAMが同じ比率で減るとは限らない
ローカルAIでは、重みの縮小率と総VRAMの縮小率を混同しやすい。
量子化で直接小さくなる中心はモデルの重みだ。しかし、推論中のGPUメモリには重み以外も置かれる。
LLMなら、会話履歴や入力を保持するKVキャッシュがある。コンテキストを長くすれば、そのためのメモリも増える。さらに、ランタイムの作業用バッファや一時的な計算領域も必要になる。
つまり、重み本体を大幅に小さくできても、それ以外のメモリまで同じ割合で減るわけではない。
たとえば重みが32bit相当から4bit相当へ小さくなっても、実行時のピークVRAM全体が必ず8分の1になるわけではないということだ。
さらに、モデル全体をGPUへ置かず、一部をCPUとシステムRAMへ回すランタイムもある。その場合は、GPU側の使用量だけ見てもPC全体のメモリ条件は分からない。
ファイル容量、GPUへ置く重み、ピークVRAM、システムRAMは別の数字として見る必要がある。この違いはLLMのファイルサイズ・VRAM・RAM・実行時メモリの違いで詳しく整理している。
4bit・8bitと、GGUFのQ4・Q8は同じ話ではあるが同じ表記ではない
4bitや8bitは、低い精度で数値を表す量子化を説明するときの一般的なbit幅だ。
一方、GGUF配布で見るQ4_K_M、Q5_K_M、Q6_K、Q8_0などは、llama.cpp系で使われる具体的な量子化方式の名前だ。
たとえばQ4という文字が入っていても、ファイル内のすべての値が単純に4bitだけで並んでいるわけではない。複数の値をblockとして扱ったり、scaleなどの補助情報を持ったりするためだ。方式によって実効的なbits per weightや作り方も変わる。
そのため、GGUFを選ぶときは4 < 5 < 6 < 8という数字だけで決めない方がよい。同じ元モデル・同じリビジョンの候補について、実ファイル容量と正確な量子化名を確認する。
具体的な選び方はGGUFのQ4・Q5・Q6・Q8はどれを選ぶ?へ分けている。
まとめ
- 量子化はZIPのような可逆圧縮ではなく、モデル内の数値をより少ないbit数・少ない表現段階へ写し替える処理
- 1つの重みを保存するbit数が減るため重み本体は小さくできるが、総VRAMはKVキャッシュや作業領域も含むため同じ比率では減らない
- 元の数値を限られた段階へ丸めて近似するため誤差が入り得るが、品質への影響はモデルや量子化方式で変わる
- Q4・Q8などは選択の手掛かりであり、実ファイル容量・作成方法・ランタイム対応まで確認して選ぶ