0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

科学と神々株式会社アドベントカレンダー 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がその複雑さを吸収してくれます。ライブラリを使うときは、内部の仕組みを理解しつつも、細部の実装は専門家に任せる——これがモダンなソフトウェア開発のスタイルです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?