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 的量化指南中阅读有关不同量化方案的更多信息。