量子化とは
Quantization
モデルの重みや計算を低ビット精度の数値表現に変換し、モデルサイズと推論コストを削減する手法
ひとことで言うと
AIモデルの計算に使う数値の精度を落として、軽くて速くする技術。
概要
量子化(Quantization)とは、ニューラルネットワークの重みや活性化値を、通常使われる32ビット浮動小数点数(FP32)等の高精度な数値表現から、8ビット整数(INT8)や4ビットといったより低いビット数の表現へ変換する手法。 数値表現のビット数を減らすことで、モデルのファイルサイズ・メモリ使用量を削減し、対応するハードウェア上では演算も高速化できる。 性能低下を抑えながら、限られたメモリのGPUやエッジデバイス上でも大規模モデルを動作させる手段として広く使われている。 学習済みモデルへ事後的に適用するPTQ(Post-Training Quantization)と、量子化の影響を織り込んで学習し直すQAT(Quantization-Aware Training)の2種類があり、ビット数を下げるほど性能低下のリスクとのトレードオフが大きくなる。
背景
LLMのパラメータ数が増加するにつれ、モデルを読み込むだけで大量のGPUメモリを消費するようになり、個人利用や限られたハードウェアでの実行が難しくなった。 量子化は、モデルの精度低下を許容範囲に抑えながら数値表現のビット数を減らすことで、メモリ使用量と計算コストを抑える手法として発展した。
歴史
2010年代: ニューラルネットワークの推論高速化を目的としたINT8量子化が実用化される。 2022年: LLM.int8()等、大規模言語モデル向けの外れ値を考慮した量子化手法が提案される。 2023年: GPTQやAWQ等、事前学習後のモデルに対して精度低下を抑えつつ4bit程度まで圧縮する手法が普及。 同年、量子化とLoRAを組み合わせたQLoRAにより、量子化されたモデルに対してもメモリを抑えたファインチューニングが可能になる。
アーキテクチャ
量子化は大きく、学習後に重みを変換する「学習後量子化(Post-Training Quantization, PTQ)」と、学習段階から量子化を考慮して訓練する「量子化を考慮した学習(Quantization-Aware Training, QAT)」に分けられる。 浮動小数点の値を一定範囲に丸め込み、スケール値とゼロ点を用いて整数値へ変換し、推論時にはそのスケールを使って元の数値スケールへ近似的に復元しながら計算する。
ワークフロー
学習済みモデルを用意 → 重み(および活性化値)の分布を分析しスケールを決定 → 低ビット表現へ変換(PTQ)、または量子化を考慮しながら再学習(QAT) → 精度低下を評価し量子化設定を調整 → 量子化済みモデルをデプロイ。
コード例
bitsandbytesで4bit量子化してモデルを読み込む
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
quant_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype="bfloat16",
)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Llama-3.1-8B-Instruct",
quantization_config=quant_config,
device_map="auto",
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-3.1-8B-Instruct")利点
- モデルのファイルサイズとメモリ使用量を大きく削減できる
- 対応ハードウェア上では推論を高速化できる
- 個人のPCや単一GPU等限られた計算資源でも大規模モデルを動作させやすくなる
欠点
- ビット数を下げすぎると、モデルの性能(精度)が低下する
- モデルやタスクによって量子化への耐性が異なり、最適な手法・ビット数の選定に試行錯誤を要する
- 量子化に対応していないハードウェアやソフトウェアでは、期待したほど高速化しないことがある
比較
- 知識蒸留 — 量子化と知識蒸留は、どちらもモデルを軽量化する代表的な手法であり、組み合わせて使われることもある
- LoRA — QLoRAは量子化とLoRAを組み合わせ、量子化されたモデルに対して効率的にファインチューニングを行う手法
- SLM — 量子化はSLMと同様、限られた計算資源でモデルを動作させるためのアプローチの1つ
- KVキャッシュ — KVキャッシュのメモリ使用量を抑えるため、キャッシュ自体を量子化する手法も使われる
- NPU — NPU上で効率よく推論するには、モデルを量子化しNPUが対応する精度形式へ変換することが多い
- llama.cpp — llama.cppは、GGUF形式による量子化を通じてモデルサイズを圧縮し、CPUでの実行を可能にしている
- エッジAI — 量子化は、エッジAIで求められるモデルの軽量化・高速化を実現する代表的な手法の1つ
- GGUF — GGUFは、量子化されたモデルの重みを格納するための代表的なファイル形式
- FP16 — FP16への変換は、量子化の中でも比較的精度低下が小さい代表的な手法の1つ
- INT8 — INT8は、量子化における代表的な目標精度の1つ
- INT4 — INT4は、量子化の中でも特に高い圧縮率を狙う際に使われる目標精度
- PTQ — PTQは、学習済みモデルへ事後的に量子化を適用する代表的な手法の1つ
- QAT — QATは、学習段階から量子化による精度低下を織り込む代表的な手法の1つ
- GPTQ — GPTQは、少量のキャリブレーションデータでLLMを4bit程度まで量子化する代表的なPTQ手法
- AWQ — AWQは、活性化値の分布に基づき重要な重みを保護しながら量子化する代表的なPTQ手法