关于人工智能:🤗-PEFT-在低资源硬件上对十亿规模模型进行参数高效微调

动机

基于 Transformers 架构的大型语言模型 (LLM),如 GPT、T5 和 BERT,曾经在各种自然语言解决 (NLP) 工作中获得了最先进的后果。此外,还开始涉足其余畛域,例如计算机视觉 (CV) (VIT、Stable Diffusion、LayoutLM) 和音频 (Whisper、XLS-R)。传统的范式是对通用网络规模数据进行大规模预训练,而后对上游工作进行微调。与应用开箱即用的预训练 LLM (例如,零样本推理) 相比,在上游数据集上微调这些预训练 LLM 会带来微小的性能晋升。

然而,随着模型变得越来越大,在生产级硬件上对模型进行全副参数的微调变得不可行。此外,为每个上游工作独立存储和部署微调模型变得十分低廉,因为微调模型与原始预训练模型的大小雷同。参数高效微调(PEFT) 办法旨在解决这两个问题!

PEFT 办法仅微调大量 (额定) 模型参数,同时解冻预训练 LLM 的大部分参数,从而大大降低了计算和存储老本。这也克服了 灾难性忘记 的问题,这是在 LLM 的全参数微调期间察看到的一种景象。 PEFT 办法也显示出在低数据状态下比微调更好,能够更好地泛化到域外场景。它能够利用于各种模态,例如 图像分类 以及 Stable diffusion dreambooth。

PEFT 办法还有助于进步轻便性,其中用户能够应用 PEFT 办法调整模型,以取得与齐全微调的大型检查点相比,大小仅几 MB 的渺小检查点。例如, bigscience/mt0-xxl 占用 40GB 的存储空间,全参数微调将导致每个上游数据集有对应 40GB 检查点。而应用 PEFT 办法,每个上游数据集只占用几 MB 的存储空间,同时实现与全参数微调相当的性能。来自 PEFT 办法的大量训练权重被增加到预训练 LLM 顶层。因而,同一个 LLM 能够通过增加小的权重来用于多个工作,而无需替换整个模型。

简而言之,PEFT 办法使您可能取得与全参数微调相当的性能,同时只有大量可训练参数。

明天,咱们很快乐地介绍 🤗 PEFT 库。它提供了最新的参数高效微调技术,与 🤗 Transformers 和 🤗 Accelerate 无缝集成。这使得可能应用来自 Transformers 的最风行和高性能的模型,以及 Accelerate 的简略性和可扩展性。以下是目前反对的 PEFT 办法,行将推出更多:

  1. LoRA: LORA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
  2. Prefix Tuning: P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and Tasks
  3. Prompt Tuning: The Power of Scale for Parameter-Efficient Prompt Tuning
  4. P-Tuning: GPT Understands, Too

用例

咱们在 GitHub PEFT 库中 摸索了许多乏味的用例。以下列举的是其中最乏味的:

  1. 应用 🤗 PEFT LoRA 在具备 11GB RAM 的生产级硬件上调整 bigscience/T0_3B 模型 (30 亿个参数),例如 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 调整,将后面的示例晋升一个品位: Colab 地址
  3. 在具备 11GB RAM 的生产级硬件上应用 🤗 PEFT 进行稳固的 Diffusion Dreambooth 训练,例如 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 微调 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 包装根底 🤗 Transformer 模型
  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 仓库 上提出问题 🤗。

祝你有一趟高兴的参数高效微调之旅!


英文原文: https://hf.co/blog/peft

作者: Sourab Mangrulkar、Sayak Paul

译者: Ada Cheng

审校、排版: zhongdongy (阿东)

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理