量子化
量子化とは、LLMの重みを高精度の浮動小数点数(典型的には16ビットのbfloatまたはfloat)から、より低精度の整数や浮動小数点数(8ビット、4ビット、時には2ビット)へ変換し、メモリフットプリントを縮小して推論を高速化しつつ、品質への影響をわずかに抑えるプロセスです。現代のオープンソースのデプロイ(llama.cpp、Ollama、vLLM、GPTQ、AWQ)は、ほぼ完全に量子化されたモデルで動作しています。
量子化とは、LLMの重みを高精度の浮動小数点数(典型的には16ビットのbfloatまたはfloat)から、より低精度の整数や浮動小数点数(8ビット、4ビット、時には2ビット)へ変換し、メモリフットプリントを縮小して推論を高速化しつつ、品質への影響をわずかに抑えるプロセスです。現代のオープンソースのデプロイ(llama.cpp、Ollama、vLLM、GPTQ、AWQ)は、ほぼ完全に量子化されたモデルで動作しています。
なぜ重要なのか
ネイティブの16ビット形式の700億パラメータのモデルは、約140GBのGPUメモリを必要とし、コンシューマー向けの単一カードでは手が届きません。同じモデルを4ビットで量子化すると約35GBになり、コンシューマー向けGPU2枚、ワークステーション用カード1枚、あるいはMac Studio1台にさえ収まります。量子化こそが、ローカルLLMを実用的にしたものです。Llama 3 70B、Mixtral 8×22B、DeepSeek-V3がすべて3,000ドルのハードウェアで動作するのは、まさに量子化のおかげです。開発者にとって量子化は、「セルフホスティングする余裕がない」と「自前のモデルを提供できる」の違いを生みます。
どのように機能するのか
精度レベル:
- FP32(32ビット浮動小数点): 学習のデフォルト。重みあたり4バイト。推論ではほとんど使われません。
- FP16 / BF16(16ビット): 推論のデフォルト。重みあたり2バイト。
- INT8(8ビット整数): メモリ半分、品質はほぼ同一。
- INT4 / FP4(4ビット): メモリ4分の1、品質低下はわずか(通常ベンチマークで1〜3%)。
- INT2(2ビット): メモリ8分の1、ほとんどのタスクで目立つ品質低下。
量子化のプロセス:
- キャリブレーション: 小さなデータセットでモデルを実行し、活性化の範囲を観測します。
- スケールとゼロ点の計算: 各重みテンソルについて、元の範囲を整数の範囲にマッピングするスケーリング係数を計算します。
- 重みの変換: 各重みが量子化され、整数とグループごとまたはチャネルごとのスケール係数として保存されます。
- 推論時の逆量子化: 計算時、行列乗算の直前に重みが浮動小数点へ展開されます。
量子化の手法
RTN(Round to Nearest): 最も単純な手法。重みを最も近い量子化値に丸めるだけ。高速ですが低品質。
GPTQ: 再構成誤差を最小化するグループ単位のポストトレーニング量子化。4ビットのオープンソース標準。
AWQ(Activation-aware Weight Quantization): 大きな活性化を扱う重みを保護し、残りをより積極的に量子化します。4ビットのLLMで非常に人気があります。
GGUF(Q4_K_M、Q5_K_Mなど): llama.cppのブロック単位の量子化フォーマット群。K_Mバリアントはサイズと精度のバランスを取ります。Q4_K_Mはローカル推論のデフォルト形式です。
SmoothQuant: 活性化の外れ値を重みに移し、両方をきれいに量子化できるようにします。大規模モデルで精度をあまり損なわずにINT8を可能にします。
QAT(Quantization-Aware Training): 量子化をループに組み込んでモデルを学習します。最高の品質ですが、再学習が必要です。
FP8: H100/H200 GPUがサポートするハードウェアネイティブの8ビット浮動小数点形式。学習と推論の両方でINT8より高速です。
トレードオフ
品質対圧縮率: 精度が低いほどモデルは劣化します。8ビットはほぼ無償、4ビットは良いデフォルト、2ビットは目に見えて損なわれます。
タスクへの感度: 数学、コード、長い推論は、チャットや要約よりも量子化の影響を強く受けます。
速度対メモリ: 量子化はメモリを節約しますが、計算リソースが豊富なGPUでは必ずしも推論を高速化しません。メモリ制約のあるハードウェア(コンシューマー向けGPU、Apple Silicon)では大きな高速化になります。
キャリブレーションデータの品質: 質の悪いキャリブレーションは、量子化モデルを密かに台無しにする可能性があります。代表的なプロンプトを使いましょう。
いつどれを使うべきか
コンシューマー向けGPU(8〜24GB)で実行する: 4ビットGGUF(Q4_K_M)またはAWQ。
H100/H200で実行する: SmoothQuantを併用したFP8またはINT8。
エッジ/モバイル: 積極的な4ビットまたは2ビットGGUF。品質低下を許容します。
ベンチマーク研究: FP16/BF16を基準として保持し、デプロイの比較のためにのみ量子化します。
重要度の高い本番環境: 8ビットまたは16ビット。限界コストは品質保証に見合います。
よくある間違い
精度を明記せずにベンチマークを比較する: 量子化モデルのMMLUスコアは、同じモデルのFP16スコアと直接比較できません。
パープレキシティのドリフトを無視する: ベンチマークが良好に見えても、量子化は特定のスキル(特に数学)を劣化させることがあります。実際のワークロードでテストしましょう。
一気に積極的すぎる: FP16から間を試さずに一気にINT2へ飛ぶと、どこで品質が崩れたかが分からなくなります。
古いキャリブレーションデータを使う: 英語のみでキャリブレーションされたモデルは、韓国語のプロンプトで品質を失います。
エンドツーエンドのレイテンシを測定しない: 量子化はメモリの読み込みと計算の両方に影響します。ボトルネックが別の場所にあったために、スループットが改善しないこともあります。
Sources: