【自然语言处理】大模型高效微调:PEFT 使用案例

一、PEFT介绍

PEFT(Parameter-Efficient Fine-Tuning,参数高效微调),是一个用于在不微调所有模型参数的情况下,高效地将预训练语言模型(PLM)适应到各种下游应用的库。

PEFT方法仅微调少量(额外的)模型参数,显著降低了计算和存储成本,因为对大规模PLM进行完整微调的代价过高。最近的最先进的PEFT技术实现了与完整微调相当的性能。

代码:

https://github.com/huggingface/peft

文档:

https://huggingface.co/docs/peft/index

二、PEFT 使用

接下来将展示 PEFT 的主要特点,并帮助在消费设备上通常无法访问的情况下训练大型预训练模型。您将了解如何使用LoRA来训练1.2B参数的bigscience/mt0-large模型,以生成分类标签并进行推理。

2.1 PeftConfig

每个 PEFT 方法由一个PeftConfig类来定义,该类存储了用于构建PeftModel的所有重要参数。

由于您将使用LoRA,您需要加载并创建一个LoraConfig类。在LoraConfig中,指定以下参数:

  • task_type,在本例中为序列到序列语言建模
  • inference_mode,是否将模型用于推理
  • r,低秩矩阵的维度
  • lora_alpha,低秩矩阵的缩放因子
  • lora_dropout,LoRA层的dropout概率
from peft import LoraConfig, TaskType

peft_config = LoraConfig(task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1)

有关您可以调整的其他参数的更多详细信息,请参阅LoraConfig参考。

2.2 PeftModel

使用 get_peft_model() 函数可以创建PeftModel。它需要一个基础模型 - 您可以从 Transformers 库加载 - 以及包含配置特定 PEFT 方法的PeftConfig。

首先加载您要微调的基础模型。

from transformers import AutoModelForSeq2SeqLM

model_name_or_path = "bigscience/mt0-large"
tokenizer_name_or_path = "bigscience/mt0-large"
model = AutoModelForSeq2SeqLM.from_pretrained(model_name_or_path)

使用get_peft_model函数将基础模型和peft_config包装起来,以创建PeftModel。要了解您模型中可训练参数的数量,可以使用print_trainable_parameters方法。在这种情况下,您只训练了模型参数的0.19%!

from peft import get_peft_model

model = get_peft_model(model, peft_config)
model.print_trainable_parameters()
# 输出示例: trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282

至此,我们已经完成了!现在您可以使用Transformers的Trainer、 Accelerate,或任何自定义的PyTorch训练循环来训练模型。

2.3 保存和加载模型

在模型训练完成后,您可以使用save_pretrained函数将模型保存到目录中。您还可以使用push_to_hub函数将模型保存到Hub(请确保首先登录您的Hugging Face帐户)。

model.save_pretrained("output_dir")

# 如果要推送到Hub
from huggingface_hub import notebook_login

notebook_login()
model.push_to_hub("my_awesome_peft_model")

这只保存了已经训练的增量PEFT权重,这意味着存储、传输和加载都非常高效。例如,这个在RAFT数据集的twitter_complaints子集上使用LoRA训练的bigscience/T0_3B模型只包含两个文件:adapter_config.json和adapter_model.bin,后者仅有19MB!

使用from_pretrained函数轻松加载模型进行推理:

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)

三、PEFT支持任务

3.1 Models support matrix

3.1.1 Causal Language Modeling

在这里插入图片描述

3.1.2 Conditional Generation

在这里插入图片描述

3.1.3 Sequence Classification

在这里插入图片描述

3.1.4 Token Classification

在这里插入图片描述

3.1.5 Text-to-Image Generation

在这里插入图片描述

3.1.6 Image Classification

在这里插入图片描述

3.1.7 Image to text (Multi-modal models)

在这里插入图片描述

四、PEFT原理

4.1 LoRA

LoRA(Low-Rank Adaptation)是一种技术,通过低秩分解将权重更新表示为两个较小的矩阵(称为更新矩阵),从而加速大型模型的微调,并减少内存消耗。

为了使微调更加高效,LoRA的方法是通过低秩分解,使用两个较小的矩阵(称为更新矩阵)来表示权重更新。这些新矩阵可以通过训练适应新数据,同时保持整体变化的数量较少。原始的权重矩阵保持冻结,不再接收任何进一步的调整。为了产生最终结果,同时使用原始和适应后的权重进行合并。

4.2 Prompt tuning

训练大型预训练语言模型是非常耗时且计算密集的。随着模型尺寸的增长,越来越多的人对更高效的训练方法产生了兴趣,例如提示(Prompting)。提示通过包括描述任务的文本提示或甚至演示任务示例的文本提示来为特定的下游任务准备一个冻结的预训练模型。通过使用提示,您可以避免为每个下游任务完全训练单独的模型,而是使用相同的冻结预训练模型。这更加方便,因为您可以将同一模型用于多个不同的任务,而训练和存储一小组提示参数要比训练所有模型参数要高效得多。

提示方法可以分为两类:

  • 硬提示(Hard Prompts):手工制作的具有离散输入标记的文本提示;缺点是需要花费很多精力来创建一个好的提示。
  • 软提示(Soft Prompts):可与输入嵌入连接并进行优化以适应数据集的可学习张量;缺点是它们不太易读,因为您不是将这些“虚拟标记”与实际单词的嵌入进行匹配。

4.3 IA3

为了使微调更加高效,IA3(通过抑制和放大内部激活来注入适配器)使用学习向量对内部激活进行重新缩放。这些学习向量被注入到典型的基于Transformer架构中的注意力和前馈模块中。这些学习向量是微调过程中唯一可训练的参数,因此原始权重保持冻结。处理学习向量(而不是像LoRA一样对权重矩阵进行学习的低秩更新)可以大大减少可训练参数的数量。

与LoRA类似,IA3具有许多相同的优点:

  • IA3通过大大减少可训练参数的数量使微调更加高效(对于T0模型,IA3模型仅具有约0.01%的可训练参数,而即使是LoRA也有超过0.1%)。
  • 原始的预训练权重保持冻结,这意味着您可以在其之上构建多个轻量级和便携的IA3模型,用于各种下游任务。
  • 使用IA3进行微调的模型性能与完全微调的模型性能相当。
  • IA3不会增加任何推理延迟,因为适配器权重可以与基础模型合并。
<think>好的,用户现在想寻找关于大模型微调的实际案例或教程。我需要先理解他们的需求,可能他们正在学习如何微调大模型,比如Llama 3,想要具体的步骤或示例。首先,我应该回顾系统指令,确保回答符合格式要求,比如行内数学表达式用$...$,独立公式用$$...$$,并且正确引用提供的参考资料。 用户的问题中提到了“微调”、“案例”、“示例”、“教程”,所以需要结合引用中的信息。引用1提到了Llama 3的微调实战案例,包括学习线路、实战案例和视频,这应该作为主要参考。引用3提到微调需要高配置的GPU环境,这点也需要在回答中强调。引用2提供了学习资料,但可能和具体案例关联不大,可以稍微带过。 接下来,我需要组织回答结构,确保分步骤说明。首先介绍微调的基本概念,然后分步骤讲解数据准备、模型加载、微调配置、训练和评估,每个步骤给出具体示例,比如代码片段或配置参数。同时,要引用对应的资料,比如在数据准备部分引用引用1中的实战案例,在硬件要求部分引用引用3。 还要注意生成相关问题,这些问题应该围绕微调的挑战、优化方法、应用场景等展开,帮助用户深入思考。例如,如何选择微调的数据集,或者微调后的模型如何部署。 需要确保回答的中文表达流畅,技术术语准确,并且正确应用LaTeX格式。比如提到损失函数时,使用$L = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i)^2$这样的公式,符合独立公式的格式要求。 最后,检查所有引用是否自然添加在段落末尾,没有遗漏。同时,确保代码块用正确的语法高亮,比如Python示例使用反引号包裹,并注明语言。 现在,把这些整理成一个结构清晰、分步骤的回答,引用相关资料,并生成相关问题,应该能满足用户的需求。</think>根据你的需求,我将从大模型微调的实际案例、核心步骤、资源推荐三个维度为你系统梳理: ### 一、大模型微调实战案例(以Llama 3为例) **步骤1:数据准备** - 需要领域特定的数据集,如医疗问答数据格式: ```python dataset = [ {"instruction": "如何预防感冒?", "input": "", "output": "1.勤洗手...2.保持通风..."}, {"instruction": "解释糖尿病成因", "input": "血糖指标", "output": "胰岛素分泌异常..."} ] ``` 推荐使用HuggingFace数据集库进行格式标准化[^1] **步骤2:模型加载** ```python from transformers import AutoModelForCausalLM, AutoTokenizer model = AutoModelForCausalLM.from_pretrained("meta-llama/Meta-Llama-3-8B") tokenizer = AutoTokenizer.from_pretrained("meta-llama/Meta-Llama-3-8B") ``` **步骤3:微调配置** 采用LoRA高效微调方法: ```python peft_config = LoraConfig( r=8, lora_alpha=32, target_modules=["q_proj", "v_proj"], lora_dropout=0.05, bias="none" ) ``` 训练参数设置:学习率$lr=3e^{-4}$,批量大小$batch=16$,epochs=3 **步骤4:训练与评估** 损失函数采用交叉熵: $$L = -\frac{1}{N} \sum_{i=1}^{N} \sum_{c=1}^{C} y_{i,c} \log(p_{i,c})$$ 评估指标包含BLEU-4和ROUGE-L[^3] ### 二、核心资源推荐 1. **实战教程**:Llama 3微调完整代码示例(含Colab笔记本) 2. **优化技巧**:量化训练、梯度检查点等显存优化方案 3. **行业案例**:客服对话系统微调、法律文书生成等场景实现[^2] ### 三、硬件要求说明 最小配置要求: - GPU显存 ≥24GB(如A10G) - 内存 ≥64GB - 推荐使用AWS p4d.24xlarge实例或Azure NDv2系列
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旅途中的宽~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值