跳到正文
原文
Hugging Face:Blog(RSS)·· 2023-02-10精选AI 评分79

Hugging Face 发布 🤗 PEFT 库,实现大模型参数高效微调

Parameter-Efficient Fine-Tuning using 🤗 PEFT

AI 导读

Hugging Face 发布 🤗 PEFT 库,提供 LoRA、Prefix Tuning、P-Tuning、Prompt Tuning 等参数高效微调方法,与 🤗 Transformers 和 🤗 Accelerate 集成。

推荐理由

官方发布 PEFT 库,给出 LoRA 等方法与消费级硬件微调示例,读者可据此评估低显存微调大模型的可行路径。

正文 · AI 翻译

动机

基于 transformer 架构的大型语言模型(LLM),如 GPT、T5 和 BERT,已在各种自然语言处理(NLP)任务中取得了最先进的结果。它们也开始涉足其他领域,如计算机视觉(CV)(VIT、Stable Diffusion、LayoutLM)和音频(Whisper、XLS-R)。传统范式是在通用的网络规模数据上进行大规模预训练,然后针对下游任务进行微调。与直接使用预训练的 LLM(例如零样本推理)相比,在下游数据集上微调这些预训练的 LLM 会带来巨大的性能提升。

然而,随着模型越来越大,全量微调在消费级硬件上进行训练变得不可行。此外,为每个下游任务独立存储和部署微调后的模型变得非常昂贵,因为微调后的模型与原始预训练模型大小相同。参数高效微调(PEFT)方法旨在解决这两个问题!

PEFT 方法仅微调少量(额外的)模型参数,同时冻结预训练 LLM 的大部分参数,从而大大降低了计算和存储成本。这也克服了灾难性遗忘的问题,这是在 LLM 全量微调过程中观察到的一种行为。PEFT 方法还被证明在低数据场景下优于微调,并且能更好地泛化到域外场景。它可以应用于各种模态,例如图像分类和稳定扩散 dreambooth。

它还有助于可移植性,用户可以使用 PEFT 方法调整模型,获得仅几 MB 的小型检查点,而全量微调的检查点则很大,例如,bigscience/mt0-xxl 占用 40GB 存储空间,全量微调会为每个下游数据集产生 40GB 的检查点,而使用 PEFT 方法,每个下游数据集只需几 MB,同时还能达到与全量微调相当的性能。PEFT 方法训练出的小权重被添加到预训练 LLM 之上。因此,同一个 LLM 可以通过添加小权重用于多个任务,而无需替换整个模型。

简而言之,PEFT 方法使您能够获得与全量微调相当的性能,同时只拥有少量可训练参数。

今天,我们很高兴推出 🤗 PEFT 库,它提供了最新的参数高效微调技术,并与 🤗 Transformers 和 🤗 Accelerate 无缝集成。这使得可以使用 Transformers 中最流行、性能最佳的模型,同时兼具 Accelerate 的简单性和可扩展性。以下是当前支持的 PEFT 方法,更多方法即将推出:

  1. LoRA:LORA:大型语言模型的低秩适应
  2. 前缀微调:P-Tuning v2:提示微调可以在各种规模和任务上普遍与微调相媲美
  3. 提示微调:参数高效提示微调的规模力量
  4. P-Tuning:GPT 也能理解

用例

我们在这里探索了许多有趣的用例。以下是一些最有趣的用例:

  1. 使用 🤗 PEFT LoRA 在消费级硬件上调优 bigscience/T0_3B 模型(30 亿参数),该硬件具有 11GB 内存,例如 Nvidia GeForce RTX 2080 Ti、Nvidia GeForce RTX 3080 等,并使用 🤗 Accelerate 的 DeepSpeed 集成:peft_lora_seq2seq_accelerate_ds_zero3_offload.py。这意味着你可以在 Google Colab 中调优如此大的 LLM。

  2. 在上一示例的基础上更进一步,使用 🤗 PEFT LoRA 和 bitsandbytes 在 Google Colab 中对 OPT-6.7b 模型(67 亿参数)进行 INT8 调优:Open In Colab

  3. 使用 🤗 PEFT 在消费级硬件上进行 Stable Diffusion Dreambooth 训练,该硬件具有 11GB 内存,例如 Nvidia GeForce RTX 2080 Ti、Nvidia GeForce RTX 3080 等。试试 Space 演示,它应该能在 T4 实例(16GB GPU)上无缝运行:smangrul/peft-lora-sd-dreambooth。

peft lora dreambooth gradio space
PEFT LoRA Dreambooth Gradio Space

使用 🤗 PEFT 训练你的模型

让我们考虑使用 LoRA 微调 bigscience/mt0-large 的情况。

  1. 让我们获取必要的导入
  from transformers import AutoModelForSeq2SeqLM
+ from peft import get_peft_model, LoraConfig, TaskType
  model_name_or_path = "bigscience/mt0-large"
  tokenizer_name_or_path = "bigscience/mt0-large"
  1. 创建对应 PEFT 方法的配置
peft_config = LoraConfig(
    task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1
)
  1. 通过调用 get_peft_model 来包装基础 🤗 Transformers 模型
  model = AutoModelForSeq2SeqLM.from_pretrained(model_name_or_path)
+ model = get_peft_model(model, peft_config)
+ model.print_trainable_parameters()
# output: trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282

就是这样!训练循环的其余部分保持不变。请参考示例 peft_lora_seq2seq.ipynb 获取端到端示例。

  1. 当你准备好保存模型用于推理时,只需执行以下操作。
model.save_pretrained("output_dir") 
# model.push_to_hub("my_awesome_peft_model") also works

这只会保存训练过的增量 PEFT 权重。例如,你可以在 twitter_complaints raft 数据集上找到使用 LoRA 调优的 bigscience/T0_3B:smangrul/twitter_complaints_bigscience_T0_3B_LORA_SEQ_2_SEQ_LM。注意它只包含 2 个文件:adapter_config.json 和 adapter_model.bin,后者只有 19MB。

  1. 要加载它用于推理,请遵循下面的代码片段:
  from transformers import AutoModelForSeq2SeqLM
+ from peft import PeftModel, PeftConfig

  peft_model_id = "smangrul/twitter_complaints_bigscience_T0_3B_LORA_SEQ_2_SEQ_LM"
  config = PeftConfig.from_pretrained(peft_model_id)
  model = AutoModelForSeq2SeqLM.from_pretrained(config.base_model_name_or_path)
+ model = PeftModel.from_pretrained(model, peft_model_id)
  tokenizer = AutoTokenizer.from_pretrained(config.base_model_name_or_path)

  model = model.to(device)
  model.eval()
  inputs = tokenizer("Tweet text : @HondaCustSvc Your customer service has been horrible during the recall process. I will never purchase a Honda again. Label :", return_tensors="pt")

  with torch.no_grad():
      outputs = model.generate(input_ids=inputs["input_ids"].to("cuda"), max_new_tokens=10)
      print(tokenizer.batch_decode(outputs.detach().cpu().numpy(), skip_special_tokens=True)[0])
# 'complaint'

下一步

我们发布了 PEFT 作为一种高效的方式,在下游任务和领域上调优大型 LLM,节省大量计算和存储,同时实现与全量微调相当的性能。在接下来的几个月里,我们将探索更多 PEFT 方法,例如 (IA)3 和瓶颈适配器。此外,我们将关注新的用例,例如在 Google Colab 中对 whisper-large 模型进行 INT8 训练,以及使用 PEFT 方法调优 RLHF 组件,如策略和排序器。

与此同时,我们很期待看到行业从业者如何将 PEFT 应用于他们的用例——如果你有任何问题或反馈,请在我们的 GitHub 仓库 上开一个 issue 🤗。

祝参数高效微调愉快!

来源:Hugging Face:Blog(RSS) · huggingface.co