localaiforum
ログイン
ガイド › モデルとフォーマット

量子化、深掘り

量子化は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 最終手段。個性は生き、精度は死ぬ

正確なパーセンテージは俗説級として扱うこと。損失はモデル、言語、タスクに依存する。大きさが不安定でも順序は安定している。

量子化が最初に痛めつける場所

ダメージは能力全体で一様ではない。概ね崩れる順に。

  1. 事実想起——名前、日付、数値が最初に漂う。Q3モデルは自信満々に帰属を間違える。
  2. 数学と多段推論——小さな誤りがチェーンを通じて複利で積もる。
  3. 長コンテキストの整合性——長いプロンプトの奥からの想起が、短いプロンプトの挙動が示唆するより不安定になる。
  4. 低リソース言語——強い量子化では韓国語は英語より早く劣化する。韓国語トークンは学習でまれだったので、精度の余裕が少ない。韓国語が重要なら、可能な場所でQ5以上を維持。
  5. チャットの流暢さとスタイル——ほぼ顔を出さない。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計算を踏まえたラダー。

  1. 予算:VRAM − コンテキスト − オーバーヘッド = 重みに残る分。
  2. Q6_Kが収まる → Q6_Kを実行。Q4_K_Mしか収まらない → 罪悪感なくQ4_K_Mを実行。
  3. IQ4_XS/Q3へ下げるのは、コンテキストを収めるためかCPUオフロードを避けるためだけ。オフロードが速度から奪うものは、量子化1段階が品質から奪うものより大きい。
  4. 目標のモデルがQ4で収まらないなら、Q2まで量子化するよりサイズクラスを下げる。Q4の堅牢な8Bは、実践ではつぶれた14Bに大抵勝つ。

関連: VRAM計算 · KVキャッシュ · パラメータ · モデルフォーマット