世界を動かす技術を、日本語で。

基礎から学ぶ量子化

概要

  • LLMのパラメータがモデルを巨大化させる主因
  • 浮動小数点精度を犠牲にしてモデル圧縮が可能
  • 量子化により4倍小型化・2倍高速化が可能(精度損失5~10%程度)
  • 対称・非対称量子化や評価指標(パープレキシティ/KLダイバージェンス等)の解説
  • 実際の量子化手順やベンチマーク方法も紹介

LLMが巨大化する理由

  • パラメータ(重み) がLLMの大部分を占める
  • 1つの入力・1つのパラメータ・1つの出力がAIの基本単位
  • 層(レイヤー) が多数積み重なることでパラメータ数が爆発的に増加
  • 近代LLMは 数十億~数兆のパラメータ を持つ
  • 各ノード間の接続ごとにパラメータが割り当てられる構造

コンピュータによる数値の保存方法

  • コンピュータは ビット(0/1) で整数や浮動小数点数を表現
  • 整数は離散値で扱いやすいが、 小数点以下は無限に存在 するため精度に妥協が必要
  • 32bit浮動小数点数(float32)は 7桁の有効数字 と広い範囲を表現可能
  • 浮動小数点数は 符号・指数・仮数部 に分割される
  • 精度は数値の大きさによって変動し、 小さい値ほど密に表現 できる

LLMパラメータの分布と小型化の可能性

  • 多くのモデルパラメータは 0付近に密集 している
  • LLMは 32bit精度を必ずしも必要としない
  • 16bit(float16)やbfloat16 など、精度や範囲を調整したフォーマットも利用可能
    • float16: 有効数字3桁、範囲±65504
    • bfloat16: 有効数字2桁、範囲±3.4×10^38
  • float8やfloat4 などさらに小型のフォーマットも存在

量子化(Quantization)とは

  • 広い値域を狭い値域に詰め込む 損失圧縮技術
  • 例: float16→float8への変換は「最も近い値に丸める」処理
  • 単純な丸めでは 精度劣化や出力の破綻 が発生しやすい
  • 対称量子化: データの最大絶対値を基準に-7~7などの範囲にスケーリング
  • 非対称量子化: データの最小値・最大値に合わせて範囲を調整し、無駄なスペースを削減
  • 量子化・逆量子化は スケール値やゼロ点 を使い、元の値に近づける

量子化の実装例(JavaScript)

  • 対称量子化
    • 最大絶対値でスケール計算
    • 例: scale = vmax / qmax
    • 量子化値 = 値 / scale を四捨五入
  • 非対称量子化
    • 最小・最大値でスケール計算
    • ゼロ点を考慮し、範囲をより効率的に利用

量子化の実際の運用

  • 全パラメータ一括量子化は 外れ値(アウトライア) の影響で精度が大きく損なわれる
  • 32~256パラメータ単位のブロック毎に量子化 し、外れ値の影響を局所化
  • 外れ値は 別途保持・復元 することもある

量子化後のモデル精度評価指標

  • パープレキシティ(perplexity): 正解トークンの確率から算出、低いほど良い
  • KLダイバージェンス: 元モデルと量子化モデルの確率分布の重なり具合を評価、低いほど良い
  • ベンチマークスコア: GPQA Diamond等の実際の問題で正答率を比較
  • 実際に会話してみる: 主観的だが直感的な品質確認

量子化による速度向上

  • モデルデータが小さくなることで GPU内のデータ転送が高速化
  • 例: MacBook Pro M1 MaxやH100 GPUで 8bit/4bit量子化は2~3倍高速化 を実現

まとめと実践的アドバイス

  • 8bit量子化はほぼ品質劣化なし、4bitはやや劣化だが実用的
  • 2bit量子化は情報損失が大きく実用的でない
  • 量子化モデルは ローカル実行や省メモリ化に有効
  • 量子化以外にも パラメータ剪定や蒸留 など効率化手法が存在
  • 興味があれば AWQやGPTQ、QAT(量子化対応学習) も調査を推奨

参考:量子化・評価ツールの利用例

  • llama.cpp によるモデル取得・量子化・ベンチマーク方法
    • llama-quantizeコマンドで各種量子化形式に変換
    • llama-perplexityでパープレキシティ・KLダイバージェンス計測
    • llama-benchでトークン生成速度計測
  • GPQAベンチマーク の実行例やデータセット取得手順も紹介

LLM量子化の実践ポイント

  • モデル圧縮と速度向上 の両立が可能
  • 精度評価指標 を複数組み合わせて品質を確認
  • 外れ値管理やブロック単位量子化 で実用的な品質を維持
  • 8bit/4bit量子化 はローカル実行や省リソース環境に最適
  • 2bit量子化は避けるべき (品質劣化が著しいため)

さらなる効率化技術への展望

  • 量子化対応学習(QAT) によるさらなる精度維持
  • パラメータ剪定・知識蒸留 など他の圧縮手法との組み合わせ
  • モデル効率化技術の最新動向調査(例:Efficient Large Language Models: A Survey)

まとめ

  • 量子化はLLMのサイズ削減と高速化に有効
  • 適切な手法と評価により 実用的な品質を維持
  • ローカル推論やクラウドコスト削減 など、幅広い応用が可能
  • 今後も 効率化技術の進展 が期待される分野

Hackerたちの意見

すごく美しく書かれていて、視覚的にも素晴らしい!元のデータと異なる量子化レベルのKLダイバージェンスの比較が的確だね。量子化手法がどれだけ強力で、ローカルAIの民主化にどれだけ貢献しているか、みんな気づいてない気がする。UnslothやPrunaみたいな素晴らしいプレイヤーもいるしね。

ありがとう!情報を失ってもモデルがこんなに頑丈だとは驚いたよ。こんなに圧縮できて、なおかつ元のサイズにかなり近い機能を持つなんて、ちょっとおかしい気がする。研究の面でも、ここからもっと進展が見られると思うよ。

5-10%の精度差って、使えるモデルと使えないモデルの違いみたいなもんだよね。

確かにそうかもしれないけど、4ビットモデルと16ビットの元のモデルを比べて話していると、意外と能力があるように感じたよ。気になる特定のタスクで量子化モデルをベンチマークすることをおすすめするよ。

そういえば、あの数字を挙げておきながら、その実際の意味について触れてなかったのが気になった。

そうだね、でも1つのモデルと4倍大きいモデルの違いは、通常それ以上のものだよ。Qwen 8bをbf16で走らせるか、量子化されたバージョンを使うかの問題じゃないんだ。むしろ、Qwen 8bをフル精度で動かすか、Qwen 27bの量子化されたバージョンを使うかの問題だよ。大きいモデルの方が通常は良い結果が得られることが多いよ。

なんてこった… samwhoは今、インターネットで一番いい技術解説をしてるね。

それで、質問なんだけど:ゼロとマイナスゼロを保持するのは、いくつかの限界計算には意味があるよね…でも、4ビットしかないとき、これはかなり無駄じゃない?例えば2.5のためにビットを使った方がモデルが改善されるんじゃない?

心から同意するよ!この投稿でDOM、SVG、キャンバスの視覚化が組み合わさっているのを見るのはクールだった。

量子化は僕にとって重要なんだ。なぜなら、記事にあるように、2TBのメモリを持つ巨大企業を通さずにプログラミングの未来を見出せる唯一の方法だから。メモリだけじゃなくて、モデルがパフォーマンスを発揮するにはVRAMが必要だと理解してる。これは「ソフトウェアの書き方」が自由であるべきだという長い懸念の最新のものなんだ。多くのプログラミング言語がJetbrainsのエディタに依存しているのが不安で、彼らの「オープンコア」提供に少しだけ安心していたけど、それはIDEに強いOSS競争がある言語(つまり、JavaやPython)にしか存在しなかったからね。「Intellisense」は実装が非常に高価で、プログラムを書くときに4秒ごとに行の末尾の空白を削除するのがtrim、strip、または他の何かかを調べるために立ち止まる必要がなくて、本当に助かった。言語サーバーが普及しているのを見るのは嬉しかったけど、Microsoftから出てきたのは残念だった。彼らは明らかにオープンスタンダードから外れて、いくつかの新しいものを作ることでプロセスを加速しようとしてる。今、LLMが次の大きな懸念になってる。もし「北欧や東欧の福祉国家によって間接的に資金提供された2人プロジェクト」のモデルが、今や非常に重要なコアのlibre/OSSライブラリと競争するのがさらに難しくなったら、自由でオープンなソフトウェアにとってはかなり悪いことだと思う。オープンウェイトで量子化された、でもまだ__良い__モデルが唯一の解決策のように思える。ローカルモデルがここまで進化したことには少し希望を持ってるけど、去年よりずっと使いやすくなったし、LM Studioみたいなツールも増えてきてる。でも、まだまだ道のりは長いよ。「プログラミング用のラップトップ」が「デビアンを動かせるものなら何でも」から「RTX 7090、128GBのVRAM、2kWのウェアラブル電源供給バックパックアドオンが最低限必要」になるのは悲しいな。

LLMの論文が少しずつ出てきてるのを見てるけど、今年中に消費者向けハードウェアで1TパラメータのMoEが実現すると思う。まだ大手企業のモデルには及ばないけど、力を倍増させる存在になるはず。理想的には、これらのモデルをCPUで動かせるようにしたいね。MS BitNetがその一つの方法だよ。もう消費者向けのCPUでも、そこそこのTPSで3値LLMを動かせるからね。

他の人がモデルを次々と説得して合理的な出力を得るためのトリックやレッスンに頭を使っている間に、実際のソフトウェアエンジニアリングをマスターし続けることができるよ。結局、自分で検証しなきゃいけないんだから。

最初から最後まで全部読んだよ。視覚的に学ぶタイプだから、これは素晴らしいね。一つだけ気になる点があるんだけど、「非対称量子化」のコードで、「ゼロ」って「ミッドポイント」とかに呼び変えた方が良くない?それとも、この分野では「ゼロ」っていうのが受け入れられてる数学用語なの?

文献では「ゼロポイント」と呼ばれているのを見たから、それに従ったんだ。個人的にはオフセットとして考えるのが好きだけど、一般的に使われている用語に合わせるようにしてるよ。

サムの過去の投稿も掘り起こす価値があるよ。この投稿は特に素晴らしいけど、どれも良いよね。すごく楽しんだし、たくさん学んだ。彼の仕事がちょっと羨ましいな。他の人に教えることを学んで、そんなクールなインタラクティブで視覚的なドキュメントを作るなんて?彼はそれを簡単に見せてるけど、実際はそうじゃないよね。たくさんの努力と想像力が込められているし、楽な道のりじゃなかったはず。それでも、すごくやりがいがありそう。

2ビットは、レジスタのサイズやデータのブロック読み込みとぶつかるから、たぶん遅くなるんだよね。アーキテクチャが2ビットを読み込むわけじゃなくて、最低でも4ビットは必要だから、利用効率ともぶつかるしね。全体的に見て、すごく良いビジュアライゼーションだと思う。

ハードウェアの状況は思ってるよりずっと良いよ、そして量子化がその大きな理由の一つ。Qwen 3.5 27Bを見てみて、これはしっかりしたコーディングモデルだよ。FP16だと54GBのVRAMが必要なんだけど、そんなの消費者向けハードウェアじゃ動かせないよね。Q4_K_M量子化だと16GB必要。中古のRTX 3090は24GBで、約900ドルで手に入る。これならローカルで動かせて、コンテキストにも余裕があるよ。14BのコーディングモデルでQ4だと、だいたい10GBくらい。中古のRTX 3060 12GBなら270ドル以下でそれに対応できる。データセンターが必要なモデルとデスクで動くモデルのギャップは、ほとんど量子化のせいだね。Q4の27Bモデルは、ほとんどのコーディングタスクで驚くほど少ない品質の低下がある。無料ではないけど、RTX 7090でもないしね。今のローカルLLMコミュニティでは、中古の3090が最もおすすめのカードだよ。それには理由があるんだ。

フロート比較スライダーはすごくいいね。実際の経験から言うと、モデルサイズの違いはベンチマークでは捉えられない形で現れるんだ。うちのシステムでは、小さいモデルがプランを生成して、大きいモデルがそれを上書きするんだけど、単一の出力を見るとどちらも似たように見える。でも、3〜4ステップ後に違いが出てくるんだ。小さいモデルが合理的に思える決定を下すけど、それが悪いプランに繋がる。パープレキシティもKLダイバージェンスもそれを捉えられない。どちらも一度に一つの予測しか測れないからね。

この部分はちょっと混乱したな:「これは、モデルのパラメータがノートパソコンで実行可能なサイズに量子化されるときに何が起こるかです。フロートの代わりに、小さい整数が保存されてメモリにロードされます。量子化された値を使うとき、例えば質問に対する答えを生成するために、その値はオンザフライでデクオンタイズされます。これが遅くなると思うかもしれませんが、後で見ると、実際には速くて小さくなることがわかります。」ほとんどのGPUは、こういう量子化されたフォーマットでフロート演算をサポートしていると思ってたんだけど、例えばfloat4の数値でネイティブに演算できるみたいに(たぶん、2つのfloat4を1バイトに詰め込んだり、もっと多くのfloat4を8バイトの配列に入れたりするかも)。これって間違ってるのかな?GPUが量子化された数値を取り込んで、それを32ビットや64ビットのフロートに戻してからALUで実行するってこと?(メモリ帯域幅の節約が、GPUに載せた後に32ビットの数値に戻すための余分な作業を補うのかな?)それとも、float8やBfloat16のネイティブサポートはあるけど、float2を使いたいならfloat4に変換しないといけないみたいな変なハイブリッドなのかな。GPUのベクトル化されたADDやMULT命令で、これらの量子化された数値が実際にどうなるのか、ちょっと混乱してる。

あなたの理解は正しいよ。重要なポイントは、著者がテストにM1 MaxとH100を使ったことだね。M1 Max: FP16ハードウェアサポート、FP8とBfloat16はソフトウェアでエミュレート(デクオンタイズを通じて) H100: FP16とFP8のハードウェアサポート > どちらもMacBook Pro M1 MaxとレンタルしたH100 SXM GPUで動かしたよ。