Transformers 文件

GPTQ

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

GPTQ

GPTQModelAutoGPTQ 實現了 GPTQ 演算法,這是一種訓練後量化技術,其中權重矩陣的每一行都獨立量化,以找到使誤差最小化的權重版本。這些權重被量化為 int4,但在推理過程中會動態恢復為 fp16。這可以將記憶體使用量節省 4 倍,因為 int4 權重在融合核心中進行反量化,而不是在 GPU 的全域性記憶體中。推理速度也更快,因為較低的位寬需要更少的通訊時間。

由於缺乏對新模型和功能的持續支援,AutoGPTQ 未來可能會被棄用。有關更多詳細資訊,請參閱 GPTQModel 部分。

首先安裝 Accelerate、Transformers 和 Optimum。

pip install --upgrade accelerate optimum transformers

然後執行以下命令安裝 GPTQ 庫。

GPTQmodel
AutoGPTQ
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 核心。

ExLlamaLlama 模型的 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 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.