🤗 PEFT 库发布,实现对千亿规模模型的参数高效微调
TL;DR
Hugging Face 发布了 🤗 PEFT 库,使得仅使用几兆字节的可训练权重即可对大型语言模型进行参数高效微调(PEFT),从而在消费级 GPU 上对千亿规模模型进行适配成为可能。
动机:为什么 PEFT 很重要
PEFT 方法在冻结大部分预训练模型的同时,仅训练一小部分额外参数。这既降低了计算和存储成本,又避免了灾难性遗忘,并且在数据稀缺的情况下常常优于全模型微调。该方法适用于多种模态(文本、视觉、音频),并使单一基础模型能够通过极小的适配器检查点服务众多下游任务。
支持的 PEFT 技术
🤗 PEFT 库目前实现了四种被广泛引用的方法:
- LoRA – 大型语言模型的低秩适配(Hu 等,2021)。
- Prefix Tuning – P‑Tuning v2,将可学习向量前置到每个 Transformer 层。
- Prompt Tuning – 在任务之间扩展基于提示的适配。
- P‑Tuning – 为 GPT‑style 模型直接优化连续提示。
未来版本计划加入更多方法。
典型使用案例
- 在笔记本 GPU(11 GB RAM)上使用 LoRA 微调 3 B 参数的 T0 模型,配合 🤗 Accelerate 的 DeepSpeed 集成。示例脚本
peft_lora_seq2seq_accelerate_ds_zero3_offload.py可在 Google Colab 上运行。 - 在 Colab 中对 OPT‑6.7B 进行 INT8 LoRA 调优,使用
bitsandbytes库,展示 8‑bit 量化加 PEFT 能够在普通 GPU 内存中运行。 - 在消费级 GPU(RTX 2080 Ti、RTX 3080)上使用 LoRA 进行 Stable Diffusion DreamBooth,并提供一个在 T4(16 GB)实例上运行的公开 Gradio 演示。
这些示例表明,以前需要数十 GB 显存的模型,现在可以在大多数实践者可获得的硬件上进行适配。
快速入门:使用 LoRA 微调 bigscience/mt0-large
from transformers import AutoModelForSeq2SeqLM
from peft import get_peft_model, LoraConfig, TaskType
model_name = "bigscience/mt0-large"
model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
peft_cfg = LoraConfig(
task_type=TaskType.SEQ_2_SEQ_LM,
inference_mode=False,
r=8,
lora_alpha=32,
lora_dropout=0.1,
)
model = get_peft_model(model, peft_cfg)
model.print_trainable_parameters()
# → trainable params: 2,359,296 | all params: 1,231,940,608 | trainable %: 0.19
其余训练循环保持不变。训练完成后,仅保存适配器文件:
model.save_pretrained("output_dir") # creates adapter_config.json + adapter_model.bin (~19 MB)
加载进行推理:
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
from peft import PeftModel, PeftConfig
peft_id = "smangrul/twitter_complaints_bigscience_T0_3B_LORA_SEQ_2_SEQ_LM"
cfg = PeftConfig.from_pretrained(peft_id)
base = AutoModelForSeq2SeqLM.from_pretrained(cfg.base_model_name_or_path)
model = PeftModel.from_pretrained(base, peft_id)
tokenizer = AutoTokenizer.from_pretrained(cfg.base_model_name_or_path)
model.eval().to("cuda")
inputs = tokenizer("Tweet text : @HondaCustSvc ...", return_tensors="pt")
with torch.no_grad():
out = model.generate(inputs["input_ids"].to("cuda"), max_new_tokens=10)
print(tokenizer.decode(out[0], skip_special_tokens=True))
# → "complaint"
适配器检查点仅有几兆字节,却能提供与全模型微调相当的性能。
未来方向
Hugging Face 计划加入更多 PEFT 变体,如 IA³ 和瓶颈适配器。即将推出的使用案例包括在 Colab 中对 whisper-large 进行 INT8 训练,以及将 PEFT 应用于 RLHF 组件(策略模型和排序模型)。欢迎通过 GitHub 仓库贡献社区代码。
结论
🤗 PEFT 通过大幅降低硬件、计算和存储门槛,使千亿规模模型的适配更加民主化,同时保持精度。该库与 🤗 Transformers 和 🤗 Accelerate 的无缝集成,使得在现有流水线中插入 PEFT 并在任务之间共享轻量适配器变得十分简便。