科学と神々株式会社アドベントカレンダー 2025
LLM量子化 Day 16: GPTQQuantizerの内部
GPTQModelという相棒
Day 15でGPTQの理論を学びました。ヘシアン行列を使って誤差を補償する——美しいアイデアですが、実装は非常に複雑です。
llm-quantizeは、この複雑さをGPTQModelライブラリに委ねています。GPTQModelはAutoGPTQの後継として開発された、アクティブにメンテナンスされている実装です。
ライブラリの選択
GPTQModel (推奨)
├── AutoGPTQの後継・アクティブメンテナンス
├── https://github.com/ModelCloud/GPTQModel
└── より高速な量子化、低メモリ消費
AutoGPTQ (レガシー・フォールバック)
├── メンテナンス終了
├── https://github.com/AutoGPTQ/AutoGPTQ
└── 既存環境との互換性のため対応
GPTQとAWQの実装比較
両者の実装を比較すると、設計の違いが見えてきます:
AWQの実装:
├── ライブラリ: llm-awq (推奨) / AutoAWQ (レガシー)
├── ビット幅: 4bit固定
├── 主要パラメータ: グループサイズのみ
└── 計算の中心: アクティベーション分析
GPTQの実装:
├── ライブラリ: GPTQModel (推奨) / AutoGPTQ (レガシー)
├── ビット幅: 2/3/4/8bit
├── 主要パラメータ: ビット数、グループサイズ、ダンピング係数
└── 計算の中心: ヘシアン行列と誤差補償
GPTQは設定項目が多い分、細かな調整が可能です。これは強みでもあり、複雑さの源でもあります。
量子化フローの全体像
GPTQQuantizerの処理フローを追ってみましょう:
Step 1: 設定の準備
入力パラメータ:
├── quantization_level: "4bit" など
├── group_size: 128(デフォルト)
├── calibration_data_path: キャリブレーションデータ
└── output_dir: 出力先
↓
ビット数の抽出: "4bit" → 4
Step 2: キャリブレーションデータの読み込み
AWQと同様、GPTQもキャリブレーションデータが必要です。ただし、用途が異なります:
- AWQ: アクティベーションの分布を分析
- GPTQ: ヘシアン行列を計算するための入力
キャリブレーションの役割:
├── 各重みが出力にどう影響するかを計算
├── 感度の高い重みを特定
└── 誤差補償の順序を決定
Step 3: GPTQModelによる量子化
# 概念的な流れ(GPTQModel使用)
from gptqmodel import GPTQModel, QuantizeConfig
quantize_config = QuantizeConfig(
bits=4, # ビット数
group_size=128, # グループサイズ
desc_act=False, # アクティベーション順序
)
model = GPTQModel.load(model_path, quantize_config=quantize_config)
model.quantize(calibration_data) # ここでヘシアン計算と誤差補償
model.save(output_path)
Step 4: 保存
出力ディレクトリ:
model-GPTQ-4bit/
├── config.json # モデル設定
├── quantize_config.json # GPTQ固有の設定
├── tokenizer.json # トークナイザー
├── tokenizer_config.json
├── special_tokens_map.json
└── model.safetensors # 量子化された重み
GPTQ固有の設定パラメータ
GPTQには、AWQにはない固有の設定があります:
quantize_config.jsonの内容
| パラメータ | 説明 | 推奨値 | 影響 |
|---|---|---|---|
| bits | 量子化ビット数 | 4 | 品質とサイズのバランス |
| group_size | グループサイズ | 128 | 外れ値の局所化 |
| damp_percent | ダンピング係数 | 0.01 | 数値安定性 |
| desc_act | アクティベーション順序 | False | 量子化順序の最適化 |
| sym | 対称量子化 | True | 量子化の対称/非対称 |
| true_sequential | 順次処理 | True | レイヤー単位の処理 |
各パラメータの意味
damp_percent(ダンピング係数)
ヘシアン行列の計算で数値的な安定性を確保するためのパラメータです。行列の逆行列を計算するとき、行列が「悪条件」(condition number が大きい)だと計算が不安定になります。ダンピングは、対角成分に小さな値を加えることで、この問題を緩和します。
ダンピングのイメージ:
H → H + λI (λ = damp_percent × tr(H))
λが小さすぎる → 数値不安定
λが大きすぎる → 最適解から離れる
0.01は多くの場合に良いバランス
desc_act(アクティベーション順序)
重みを量子化する順序を、アクティベーションの大きさ順にするかどうか。Trueにすると品質が向上する可能性がありますが、処理時間が増加します。
sym(対称量子化)
Day 3で学んだ対称/非対称量子化の選択です。対称量子化はゼロポイントが不要なため、推論時の計算が効率的です。
出力サイズの推定
GPTQの出力サイズは、AWQより若干大きくなる傾向があります:
推定式:
出力サイズ = 元サイズ × (bits/16) × 1.25
オーバーヘッド(約25%)の内訳:
├── グループごとのスケール値
├── グループごとのゼロポイント(非対称の場合)
├── quantize_config.json
└── その他メタデータ
7Bモデルの場合:
| ビット | 元サイズ | 量子化後 | 実測値(目安) |
|---|---|---|---|
| 2bit | 14GB | 2.2GB | 2.5GB |
| 3bit | 14GB | 3.3GB | 3.8GB |
| 4bit | 14GB | 4.4GB | 5.0GB |
| 8bit | 14GB | 8.8GB | 9.5GB |
フォールバック機構
llm-quantizeは3段階のフォールバック機構を持っています:
1. GPTQModel (推奨)
│
└── 失敗時 → 2. AutoGPTQ (レガシー)
│
└── 失敗時 → 3. 基本構造のみ作成
GPTQModel/AutoGPTQあり:
├── 完全なGPTQ量子化
├── ヘシアンベースの誤差補償
└── 高品質な出力
両方なし:
├── ディレクトリ構造のみ作成
├── config.jsonとquantize_config.json
└── 実際の量子化は行われない(プレースホルダー)
このフォールバックは、テストや開発時に便利ですが、本番環境では必ずGPTQModelをインストールしてください。
GPTQとExLlama v2
GPTQモデルの推論には、ExLlama v2が最も高速です。ExLlamaは、GPTQ形式に特化した推論エンジンで、GPUカーネルが最適化されています。
推論速度の比較(相対値):
├── HuggingFace Transformers: 1.0x(基準)
├── vLLM + GPTQ: 2.5x
└── ExLlama v2: 4.0x
llm-quantizeでGPTQ変換したモデルは、ExLlama v2で直接読み込めます。
Tips: GPTQ量子化を成功させるコツ
1. GPTQModelをインストールする
# 推奨: GPTQModel(アクティブメンテナンス)
pip install gptqmodel
# または AutoGPTQ(レガシー、メンテナンス終了)
pip install auto-gptq
CUDA対応のGPUが必要です。
2. 適切なビット幅を選ぶ
用途別の推奨:
├── 実験・テスト: 2bit(サイズ最小、品質は落ちる)
├── サイズ重視: 3bit(バランス)
├── 一般用途: 4bit(最も広く使われる)
└── 品質重視: 8bit(FP16に近い品質)
3. グループサイズを調整する
# 品質重視(グループサイズ小)
llm-quantize quantize model gptq -q 4bit --group-size 64
# バランス(デフォルト)
llm-quantize quantize model gptq -q 4bit --group-size 128
# 速度重視(グループサイズ大)
llm-quantize quantize model gptq -q 4bit --group-size 256
4. VRAMに注意する
GPTQ量子化は、AWQよりVRAMを多く消費します。ヘシアン行列の計算が追加で必要なためです。
VRAMの目安(量子化時):
├── 7Bモデル: 16GB以上
├── 13Bモデル: 24GB以上
└── 30Bモデル: 40GB以上(A100など)
5. 段階的に試す
# まず8ビットで品質確認
llm-quantize quantize model gptq -q 8bit
# 問題なければ4ビット
llm-quantize quantize model gptq -q 4bit
# さらに小さくしたければ3ビット
llm-quantize quantize model gptq -q 3bit
次回予告
Day 17では「フォーマット変換」として、GGUF/AWQ/GPTQ間の相互変換について解説します。「AWQモデルをGGUFに変換したい」「GPTQモデルをAWQに変換したい」といったニーズに応える機能です。
GPTQの実装は複雑ですが、GPTQModelがその複雑さを吸収してくれます。ライブラリを使うときは、内部の仕組みを理解しつつも、細部の実装は専門家に任せる——これがモダンなソフトウェア開発のスタイルです。