量子化 (Quantization) は、メモリ使用量とデータ転送量を削減し、適切なハードウェアでの推論効率を向上させるために、モデル パラメーターまたは中間データを低精度の数値で表します。
1. 量子化手法の分類
Quantization
├── 量子化の対象
│ ├── Weights
│ ├── Activations
│ └── KV Cache
│
├── 数値形式
│ ├── INT8 / INT4
│ ├── FP8 / FP4
│ └── NF4
│
├── 量子化の粒度
│ ├── Per-tensor
│ ├── Per-channel
│ └── Per-group
│
├── 量子化方法
│ ├── PTQ
│ └── QAT
│
├── 量子化アルゴリズム
│ ├── GPTQ
│ ├── AWQ
│ └── SmoothQuant
│
└── ツールとフォーマット
├── bitsandbytes
├── GGUF
└── GPTQ / AWQ Model Files
区別する必要があります:
| コンセプト | 分類 | 主な機能 |
|---|---|---|
| INT4 / INT8 | 数値精度 | データビット幅を減らす |
| NF4 / FP4 | 低精度表現 | 異なる数値エンコーディングを使用する |
| GPTQ | 量子化アルゴリズム | 重みの量子化誤差を減らす |
| AWQ | 量子化アルゴリズム | Activation 情報を使用して感度の高い重みを保護する |
| SmoothQuant | 量子化アルゴリズム | Activation 量子化の改善 |
| bitsandbytes | ソフトウェアライブラリ | 低精度のロードと計算を提供します |
| GGUF | モデルファイル形式 | 重み、定量情報、メタデータを保存する |
2.SymmetricとAsymmetric Quantization
Symmetric Quantization
整数値の対称範囲を使用し、ゼロは整数のゼロに対応します。
たとえば:
Float Range: -1.0 ~ 1.0
INT8 Range: -127 ~ 127
量子化:
逆量子化:
その中には:
- (x): 元の値。
- (q): 量子化された整数。
- (s):Scale。
- : 近似値が回復しました。
Asymmetric Quantization
Zero Point は、整数間隔が非対称な数値分布に対応できるようにするために導入されました。
ここで、(z) は Zero Point です。
実際の量子化では、ターゲットの整数範囲に基づいてクリッピングを実行することも必要です。
2 つの方法の間に絶対的な利点や欠点はなく、数値分布、ハードウェアのサポート、および特定の量子化アルゴリズムに依存します。
3. Quantization Granularity: 量子化の粒度
Per-tensor
Tensor 全体では、一連の量子化パラメータが使用されます。
問題は、Channel ごとに値の範囲が大きく異なる可能性があることです。
Channel A: -0.1 ~ 0.1
Channel B: -10 ~ 10
Scale を共有すると、Channel A の精度が大幅に低下する可能性があります。
Per-channel
各 Channel は独立した量子化パラメータを使用します。
Channel 1 → Scale 1
Channel 2 → Scale 2
Channel 3 → Scale 3
重み行列のどの次元が実際に対応するかは、量子化の実装によって異なります。
Per-group / Group-wise
各グループに独立した Scale を使用して、重みをサブグループに分割します。
128 Weights → Scale 1
128 Weights → Scale 2
128 Weights → Scale 3
一般に、Group Size が小さいほど、局所的な数値分布に適応するのが容易になりますが、より多くのメタデータが必要になります。
一般的な Group Size には、32、64、128 などが含まれます。
4. Weight-onlyとWeight-Activation Quantization
W4A16
Weights → INT4 / 4-bit Format
Activations → FP16 / BF16
主に以下を削減するために使用されます。
- モデル体重の職業。
- ビデオ メモリの帯域幅要件。
- モデルによってロードおよび転送されるデータの量。
多くの 4-bit LLM 推論スキームがこのカテゴリに分類されます。
W8A8
Weights → INT8
Activations → INT8
重みを圧縮するだけでなく、低精度の行列演算を使用して計算効率を向上させようとしています。
| 計画 | 主な利点 | 難易度 |
|---|---|---|
| W4A16 | 重みメモリを大幅に削減 | Dequantization および Kernel の効率 |
| W8A8 | 低精度の行列計算が可能 | Activation Quantization |
| FP8 | Improved compute and memory efficiency on supported hardware | 値の範囲、Scale、およびハードウェアの互換性 |
Activation を量子化するのが難しいのはなぜですか?
Weight is usually fixed after training, and the numerical distribution can be analyzed in advance.
Activation changes with the input content, Token and model layer, and dynamic Outlier may occur.
Activation Quantization therefore often requires more careful calibration or dynamic quantization strategies.
5. PTQ、QAT、Calibration
PTQ:Post-Training Quantization
モデルがトレーニングされた後に量子化します。
一般的な方法:
- GPTQ。
- AWQ。
- SmoothQuant。
完全なモデルを再トレーニングする必要はありません。
QAT:Quantization-Aware Training
トレーニング中に量子化エラーをシミュレートして、モデルを低精度の計算に適応させます。
High-precision training states suitable for gradient updates are usually still retained.
Calibration Dataset
Some PTQ methods require representative samples for analysis:
- Activation配布。
- Outlier。
- 体重に対する感度。
- 量子化エラー。
For example, provide hundreds to thousands of representative texts for calibration.
Calibration Dataset が実際の使用シナリオに近いほど、通常は合理的な量子化結果が得られます。
But not all quantization methods require Calibration Dataset.
6. GPTQ
GPTQ is a typical post-training weight quantization algorithm.
核となるアイデア:
重みを量子化するとき、近似 2 次情報を使用して量子化誤差を測定し、まだ量子化されていない重みを補正します。
Original Weights
W1 W2 W3 W4
↓
Quantize W1
↓
Estimate Error
↓
Adjust Remaining Weights
↓
Continue Quantization
主な特徴:
- 4-bit Weight-only Quantizationと共用です。
- 多くの場合、校正データが必要になります。
- 量子化プロセスには時間がかかる場合があります。
- より低いビット幅でより良いモデル品質を維持できます。
The advantage of GPTQ lies in quantization error control rather than guaranteeing optimal inference speed on any hardware.
7. AWQ
AWQ:Activation-aware Weight Quantization。
核となるアイデア:
Different weights in the model have different importance for the final output. Weight Magnitude を観察するだけでは十分ではありません。 The characteristics corresponding to Activation must also be considered.
AWQ は、Activation Statistics を介して機密重みまたは Channel を識別し、Scaling などの方法を使用して量子化誤差を削減します。
Calibration Data
↓
Activation Statistics
↓
Identify Salient Channels
↓
Protect Sensitive Weights
↓
Quantized Model
GPTQ と比較:
| コントラスト | GPTQ | AWQ |
|---|---|---|
| 主な基礎 | おおよその二次誤差情報 | Activation Statistics |
| 中核戦略 | 量子化誤差補正 | デリケートな重み物を保護する |
| 一般的な用途 | 4-bit 重みの量子化 | 4-bit 重みの量子化 |
| 校正が必要かどうか | 通常必要な | 通常必要な |
GPTQ と AWQ はどちらも一般的な低ビット推論の選択肢であり、実際のパフォーマンスはモデル、ハードウェア、推論エンジンによって異なります。
8. SmoothQuant
SmoothQuant は主に、Activation では量子化が難しい問題を解決するために使用されます。
所見:
Weights → 比較的数値化しやすい
Activations → Outlier より明白な
中心となるアイデアは、Activation の数値範囲の圧力の一部を等価変換を通じて Weight 側に転送することです。
Original:
Activation Range → Large
Weight Range → Moderate
After Smoothing:
Activation Range → Smaller
Weight Range → Larger
したがって、W8A8 Quantization の実装が容易になります。
GPTQ および AWQ の典型的な Weight-only スキームと比較して、SmoothQuant は Weight + Activation の低精度計算に重点を置いています。
9. bitsandbytes
bitsandbytes は、低精度の計算および量子化ツール ライブラリであり、Hugging Face Transformers および PEFT と組み合わせてよく使用されます。
一般的な用途:
- 8-bitモデル搭載。
- 4-bitモデル搭載。
- NF4 / FP4。
- QLoRA微調整。
4-bit NF4読み込み中
import torch
from transformers import (
AutoModelForCausalLM,
BitsAndBytesConfig,
)
quant_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=True,
)
model = AutoModelForCausalLM.from_pretrained(
"your-model-id",
device_map="auto",
quantization_config=quant_config,
)
ここで:
load_in_4bit: 4-bit 重み量子化を有効にします。bnb_4bit_quant_type: NF4を選択します。bnb_4bit_compute_dtype:該当する演算精度を設定します。bnb_4bit_use_double_quant: 量子化された部分量子化メタデータ。
実際の GPU のサポートは、bitsandbytes、PyTorch、およびデバイス環境によって異なります。
bitsandbytes は主に Hugging Face エコシステムおよび QLoRA の低精度ロードに適していますが、それが必ずしも高同時実行性のプロダクション推論に最適なソリューションであることを意味するわけではありません。
10. NF4、FP4、Double Quantization
NF4:NormalFloat 4-bit
NF4 は、ほぼ正規分布する重み用に設計された不均一 4-bit 表現です。
通常の均一量子化には固定値の間隔がありますが、NF4 は特定の分布に適合する量子化レベルを使用します。
QLoRA では特に重要です。
FP4
FP4 は、4-bit 浮動小数点表現のクラスの総称です。
FP4 のエンコーディングは実装間で異なる場合があることに注意してください。 bitsandbytes の FP4 と、最新の GPU でサポートされている他の FP4 形式は、直接同じ形式とは見なされません。
Double / Nested Quantization
重みの量子化後、Scale などのパラメータも保存する必要があります。
Double Quantization は、一部の量子化メタデータをさらに圧縮します。
Original Weights
↓
4-bit Quantization
↓
Weights + Scales
↓
Quantize Scales
↓
Reduce Metadata Overhead
これにより、すでに量子化されたすべての重みを再量子化するのではなく、量子化されたメタデータのコストが削減されます。
11. GGUF Quantization
GGUF は、llama.cpp エコシステムで一般的に使用されるモデル ファイル形式です。
一般的な量子化タイプ:
| タイプ | 特長 |
|---|---|
| Q4_0 | 以前の 4-bit Block Quantization |
| Q4_K_S | K-Quant 4-bit、小型ハイブリッド方式 |
| Q4_K_M | K-Quant 4-bit、共通バランス方式 |
| Q5_K_M | 精度が高く、一般にファイルが大きくなる |
| Q6_K | 6-bit K-Quant |
| Q8_0 | 8-bit 量子化、通常は品質損失が少なくなります |
Q4_K_M および Q5_K_M
K-Quant は、ブロック量子化、Scale のグループ化などを使用して重みを保存します。
その中には:
Q4/Q5は主量子化ビット幅を表します。KはK-Quantシリーズを意味します。_S/_Mは、さまざまなモデルレベルの量子化組み合わせ戦略を表します。
Q4_K_M と Q5_K_M は、異なる Tensor に対して異なる量子化精度を使用する場合があり、すべての Tensor が厳密に同じビット幅であるわけではありません。
したがって、実際のモデルのサイズは単純なものよりも大きくなります。
Parameters × 4 bits
量子化バージョンを選択するにはどうすればよいですか?
同じモデルの場合、一般的に次のように理解できます。
Q4_K_M → 記憶力と品質のバランスにもっと注意を払う
Q5_K_M → 精度の向上と引き換えにメモリを増やしたい
Q6_K → 量子化誤差をさらに低減
Q8_0 → 通常は元の高精度モデルに近い
これはモデル間の絶対的な品質ランキングではありません。実際の結果を得るには、同じモデルの異なる量子化バージョンを比較する必要があります。
llama.cpp によって提供される量子化参照データは、Q5_K_M のファイル サイズが一般的に Q4_K_M よりも大きく、Perplexity の損失が低いことを示しています。
12. FP8とFP4
FP8
FP8 共通形式:
E4M3 → 1 Sign + 4 Exponent + 3 Mantissa
E5M2 → 1 Sign + 5 Exponent + 2 Mantissa
E4M3 は有効数字の精度が高く、E5M2 は指数範囲が広くなります。
浮動小数点表現は INT8 よりも広いダイナミック レンジをカバーできますが、それでも適切な Scale 管理が必要です。
最新のデータ センター GPU FP8 のハードウェア サポートは向上し続けているため、大規模な推論とトレーニングにおいてその重要性がますます高まっています。
FP4
FP4は、Activationの重みとデータ量をさらに削減できます。
ただし、FP4 の実際のパフォーマンスは、GPU に対応する低精度コンピューティング ハードウェア、量子化戦略、および Kernel があるかどうかに大きく依存します。
FP4 が bit を 4 つ使用しているからといって、FP8 の 2 倍の速度が必要であるという意味ではありません。
13. Dequantizationと推論速度
Dequantization は、量子化された値を近似浮動小数点値に復元するか、計算 Kernel 内で同等のデータ変換と計算を完了します。
たとえば:
INT4 Weights
↓
Read Compressed Weights
↓
Dequantization / Fused Kernel
↓
Matrix Computation
W4A16 の方が速いのはなぜですか?
モデルにはもともと BF16 の 16 GB 重みがあったと仮定します。
BF16 Weights ≈ 16 GB
INT4 Weights ≈ 4 GB + Metadata
Memory-bound の Decode の場合、重み付けされた読み取りの数を減らすと速度が大幅に向上する可能性があります。
量子化が必ずしも高速ではないのはなぜですか?
実際の速度は以下によって異なります。
- GPU は、対応する低精度演算をサポートします。
- 適切に最適化された Quantized Kernel はありますか。
- Dequantization オーバーヘッド。
- Batch Size。
- Prefill / Decode 比率。
- Kernel Fusion。
- Memory Bandwidth。
GPU に強力な BF16 Tensor Core 実装があり、選択された INT4 Kernel 実装が貧弱な場合、INT4 はビデオ メモリを節約するだけで、速度は向上しない可能性があります。
したがって、メモリの節約、モデルの品質、および実際の推論パフォーマンス は個別に測定する必要があります。
14. KV Cache Quantization
量子化はWeightsだけでなくKV Cacheでも使用できます。
たとえば:
Model Weights: INT4
KV Cache: FP8 / INT8
Activations: BF16
KV Cache Quantization の主な値:
- 長いコンテキストのメモリ フットプリントを削減します。
- サポートできる同時実行数を増やします。
- Attention が KV Cache から読み込むデータ量を減らします。
その代償として、追加の精度誤差と量子化計算のオーバーヘッドが発生する可能性があります。
長いコンテキストと高い同時実行性の推論の場合、KV Cache Quantization の意味は非常に明らかである可能性があります。
15. 量子化スキームと推論エンジン
モデルが実行できるかどうかは、量子化方法だけでなく、モデルのファイル形式と推論エンジンがサポートする Kernel によっても決まります。
| 計画 | 共通の生態 | 代表的な用途 |
|---|---|---|
| GPTQ | Transformers、互換性のある GPU 推論エンジン | 4-bit 重み推論 |
| AWQ | Transformers、互換性のある GPU 推論エンジン | 4-bit 重み推論 |
| bitsandbytes NF4 | Transformers、PEFT | 低精度ロード、QLoRA |
| GGUF Q4_K_M | llama.cpp、Ollama | ローカルの低メモリ推論 |
| FP8 | vLLM、SGLang、その他の互換エンジン | データセンター GPU 推論 |
具体的なサポートは、推論エンジンのバージョン、モデル アーキテクチャ、ハードウェアによって異なります。
は、GGUF、GPTQ、AWQ ファイルを単純に交換可能なモデル ファイルとして扱うことはできません。
16. 量子化効果の評価方法
量子化には 3 つの次元を同時に比較する必要があります。
| 寸法 | インジケーター |
|---|---|
| Memory | モデルボリューム、VRAM、KV Cache |
| Performance | TTFT、TPOT、Throughput |
| Quality | Perplexity、Benchmark、タスク成功率 |
同じ条件で比較することをお勧めします。
Same Model Architecture
Same Evaluation Dataset
Same Hardware
Same Input / Output Length
Same Concurrency
↓
BF16 vs INT8 vs INT4
Quality
次のことを観察できます。
- Perplexity。
- Benchmark Accuracy。
- コード生成の精度。
- ツール呼び出し精度率。
- ロングコンテキストタスクのパフォーマンス。
量子化誤差は、さまざまな程度でさまざまなタスクに影響を与える可能性があるため、単一の Benchmark だけに頼ってモデルの品質を判断することはできません。
17. LoRA、QLoRA、Distillation、Pruning
これらの手法は量子化に関連していますが、異なる問題を解決します。
LoRA
LoRA (Low-Rank Adaptation) は、効率的なパラメータ微調整方法です。
特定の重み行列が (W) であると仮定し、トレーニング中に元の行列をフリーズし、低ランクの更新を追加します。
[ W'=W+BA ]
その中には:
- (A)、(B): トレーニング可能な低ランク行列。
- Rank (r): 低ランクの更新の容量を制御します。
- 元のウェイト (W): 通常は固定されたままになります。
したがって、トレーニングする必要がある新しいパラメータは少なくなります。
QLoRA
量子化と LoRA を組み合わせます。
Base Model
↓
4-bit NF4
↓
Frozen Base Weights
↓
Train LoRA Adapters
主な目的は、モデルの推論を高速化することではなく、大規模なモデルを微調整する際のメモリ要件を削減することです。
Distillation
Student Model をトレーニングするには、Teacher Model を使用します。
一般的な方法:
- Output Distillation。
- Logit Distillation。
- Reasoning / Trace Distillation。
通常の目標は、大規模なモデルの一部の機能を小規模なモデルに移すことです。
Pruning
重要でないパラメータ、チャネル、または構造を削除またはスパース化します。
含まれるもの:
- Unstructured Pruning: 部分的な重みをゼロにリセットします。
- Structured Pruning: Head、Channel、Neuron、または Layer を削除します。
注: スパース化は特定の加速と等しくないため、実際の速度はハードウェアと Sparse Kernel のサポートによって異なります。
技術比較
| テクノロジー | コアの動き | 主な目的 |
|---|---|---|
| Quantization | 数値精度を下げる | メモリとデータ転送を削減する |
| LoRA | 低ランクの増分パラメータのトレーニング | 低コストでの微調整 |
| QLoRA | 定量ベーシックモデル+LoRA | 低メモリの微調整 |
| Distillation | Teacher トレーニング Student | 知識の移行とミニモデリング |
| Pruning | パラメータを削除またはスパース化する | モデル構造または計算を圧縮する |
概要
量子化にとって最も重要な知識は次のように要約できます。
| 分類 | 核となる知識 |
|---|---|
| 基本原則 | Scale、Zero Point、Symmetric、Asymmetric |
| 量子化の粒度 | Per-tensor、Per-channel、Per-group |
| 量子化の対象 | Weight、Activation、KV Cache |
| 方法 | PTQ、QAT、Calibration |
| コアアルゴリズム | GPTQ、AWQ、SmoothQuant |
| 特殊な生態 | bitsandbytes、NF4、GGUF、FP8 |
| 性能評価 | Memory、Quality、TTFT、TPOT、Throughput |
実際の選択は次のシナリオから開始できます。
Local Inference
↓
GGUF + llama.cpp / Ollama
GPU Weight-only Inference
↓
GPTQ / AWQ その他の互換性のあるソリューション
GPU FP8 Inference
↓
Hardware-supported FP8 Kernels
Low-memory Fine-tuning
↓
NF4 + QLoRA
基本原則:
量子化は、主に数値精度を下げることでメモリとデータ送信を節約します。ただし、高速化できるかどうか、どの程度加速されるか、および品質の低下がどの程度になるかは、特定のモデル、量子化スキーム、ハードウェア、および推論エンジンによって異なります。