Transformers 文件
GPTQ
並獲得增強的文件體驗
開始使用
GPTQ
GPTQModel 和 AutoGPTQ 實現了 GPTQ 演算法,這是一種訓練後量化技術,其中權重矩陣的每一行都獨立量化,以找到使誤差最小化的權重版本。這些權重被量化為 int4,但在推理過程中會動態恢復為 fp16。這可以將記憶體使用量節省 4 倍,因為 int4 權重在融合核心中進行反量化,而不是在 GPU 的全域性記憶體中。推理速度也更快,因為較低的位寬需要更少的通訊時間。
由於缺乏對新模型和功能的持續支援,AutoGPTQ 未來可能會被棄用。有關更多詳細資訊,請參閱 GPTQModel 部分。
首先安裝 Accelerate、Transformers 和 Optimum。
pip install --upgrade accelerate optimum transformers
然後執行以下命令安裝 GPTQ 庫。
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 = ["auto-gptq is an easy-to-use model quantization library with user-friendly apis, based on GPTQ algorithm."]
gptq_config = GPTQConfig(bits=4, dataset=dataset, tokenizer=tokenizer)
載入要量化的模型,並將 GPTQConfig 傳遞給 from_pretrained()。設定 device_map="auto"
以自動將模型解除安裝到 CPU,以幫助模型適應記憶體,並允許模型模組在 CPU 和 GPU 之間移動以進行量化。
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"))
ExLlama
僅支援 4 位模型,如果您使用 PEFT 微調量化模型,建議停用 ExLlama 核心。
ExLlama 是 Llama 模型的 Python/C++/CUDA 實現,旨在透過 4 位 GPTQ 權重實現更快的推理(檢視這些 基準)。建立 GPTQConfig 物件時,ExLlama 核心預設啟用。
為了進一步提高推理速度,透過配置 GPTQConfig 中的 exllama_config
引數來使用 ExLlamaV2 核心。
import torch
from transformers import AutoModelForCausalLM, GPTQConfig
gptq_config = GPTQConfig(bits=4, exllama_config={"version":2})
model = AutoModelForCausalLM.from_pretrained(
"{your_username}/opt-125m-gptq",
device_map="auto",
quantization_config=gptq_config
)
ExLlama 核心僅在整個模型位於 GPU 上時才受支援。如果您正在 CPU 上使用 AutoGPTQ 0.4.2+ 進行推理,請在 GPTQConfig 中停用 ExLlama 核心。這會覆蓋 config.json
檔案中量化配置中與 ExLlama 核心相關的屬性。
import torch
from transformers import AutoModelForCausalLM, GPTQConfig
gptq_config = GPTQConfig(bits=4, use_exllama=False)
model = AutoModelForCausalLM.from_pretrained(
"{your_username}/opt-125m-gptq",
device_map="cpu",
quantization_config=gptq_config
)
GPTQModel
建議使用 GPTQModel,它最初是 AutoGPTQ 的一個維護分支,因為它後來與 AutoGTPQ 分離並具有一些重要功能。GPTQModel 具有更快的量化速度、更低的記憶體使用量和更準確的預設量化。
GPTQModel 提供非對稱量化,與對稱量化相比,可以潛在地降低量化誤差。它不向後相容 AutoGPTQ,並且並非所有核心(Marlin)都支援非對稱量化。
GPTQModel 還對最新的 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 進行了更新,其他核心也已更新,以包含對舊模型和具有非均勻輸入/輸出特徵的模型的自動填充。
資源
執行 GPTQ 量化與 PEFT notebook 獲取實踐經驗,並閱讀 使用 AutoGPTQ 和 Transformers 使 LLM 更輕量化 以瞭解有關 AutoGPTQ 整合的更多資訊。
< > 在 GitHub 上更新