PEFT 文件
量化
並獲得增強的文件體驗
開始使用
量化
量化是用更少的位元位表示資料,它是一種減少記憶體佔用和加速推理的有效技術,尤其是在處理大語言模型(LLM)時。有幾種量化模型的方法,包括:
- 使用 AWQ 演算法最佳化要量化的模型權重
- 使用 GPTQ 演算法獨立量化權重矩陣的每一行
- 使用 bitsandbytes 庫量化到 8 位和 4 位精度
- 使用 AQLM 演算法量化到低至 2 位精度
然而,模型量化後通常不會再為下游任務進行進一步訓練,因為較低精度的權重和啟用值可能導致訓練不穩定。但是,由於 PEFT 方法只增加了*額外*的可訓練引數,這使得您可以在量化模型之上使用 PEFT 介面卡進行訓練!將量化與 PEFT 相結合是單 GPU 上訓練即使是最大型模型的一個好策略。例如,QLoRA 是一種將模型量化到 4 位,然後用 LoRA 進行訓練的方法。這種方法允許您在單個 48GB GPU 上微調一個 65B 引數的模型!
在本指南中,您將瞭解如何將模型量化到 4 位並使用 LoRA 進行訓練。
量化模型
bitsandbytes 是一個與 Transformers 整合的量化庫。透過此整合,您可以將模型量化到 8 位或 4 位,並透過配置 BitsAndBytesConfig
類啟用許多其他選項。例如,您可以:
- 設定
load_in_4bit=True
在載入模型時將其量化到 4 位 - 設定
bnb_4bit_quant_type="nf4"
對從正態分佈初始化的權重使用特殊的 4 位資料型別 - 設定
bnb_4bit_use_double_quant=True
使用巢狀量化方案對已量化的權重再次量化 - 設定
bnb_4bit_compute_dtype=torch.bfloat16
使用 bfloat16 進行更快的計算
import torch
from transformers import BitsAndBytesConfig
config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_use_double_quant=True,
bnb_4bit_compute_dtype=torch.bfloat16,
)
將 config
傳遞給 from_pretrained
方法。
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1", quantization_config=config)
接下來,您應該呼叫 prepare_model_for_kbit_training() 函式來對量化模型進行預處理以進行訓練。
from peft import prepare_model_for_kbit_training
model = prepare_model_for_kbit_training(model)
既然量化模型已經準備就緒,讓我們來設定一個配置。
LoraConfig
使用以下引數(或選擇您自己的引數)建立一個 LoraConfig
from peft import LoraConfig
config = LoraConfig(
r=16,
lora_alpha=8,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
然後使用 get_peft_model() 函式從量化模型和配置中建立一個 PeftModel。
from peft import get_peft_model
model = get_peft_model(model, config)
您現在已經準備好使用任何您喜歡的訓練方法進行訓練了!
LoftQ 初始化
LoftQ 初始化 LoRA 權重以最小化量化誤差,並且可以在訓練量化模型時提高效能。要開始使用,請遵循這些說明。
通常,為了讓 LoftQ 發揮最佳效果,建議用 LoRA 作用於儘可能多的層,因為那些未被作用的層無法應用 LoftQ。這意味著傳遞 `LoraConfig(..., target_modules="all-linear")` 最有可能獲得最佳結果。此外,當使用 4 位量化時,您應該在量化配置中使用 `nf4` 作為量化型別,即 `BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4")`。
QLoRA 風格訓練
QLoRA 向 Transformer 架構中的所有線性層新增可訓練的權重。由於這些線性層的屬性名稱可能因架構而異,請將 `target_modules` 設定為 `"all-linear"` 以將 LoRA 新增到所有線性層。
config = LoraConfig(target_modules="all-linear", ...)
GPTQ 量化
您可以在 GPTQModel 和 Transformers 的 GPTQ 文件中瞭解更多關於基於 GPTQ 的 `[2, 3, 4, 8]` 位量化的資訊。量化後訓練,PEFT 可以同時使用 GPTQModel 或 AutoGPTQ 庫,但我們推薦使用 GPTQModel,因為 AutoGPTQ 將在未來的版本中被棄用。
# gptqmodel install
pip install gptqmodel --no-build-isolation
from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig
model_id = "facebook/opt-125m"
tokenizer = AutoTokenizer.from_pretrained(model_id)
gptq_config = GPTQConfig(bits=4, group_size=128, dataset="wikitext2", tokenizer=tokenizer)
quantized_model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", quantization_config=gptq_config)
# save quantized model
quantized_model.save_pretrained("./opt-125m-gptq")
tokenizer.save_pretrained("./opt-125m-gptq")
一旦量化完成,您就可以使用 PEFT API 對 GPTQ 模型進行後訓練。
AQLM 量化
語言模型加性量化(AQLM)是一種大語言模型壓縮方法。它將多個權重一起量化,並利用它們之間的相互依賴關係。AQLM 將 8-16 個權重組成的組表示為多個向量碼的和。這使得它能夠將模型壓縮到低至 2 位,同時精度損失相當低。
由於 AQLM 量化過程計算成本高昂,建議使用預量化模型。官方 aqlm 倉庫中可以找到部分可用模型的列表。
這些模型支援 LoRA 介面卡調優。要調優量化模型,您需要安裝 `aqlm` 推理庫:`pip install aqlm>=1.0.2`。微調後的 LoRA 介面卡應單獨儲存,因為無法將它們與 AQLM 量化的權重合並。
quantized_model = AutoModelForCausalLM.from_pretrained(
"BlackSamorez/Mixtral-8x7b-AQLM-2Bit-1x16-hf-test-dispatch",
torch_dtype="auto", device_map="auto", low_cpu_mem_usage=True,
)
peft_config = LoraConfig(...)
quantized_model = get_peft_model(quantized_model, peft_config)
您可以參考 Google Colab 示例,瞭解 AQLM+LoRA 微調的概覽。
EETQ 量化
您也可以在 EETQ 量化模型上執行 LoRA 微調。EETQ 包提供了一種簡單高效的方式來執行 8 位量化,據稱其速度比 `LLM.int8()` 演算法更快。首先,請確保您擁有與 EETQ 相容的 transformers 版本(例如,透過從最新的 pypi 或從原始碼安裝)。
import torch
from transformers import EetqConfig
config = EetqConfig("int8")
將 config
傳遞給 from_pretrained
方法。
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-v0.1", quantization_config=config)
並建立一個 `LoraConfig` 並將其傳遞給 `get_peft_model`
from peft import LoraConfig, get_peft_model
config = LoraConfig(
r=16,
lora_alpha=8,
target_modules=["q_proj", "k_proj", "v_proj", "o_proj"],
lora_dropout=0.05,
bias="none",
task_type="CAUSAL_LM"
)
model = get_peft_model(model, config)
HQQ 量化
使用大型機器學習模型半二次量化(HQQ)量化的模型支援 LoRA 介面卡調優。要調優量化模型,您需要安裝 `hqq` 庫:`pip install hqq`。
from hqq.engine.hf import HQQModelForCausalLM
quantized_model = HQQModelForCausalLM.from_quantized(save_dir_or_hfhub, device='cuda')
peft_config = LoraConfig(...)
quantized_model = get_peft_model(quantized_model, peft_config)
或者使用與 HQQ 相容的 transformers 版本(例如,從最新的 pypi 或原始碼安裝)。
from transformers import HqqConfig, AutoModelForCausalLM
quant_config = HqqConfig(nbits=4, group_size=64)
quantized_model = AutoModelForCausalLM.from_pretrained(save_dir_or_hfhub, device_map=device_map, quantization_config=quant_config)
peft_config = LoraConfig(...)
quantized_model = get_peft_model(quantized_model, peft_config)
torchao (PyTorch 架構最佳化)
PEFT 支援使用 torchao(“ao”)進行 int8 量化的模型。
from peft import LoraConfig, get_peft_model
from transformers import AutoModelForCausalLM, TorchAoConfig
model_id = ...
quantization_config = TorchAoConfig(quant_type="int8_weight_only")
base_model = AutoModelForCausalLM.from_pretrained(model_id, quantization_config=quantization_config)
peft_config = LoraConfig(...)
model = get_peft_model(base_model, peft_config)
注意事項:
- 請使用最新版本的 torchao(>= v0.4.0)和 transformers(> 4.42)。
- 目前只支援線性層。
quant_type = "int4_weight_only"
目前不受支援。NF4
尚未在 transformers 中實現,因此也不受支援。- DoRA 目前僅適用於 `quant_type = "int8_weight_only"`。
- 當與 LoRA 一起使用時,torchao 獲得了明確的支援。然而,當 torchao 量化一個層時,它的類不會改變,只有底層張量的型別會改變。因此,除 LoRA 之外的 PEFT 方法通常也適用於 torchao,即使沒有明確支援。但請注意,**合併僅在 LoRA 和 `quant_type = "int8_weight_only"` 的情況下才能正確工作**。如果您使用不同的 PEFT 方法或 dtype,合併很可能會導致錯誤,即使沒有錯誤,結果仍然是不正確的。
INC 量化
英特爾神經壓縮器(INC)為各種裝置啟用模型量化,包括英特爾 Gaudi 加速器(也稱為 HPU 裝置)。您可以在使用 INC 量化的模型上執行 LoRA 微調。要在 PyTorch 模型中使用 INC,請安裝該庫:`pip install neural-compressor[pt]`。可以使用以下單步量化工作流將模型量化為 HPU 裝置的 FP8 精度。
import torch
from neural_compressor.torch.quantization import FP8Config, convert, finalize_calibration, prepare
quant_configs = {
...
}
config = FP8Config(**quant_configs)
將配置傳遞給 `prepare` 方法,執行推理以收集校準統計資訊,然後呼叫 `finalize_calibration` 和 `convert` 方法將模型量化到 FP8 精度。
model = prepare(model, config)
# Run inference to collect calibration statistics
...
# Finalize calibration and convert the model to FP8 precision
finalize_calibration(model)
model = convert(model)
# Load PEFT LoRA adapter as usual
...
一個展示瞭如何將 PEFT LoRA 介面卡載入到 INC 量化的 FLUX 文字到影像模型中以用於 HPU 裝置的示例已提供在此處。
注意事項:
- 目前 INC 量化模型不支援 `merge()` 和 `unmerge()` 方法。
- 目前,在載入 PEFT 介面卡時僅支援 **線性(Linear)** INC 量化層。
其他支援的 PEFT 方法
除了 LoRA,以下 PEFT 方法也支援量化:
- VeRA (支援 bitsandbytes 量化)
- AdaLoRA (同時支援 bitsandbytes 和 GPTQ 量化)
- (IA)³ (支援 bitsandbytes 量化)
後續步驟
如果您有興趣瞭解更多關於量化的資訊,以下內容可能會有幫助:
- 在“透過 bitsandbytes、4 位量化和 QLoRA 使 LLM 更易於訪問”這篇部落格文章中,瞭解有關 QLoRA 的更多細節,並檢視一些關於其影響的基準測試。
- 在 Transformers 的量化指南中閱讀有關不同量化方案的更多資訊。