Pytorch-Lightning + Peft 实现 LoRA 微调示例
LoRA 思想回顾
LoRA 假设在微调过程中,权重的变化是一个 low-rank 的矩阵,因此其冻结模型原始权重 $W_0$,并在旁边注入两个小的、可训练的 low-rank 矩阵 $A$ 和 $B$ 来模拟权重的更新 $\Delta W$:
$$ W_{tuned}=W_0+\Delta W=W_0+B A $$
其中 $A \in \mathbb{R}^{r \times k}$,$B \in \mathbb{R}^{d \times r}$,其中 $r$ 为指定的权重矩阵的秩。
Pytorch-Lightning + Peft 实现 LoRA
peft
(Parameter-Efficient Fine-Tuning)是 Hugging Face 公司实现的用于高效微调的库。其核心工具是 get_peft_model
函数(95% 情况下够用)。下面以一个最简单的例子说明如何使用 peft
库实现 LoRA。
Step 1. 准备一个 Pytorch 模型:peft
的 get_peft_model
函数是作用于一个现有的模型,因此我们需要先实现一个最简化的模型
# 1. 创建一个极其简单的 PyTorch 模型
# 它包含两个线性层,就是一个普通的神经网络
=
# 看看模型有多少参数
=
# 原始模型总参数量: 35,594
Step 2. 定义 LoRA 配置并应用:我们需要定义一个 LoraConfig
对象,并且包含 LoRA
的配置信息。其中 target_modules
是一个字符串的列表,该 LoRA
配置会作用于任何 name
中包含这些字符串的层。
# 2. 定义 LoRA 配置
=
# 3. 使用 get_peft_model 将 LoRA 应用到原始模型上
=
# 关键时刻:打印可训练参数!
# trainable params: 3,120 || all params: 38,714 || trainable%: 8.0591
Step 3. 像平常一样训练模型:peft
库最强大的地方是其只对模型进行了修改,训练流程完全不变
# 4. 创建一个简单的优化器和虚拟数据
=
=
# 创建一些假数据来模拟训练
= # 16个样本,每个样本128维
= # 16个标签,0-9之间
# 把模型设置为训练模式
# 前向传播
=
# 计算损失
=
# 反向传播和优化
# PyTorch 会自动只计算和更新可训练参数的梯度