PEFT概述:最先进的参数效率微调

2023年10月27日 由 camellia 发表 764 0

什么是PEFT


随着GPT-3.5、LLaMA2和PaLM2等大型语言模型的规模不断增大,对它们进行下游自然语言处理(NLP)任务的微调变得越来越昂贵和内存密集。


参数效率微调(PEFT)方法通过仅微调少量额外参数,同时冻结大部分预训练模型,来解决这些问题。这样可以防止大型模型发生灾难性遗忘,并且能够在有限的计算资源下进行微调。


PEFT已经被证明在图像分类和文本生成等任务上是有效的,而且只使用了一小部分参数。微调的小权重可以简单地添加到原始预训练权重中。


你甚至可以使用4位量化和PEFT技术QLoRA在免费版本的Google Colab上微调LLM。


PEFT的模块化性质还允许通过添加小的任务特定权重来对同一预训练模型进行多任务适应,避免了存储完整副本的需要。


PEFT库集成了LoRA、Prefix Tuning、AdaLoRA、Prompt Tuning、MultiTask Prompt Tuning和LoHa等流行的PEFT技术,与Transformers和Accelerate等库进行整合。这提供了对具有高效和可伸缩的微调功能的前沿大型语言模型的便捷访问。


什么是LoRA


在本教程中,我们将使用最流行的参数效率微调(PEFT)技术之一,称为LoRA(大型语言模型的低秩适应)。LoRA是一种可以显著加快大型语言模型微调过程并占用更少内存的技术。


LoRA背后的关键思想是使用两个较小的矩阵通过低秩分解表示权重更新。这些矩阵可以被训练以适应新数据,同时最小化总体修改次数。原始权重矩阵保持不变,不再进行任何其他调整。最终结果是通过将原始权重与适应权重组合得到的。


使用LoRA有几个优点。首先,它通过减少可训练参数的数量大大增强了微调的效率。此外,LoRA与其他各种参数效率方法兼容,并且可以与它们结合使用。使用LoRA进行微调的模型表现与完全微调的模型相当。重要的是,LoRA不会引入任何额外的推理延迟,因为适配器权重可以无缝地与基础模型合并。


使用PEFT的用例


PEFT有许多用例,从语言模型到图像分类器都可以适用。你可以在官方文档中查看所有用例教程。


  1. LLaMa堆栈:使用RLHF训练LLaMA的实践指南
  2. Finetune-opt-bnb-peft
  3. 使用LoRA和Hugging Face进行高效flan-t5-xxl训练
  4. 使用LoRA进行DreamBooth微调
  5. 使用LoRA进行图像分类


使用PEFT训练LLM


在本节中,我们将学习如何使用bitsandbytes和peft库加载和包装我们的Transformer模型。我们还将介绍如何加载保存的经过精细调整的QLoRA模型并进行推理。


入门


首先,我们将安装所有必要的库。

%%capture
%pip install accelerate peft transformers datasets bitsandbytes

然后,我们将导入必要的模块,并将基础模型(Llama-2-7b-chat-hf)命名为使用mlabonne/guanaco-llama2-1k数据集进行微调。

from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import get_peft_model, LoraConfig
import torch


model_name = "NousResearch/Llama-2-7b-chat-hf"
dataset_name = "mlabonne/guanaco-llama2-1k"

PEFT配置


创建PEFT配置,我们将使用它来包装或训练我们的模型。

peft_config = LoraConfig(
lora_alpha=16,
lora_dropout=0.1,
r=64,
bias="none",
task_type="CAUSAL_LM",
)

4位量化


在消费者或Colab GPUs上加载LLM存在重大挑战。然而,我们可以通过使用BitsAndBytes实现4位量化技术和NF4类型配置来克服这个问题。通过采用这种方法,我们可以有效地加载我们的模型,从而节省内存并防止机器崩溃。

compute_dtype = getattr(torch, "float16")

bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=compute_dtype,
bnb_4bit_use_double_quant=False,
)

包装基础Transformer模型


为了使我们的模型参数高效,我们将使用get_peft_model来包装基础的Transformer模型。

model = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=bnb_config,
device_map="auto"
)
model = get_peft_model(model, peft_config)
model.print_trainable_parameters()

我们的可训练参数比基础模型少,因此可以使用更少的内存并更快地微调模型。

trainable params: 33,554,432 || all params: 6,771,970,048 || trainable%: 0.49548996469513035

接下来的步骤是训练模型。您可以按照4位量化和QLoRA指南进行操作。


保存模型


训练后,可以在本地保存模型采用者。

model.save_pretrained("llama-2-7b-chat-guanaco")
或者,将其推到hugging face集线器。
!huggingface-cli login --token $secret_value_0
model.push_to_hub("llama-2-7b-chat-guanaco")
正如我们所看到的,模型采用者只有134MB,而基本的LLaMA 2 7B模型约为13GB。

image.png
加载模型
 
要运行模型推理,我们必须首先使用4位精度量化加载模型,然后将经过训练的 PEFT 权重与基本(LlaMA 2)模型合并。
from transformers import AutoModelForCausalLM
from peft import PeftModel, PeftConfig
import torch

peft_model = "kingabzpro/llama-2-7b-chat-guanaco"
base_model = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=bnb_config,
device_map="auto"
)

model = PeftModel.from_pretrained(base_model, peft_model)
tokenizer = AutoTokenizer.from_pretrained(model_name)

model = model.to("cuda")
model.eval()
推理

为了运行推理,我们必须以guanaco-llama2-1k数据集样式(“<s>[INST] {prompt} [/INST]”)编写提示。否则,你将获得不同语言的回复。
prompt = "What is Hacktoberfest?"
inputs = tokenizer(f"<s>[INST] {prompt} [/INST]", return_tensors="pt")
with torch.no_grad():
outputs = model.generate(
input_ids=inputs["input_ids"].to("cuda"), max_new_tokens=100
)
print(
tokenizer.batch_decode(
outputs.detach().cpu().numpy(), skip_special_tokens=True
)[0]
)
输出似乎很完美。
[INST] What is Hacktoberfest? [/INST] Hacktoberfest is an open-source software development event that takes place in October. It was created by the non-profit organization Open Source Software Institute (OSSI) in 2017. The event aims to encourage people to contribute to open-source projects, with the goal of increasing the number of contributors and improving the quality of open-source software.

During Hacktoberfest, participants are encouraged to contribute to open-source
结论
 

像 LoRA 这样的参数高效微调技术只需使用一小部分参数即可对大型语言模型进行有效的微调。这避免了昂贵的完全微调,并支持使用有限的计算资源进行训练。PEFT的模块化特性允许为多个任务调整模型。4位精度等量化方法可以进一步减少内存使用量。总体而言,PEFT向更广泛的受众开放了大型语言模型功能。
文章来源:https://www.kdnuggets.com/overview-of-peft-stateoftheart-parameterefficient-finetuning
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消