Mímisbrunnr知恵の泉

← ローカルLLM 一覧

🎓 レベル:標準 | 重要度:A(必須) 📎 前提:モデル形式(safetensorsとGGUF) | 原理:推論の実務(機械学習)

要点(結論先出し)

概念 ── 連続値を格子に丸める

重みはおおむね0付近に密集した実数です。FP16は1個16bitで広い範囲を表せますが、ローカルでは贅沢。量子化は値域を等間隔(または工夫した間隔)の格子に区切り、最も近い格子点の整数インデックスだけ保存します。復元時は 値 = スケール x 量子化整数 (+ ゼロ点)

仕組み ── ブロックごとにスケールを持つ

1本のテンソル全体に1つのスケールだと、巨大な外れ値に引っ張られて他の値の分解能が潰れます。そこで重みを小さなブロック(例:32個や256個)に区切り、ブロックごとにスケールを持つ。これが低ビット量子化の品質を支える基本アイデアで、第3トピックの k-quants はこれをさらに階層化したものです。

flowchart LR
  W["FP16の重み列"] --> B["ブロック分割(例256要素)"]
  B --> S["ブロック毎にスケール算出"]
  S --> Q["各値を整数へ丸め(int4等)"]
  Q --> PACK["整数+スケールを格納(小さい)"]

計算例 ── ビット数がサイズを決める

1weightあたりのビット数(bpw)が分かれば、サイズは パラメータ数 x bpw / 8。8Bモデルなら FP16=約15GiB、Q8で約8GiB、Q4_K_M で約4.5GiB。実数値は対応lab vram_sizing.py で確認できます(cp932安全な print のみ使用)。低ビットほど小さいが、丸め誤差は増えます。

運用の勘所

なぜそうするか

LLMは重みのほとんどが冗長で、精度を多少落としても出力分布はあまり崩れません。だから「FP16のまま全部持つ」のは過剰。必要な分解能だけ残すことで、家庭用GPUや統合メモリに巨大モデルを載せられるようになります。

⚠️ よくある落とし穴

対応lab

関連