Optimum 文件
量化
並獲得增強的文件體驗
開始使用
量化
AutoGPTQ 整合
🤗 Optimum 與 AutoGPTQ 庫 合作,提供了一個簡單的 API,可對語言模型應用 GPTQ 量化。透過 GPTQ 量化,您可以將自己喜歡的語言模型量化到 8、4、3 甚至 2 位。這不會導致效能大幅下降,並且推理速度更快。大多數 GPU 硬體都支援此功能。
如果您想使用 GPTQ 量化 🤗 Transformers 模型,請參閱此文件。
要了解有關 GPTQ 中使用的量化技術的更多資訊,請參閱
請注意,AutoGPTQ 庫提供了更多高階用法(triton 後端、融合注意力、融合 MLP),這些用法尚未與 Optimum 整合。目前,我們只利用了 GPTQ 的 CUDA 核心。
要求
您需要安裝以下要求才能執行以下程式碼
AutoGPTQ 庫:`pip install auto-gptq`
Optimum 庫:`pip install --upgrade optimum`
從原始碼安裝最新的 `transformers` 庫:`pip install --upgrade git+https://github.com/huggingface/transformers.git`
安裝最新的 `accelerate` 庫:`pip install --upgrade accelerate`
載入和量化模型
`GPTQQuantizer` 類用於量化您的模型。為了量化您的模型,您需要提供一些引數
- 位數:`bits`
- 用於校準量化的資料集:`dataset`
- 用於處理資料集的模型序列長度:`model_seqlen`
- 要量化的塊名稱:`block_name_to_quantize`
透過 🤗 Transformers 整合,您無需傳遞 `block_name_to_quantize` 和 `model_seqlen`,因為我們可以檢索它們。但是,對於自定義模型,您需要指定它們。另外,請確保您的模型在量化之前已轉換為 `torch.float16`。
from transformers import AutoModelForCausalLM, AutoTokenizer
from optimum.gptq import GPTQQuantizer, load_quantized_model
import torch
model_name = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16)
quantizer = GPTQQuantizer(bits=4, dataset="c4", block_name_to_quantize = "model.decoder.layers", model_seqlen = 2048)
quantized_model = quantizer.quantize_model(model, tokenizer)
儲存模型
要儲存您的模型,請使用 `GPTQQuantizer` 類的儲存方法。它將建立一個資料夾,其中包含您的模型狀態字典和量化配置。
save_folder = "/path/to/save_folder/"
quantizer.save(model,save_folder)
載入量化權重
您可以使用 `load_quantized_model()` 函式載入量化權重。透過 Accelerate 庫,可以更快地載入模型並降低記憶體使用。模型需要使用空權重進行初始化,然後作為下一步載入權重。
from accelerate import init_empty_weights
with init_empty_weights():
empty_model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16)
empty_model.tie_weights()
quantized_model = load_quantized_model(empty_model, save_folder=save_folder, device_map="auto")
Exllama 核心,實現更快推理
隨著 exllamav2 核心的釋出,與 exllama 核心相比,4 位模型的推理速度更快。它預設啟用:`load_quantized_model()` 中的 `disable_exllamav2=False`。要使用這些核心,您需要將整個模型放在 GPU 上。
from optimum.gptq import GPTQQuantizer, load_quantized_model
import torch
from accelerate import init_empty_weights
with init_empty_weights():
empty_model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16)
empty_model.tie_weights()
quantized_model = load_quantized_model(empty_model, save_folder=save_folder, device_map="auto")
如果您希望使用 exllama 核心,則需要透過設定 `exllama_config` 來更改版本
from optimum.gptq import GPTQQuantizer, load_quantized_model
import torch
from accelerate import init_empty_weights
with init_empty_weights():
empty_model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16)
empty_model.tie_weights()
quantized_model = load_quantized_model(empty_model, save_folder=save_folder, device_map="auto", exllama_config = {"version":1})
請注意,目前 exllama/exllamav2 核心僅支援 4 位模型。此外,建議在您使用 peft 微調模型時停用 exllama/exllamav2 核心。
您可以在此處找到這些核心的基準測試
微調量化模型
在 Hugging Face 生態系統中,透過官方支援介面卡,您可以微調已使用 GPTQ 量化的模型。有關更多詳細資訊,請參閱 `peft` 庫。
< > 在 GitHub 上更新