GPTQ
GPT-QModel プロジェクト(Python パッケージ gptqmodel)は、GPTQ アルゴリズムを実装しています。GPTQ は、重み行列の各行を独立に量子化することで、誤差を最小化する重みのバージョンを探索する、学習後の量子化手法です。これらの重みは int4 に量子化されますが、推論時にはオンザフライで fp16 に復元されます。int4 重みは GPU のグローバルメモリではなく、融合カーネル内でデクォンタイズされるため、メモリ使用量を 4 分の 1 に削減できます。また、低いビット幅は通信に要する時間が短くなるため、推論も高速になります。
AutoGPTQ は Transformers ではサポートされていません。代わりに GPT-QModel をインストールしてください。
まず、Accelerate、Transformers、Optimum をインストールしてください。
pip install --upgrade accelerate optimum transformers
次に、以下のコマンドを実行してGPT-QModelをインストールします。
pip install gptqmodel --no-build-isolation
GPTQConfig クラスを作成し、量子化ビット数、量子化の重みキャリブレーションに使用するデータセット、およびデータセットの準備に使用するトークナイザーを設定します。
from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig
tokenizer = AutoTokenizer.from_pretrained("facebook/opt-125m")
gptq_config = GPTQConfig(bits=4, dataset="c4", tokenizer=tokenizer)文字列のリストとして独自のデータセットを渡すことは可能ですが、GPTQ論文で使用された同じデータセットを使用することを強く推奨します。
dataset = ["gptqmodel is an easy-to-use model quantization library with user-friendly apis, based on the GPTQ algorithm."]
gptq_config = GPTQConfig(bits=4, dataset=dataset, tokenizer=tokenizer)Load a model to quantize and pass GPTQConfig to from_pretrained(). Set device_map="auto" to automatically offload the model to a CPU to help fit the model in memory, and allow the model modules to be moved between the CPU and GPU for quantization.
quantized_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m", device_map="auto", quantization_config=gptq_config)データセットが大きすぎてメモリ不足に陥っている場合(ディスクオフロードはサポートされていません)、max_memory パラメータを渡して、デバイス(GPU と CPU)で使用するメモリ量を割り当ててください。
quantized_model = AutoModelForCausalLM.from_pretrained(
"facebook/opt-125m",
device_map="auto",
max_memory={0: "30GiB", 1: "46GiB", "cpu": "30GiB"},
quantization_config=gptq_config
)ハードウェアによって、モデルをゼロから量子化するには時間がかかる場合があります。無料プランの Google Colab GPU では、facebook/opt-350m モデルの量子化に約 5 分かかりますが、NVIDIA A100 では 175B パラメータのモデルの量子化に約 4 時間かかります。モデルを量子化する前に、Hub でそのモデルの GPTQ 量子化版がすでに存在しないか確認することをお勧めします。
モデルが量子化されると、push_to_hub() を使用してモデルとトークナイザーを Hub にプッシュし、簡単に共有・アクセスできるようにできます。これにより、GPTQConfig も保存されます。
quantized_model.push_to_hub("opt-125m-gptq")
tokenizer.push_to_hub("opt-125m-gptq")save_pretrained() は、量子化されたモデルをローカルに保存します。モデルが device_map パラメータで量子化された場合、保存する前にモデル全体を GPU または CPU に移動してください。以下の例では、モデルを CPU に保存しています。
quantized_model.save_pretrained("opt-125m-gptq")
tokenizer.save_pretrained("opt-125m-gptq")
# if quantized with device_map set
quantized_model.to("cpu")
quantized_model.save_pretrained("opt-125m-gptq")from_pretrained()で量子化モデルを読み込み、device_map="auto"を設定することで、モデルをすべての利用可能なGPUに自動で分散配置し、必要なメモリ量を超えずにモデルをより高速に読み込むことができます。
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("{your_username}/opt-125m-gptq", device_map="auto")Marlin
Marlinは、4ビット専用のCUDA GPTQカーネルであり、NVIDIA A100 GPU(Ampere)アーキテクチャ向けに高度に最適化されています。モデルの読み込み、デクアンタイゼーション、およびデクアンタイズ後の重みの実行は高度に並列化されており、元のCUDA GPTQカーネルと比較して推論性能を大幅に向上させます。Marlinは量子化済み推論でのみ利用可能であり、モデルの量子化はサポートされていません。
Marlin推論は、GPTQConfigのbackendパラメータを指定することで有効にできます。
from transformers import AutoModelForCausalLM, GPTQConfig
model = AutoModelForCausalLM.from_pretrained("{your_username}/opt-125m-gptq", device_map="auto", quantization_config=GPTQConfig(bits=4, backend="marlin"))GPT-QModel
GPT-QModelは、TransformersにおけるGPTQのアクティブにメンテナンスされているバックエンドです。当初はAutoGPTQからフォークされましたが、その後、より高速な量子化、メモリ使用量の低減、より正確なデフォルト設定といった大幅な改善を加え、分岐しています。
GPT-QModel は非対称量子化を提供します。これにより、対称量子化と比較して量子化誤差を低減できる可能性があります。ただし、従来の AutoGPTQ チェックポイントとは後方互換性がなく、またすべてのカーネル(Marlin)が非対称量子化をサポートしているわけではありません。
GPT-QModelは、最新のLLMモデル、マルチモーダルモデル(Qwen2-VLおよびOvis1.6-VL)、プラットフォーム(Linux、macOS、Windows 11)、ハードウェア(AMD ROCm、Apple Silicon、Intel/AMD CPU、Intel Datacenter Max/Arc GPUなど)についても、より広範なサポートを提供しています。
Marlin カーネルは A100 GPU 向けに更新されており、その他のカーネルは、レガシーモデルおよび入出力特徴量が均一でないモデルに対応するため、自動パディングを含むよう更新されています。
リソース
PEFTのノートブックでGPTQ量子化を実行し、実際に手を動かして体験してください。
Update on GitHub