NF4(Normal Float 4-bit)(エヌエフフォー)
QLoRA論文(2023)で提案された情報理論的に最適な4bit量子化データタイプ。LLMの重みが正規分布に従うことに着目し、正規分布に特化したノンリニア量子化グリッドを使用することでFP4より精度が高い。BitsAndBytesライブラリでbnb_4bit_quant_type="nf4"として実装されている。
NF4(Normal Float 4-bit)とは
NF4(Normal Float 4-bit)は2023年5月にTim Dettmers、Artidoro Pagnoni、Ari Holtzman、Luke Zettlemoyerが発表したQLoRA論文("QLoRA: Efficient Finetuning of Quantized LLMs")で提案された情報理論的に最適な4bitデータ型です。
LLMの重み(Weight)が統計的にゼロ平均の正規分布(ガウス分布) に従う性質に着目し、通常の固定間隔4bit量子化(FP4)より量子化誤差を最小化するために設計されています。
NF4の情報理論的背景
FP4との違い
FP4(Fixed-Point 4-bit): 均等間隔で-8〜+7の16段階に量子化。値の密度が高い±1付近でも粗い間隔のため精度損失が大きい。
NF4: 正規分布N(0, 1)の確率密度関数を等面積(1/16ずつ)に分割した16点を量子化グリッドとして使用。ゼロ付近に量子化点が密集し、重要な値域での精度を保持。
FP4 vs NF4 精度比較
| 指標 | FP16(基準) | FP4 | NF4 |
|---|---|---|---|
| Llama-7B PPL(WikiText-2) | 5.12 | 5.78 | 5.32 |
| 量子化誤差(平均MSE) | 0 | 0.0043 | 0.0033 |
| MTベンチ(7Bモデル) | 7.6 | 7.1 | 7.4 |
| 品質劣化率 | - | -6.6% | -2.3% |
→ NF4はFP4比で量子化誤差を約23%削減し、品質劣化を半分以下に抑える。
ダブル量子化(Double Quantization)との組み合わせ
QLoRA論文ではNF4とダブル量子化(DQ)を組み合わせることで、さらに圧縮率を向上させます。
NF4 vs NF4+DQ:
- NF4のみ: 4.5 bit/param(4bit + 0.5bit FP32スケール)
- NF4+DQ: 4.127 bit/param(追加8%削減)
from transformers import BitsAndBytesConfig
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
)
QLoRAにおけるNF4の役割
QLoRAはNF4量子化された「凍結」ベースモデルに、FP16/BF16の小さなLoRAアダプター(trainable)を付与します。
QLoRAでQwen2.5-32Bをファインチューニングする構成例(RTX 4090 24GB):
- Base: Qwen2.5-32B-Instruct NF4+DQ → 17.6GB VRAM
- LoRA: r=16, alpha=32, target=q_proj/v_proj → +0.8GB
- 合計: 18.4GB → RTX 4090(24GB)で余裕あり
NF4とGPTQ/AWQの違い
| 観点 | NF4(BnB) | GPTQ-Int4 | AWQ-Int4 |
|---|---|---|---|
| 主用途 | ファインチューニング | 推論 | 推論 |
| 量子化タイミング | ロード時(動的) | 事前量子化(静的) | 事前量子化(静的) |
| 推論速度 | FP16比-40〜50% | FP16比-20% | FP16比-10% |
| ファインチューニング対応 | QLoRA主流 | 限定的 | 限定的 |
よくある質問(FAQ)
Q1: NF4はなぜFP4より精度が高いのか? A: LLMの重みは統計的に正規分布するため、正規分布の等面積分割で量子化グリッドを設計したNF4はゼロ付近に量子化点が多く、精度損失が少ない。FP4は均等間隔のため疎な領域にも無駄なグリッドを使う。
Q2: NF4モデルをGGUFやGPTQに変換できる? A: NF4はランタイム動的量子化のため、事前量子化GGUFやGPTQへの直接変換はできない。変換にはFP16モデルから改めてGGUF化・GPTQ化が必要。
Q3: bnb_4bit_compute_dtypeはfloat16とbfloat16どちらが良い? A: 新しいGPU(Ampere/Ada/Hopper: RTX 3000系以降)はbfloat16がネイティブ対応しており推奨。古いGPU(RTX 2000系等)はfloat16を使う。
まとめ
- NF4はLLM重みの正規分布性質に最適化した情報理論的4bit量子化データ型
- FP4比で量子化誤差23%削減、QLoRA論文で実証されたファインチューニング標準手法
- ダブル量子化(DQ)と組み合わせでさらに0.4bit/param追加削減
- BitsAndBytesでload_in_4bit+nf4の2行設定が実質的な業界標準