量子化、深掘り
量子化は16ビット浮動小数点の重みをより少ないビットに縮め、少々の品質を大量のメモリと交換する。1行版(Q8 ≈ 無劣化、Q4_K_M ≈ スイートスポット、Q3未満は痛い)で走り出すには十分。このページは1段下へ。タグが実際に何をするか、K-quantとI-quantの違い、品質低下が最初に顔を出す場所。
なぜ4ビットが動くのか
学習済み重みは一様なノイズではない。各テンソルの値は狭い、ほぼ釣鐘状の分布に集まり、ネットワークの挙動はその分布の形が運ぶ——個々の重みの小数点最後の桁ではない。だから重みは圧縮できる。各重みを小さな整数+共有スケール係数として格納すれば、失うのは微細なディテールだけ。
1つだけ実際の複雑さ:外れ値チャネル。一部のチャネルは他よりはるかに大きい活性化を運ぶ。テンソル全体に単一スケールを使うと、その範囲のすべてを外れ値に費やし、残りを泥につぶす。まともな量子化方式はすべて、本質的に外れ値処理方式。ブロックごとのスケール、活性化を考慮した保護(AWQ)、実データに対するキャリブレーション(imatrix)。
ブロック量子化の仕組み
核心のトリック。各テンソルを1つのスケールを共有する小ブロックに刻む。重みの逆量子化は1回の乗算。
w ≈ s · q # s: ブロックスケール、q: 格納整数
Q4_0: block = 32 weights → 1×fp16 scale + 32×4-bit ints ≈ 4.5 bpw
K-quants: super-block = 256 weights
1×fp16 super-scale + 8×fp8 sub-scales + ints ≈ 4.8 bpw
bpwは重みあたりビット数で、スケールのオーバーヘッドを含む。このオーバーヘッドがあるから、どれもちょうど4.0にはならない。4ビット重みは半バイトで、32重みに広げた2バイトのスケールが0.5 bpwを加える。K-quantは2段階スケーリング——8つのサブブロックが安価なfp8スケールを得る256重みのスーパーブロック——でコストを償却し、同サイズのQ4_0より良い品質で約4.8 bpwに着地する。
K-quantと_M / _Sサフィックス
Q4_K_Mは「帽子をかぶったQ4_K」ではない。サフィックスはミックス。量子化器は、大半はQ4_Kのまま、特定のテンソルを上位の量子化へ引き上げる。典型的にはアテンション射影(wv、wo)、ときにトークンエンベディングテーブルがQ6_Kへ行く。サフィックスはミックスの順位。
_S(スモール)——引き上げるテンソルが最少、最小ファイル_M(ミディアム)——デフォルト推奨、サイズ/品質の最良バランス_L(ラージ)——より多くのテンソルを高精度に。収穫逓減
ミックスが存在するのは、レイヤーの劣化が一様でないから。アテンション射影とエンベディングは、大きなフィードフォワード行列より敏感。そこに数百MB追加すれば本物の品質が買える——_Mが素のQ4_Kではなくコミュニティのデフォルトである理由。
I-quant:キャリブレーション済み、より小さく、CPUで遅い
IQ量子化(IQ4_XS、IQ3_XXS、IQ2_XS…)はキャリブレーションステップを追加する。まず代表的なテキストのサンプルでモデルを走らせ**重要度行列(imatrix)**を計算し、それから重要な重みが実際に住む場所に量子化レベルを配置する。見返りは、同等のK-quantより小さいサイズで同じ品質。IQ4_XSは同等以上の品質でQ4_K_Sを下回り、IQ2/IQ3は3 GB未満の7〜8Bモデルをそもそも可能にする。
トレードオフはデコード速度。I-quantの逆量子化は単純な乗算ではなく、2のべき乗でないルックアップと構造化再構築を必要とする。CPUではその余分な計算がトークン毎秒に見え、GPUではメモリレイテンシの陰に隠れてほぼ無料。経験則:CPUマシンにはK-quant、GPUではI-quantも問題なし、IQ2/IQ3はVRAMが強いるときだけ。
品質の梯子、正直に
7〜8Bモデルの概算ファイルサイズ。パラメータにおよそ線形でスケール——14Bはほぼ倍。
| 量子化 | サイズ | bpw | 正直な品質メモ |
|---|---|---|---|
| Q8_0 | 8.5 GB | 8.5 | 透過的。FP16との盲検A/Bに耐える |
| Q6_K | 6.6 GB | 6.6 | ほぼ透過的。疑り深さの1つ手前の駅 |
| Q5_K_M | 5.7 GB | 5.7 | わずかな損失、チャットでは気づきにくい |
| Q4_K_M | 4.9 GB | 4.8 | スイートスポット。ベンチマーク低下は1桁前半% |
| IQ4_XS | 4.5 GB | 4.25 | 品質はほぼQ4_K_Sでより小さい。GPU推奨 |
| Q3_K_M | 3.9 GB | 3.9 | 事実想起と数学で顕著 |
| IQ3_XXS | 3.2 GB | 3.1 | 流暢なチャット、不安定な事実。現実にはGPU専用 |
| Q2_K | 3.2 GB | 3.4 | 最終手段。個性は生き、精度は死ぬ |
正確なパーセンテージは俗説級として扱うこと。損失はモデル、言語、タスクに依存する。大きさが不安定でも順序は安定している。
量子化が最初に痛めつける場所
ダメージは能力全体で一様ではない。概ね崩れる順に。
- 事実想起——名前、日付、数値が最初に漂う。Q3モデルは自信満々に帰属を間違える。
- 数学と多段推論——小さな誤りがチェーンを通じて複利で積もる。
- 長コンテキストの整合性——長いプロンプトの奥からの想起が、短いプロンプトの挙動が示唆するより不安定になる。
- 低リソース言語——強い量子化では韓国語は英語より早く劣化する。韓国語トークンは学習でまれだったので、精度の余裕が少ない。韓国語が重要なら、可能な場所でQ5以上を維持。
- チャットの流暢さとスタイル——ほぼ顔を出さない。Q2モデルはまだそれらしく聞こえる。これが罠。流暢さはダメージの悪い代理指標。
小さいモデルほど被害が大きい
量子化誤差は冗長性を食い、小さいモデルはそれが最も少ない。Q4の70Bはほぼ無傷、Q4の3Bは目に見えて損失、約2B未満では強い量子化がモデルを骨抜きにし得る。実用ルール:約4Bパラメータ未満にはすべてQ6_KかQ8_0——小さいモデルをつぶして節約できる絶対GBはどのみち微々たるもの。ビットをどこに使うか決める前に、パラメータでサイズ対能力の基準線を得ること。
KVキャッシュは別の意思決定
重みを量子化してもKVキャッシュには何も起きない。それは独立したメモリの行(デフォルトでfp16、llama.cppでは別個にq8_0/q4_0へ量子化可能)。長いコンテキストではキャッシュがサイズで重みに匹敵し得る。KVキャッシュで独立に予算化すること。
実用の意思決定ラダー
実例——12 GBカード、8B密モデル、8kコンテキスト。
重み Q4_K_M 4.9 GB
KVキャッシュ 8kトークン、fp16 1.0 GB (8B GQA ≈ 128 KiB/トークン)
オーバーヘッド 計算バッファ+ctx 約1.5 GB
─────────────────────────────────────────
合計 約7.4 GB → 余裕を持って収まる
VRAM計算を踏まえたラダー。
- 予算:VRAM − コンテキスト − オーバーヘッド = 重みに残る分。
- Q6_Kが収まる → Q6_Kを実行。Q4_K_Mしか収まらない → 罪悪感なくQ4_K_Mを実行。
- IQ4_XS/Q3へ下げるのは、コンテキストを収めるためかCPUオフロードを避けるためだけ。オフロードが速度から奪うものは、量子化1段階が品質から奪うものより大きい。
- 目標のモデルがQ4で収まらないなら、Q2まで量子化するよりサイズクラスを下げる。Q4の堅牢な8Bは、実践ではつぶれた14Bに大抵勝つ。