Peft 库:LoRA 对网络模型结构的修改
Peft 库对网络结构的修改
PEFT 对模型结构的影响不是“修改”,而是“包裹”和“注入”。它在不改变原始模块内部代码的情况下,动态地在其外部添加新的功能层。我们以最主流的 PEFT 方法 LoRA 为例。
Linear 层的例子:我们构造一个线性层,可以将其打印出来
=
# Linear(in_features=100, out_features=200, bias=True)
接着我们对其应用 LoRA
:
=
=
运行程序会输出类似下面的结果,其中 base_layer
是原来的模型,其余的为 LoRA
额外添加的层
() )
() )
()
() )
)
()
() )
)
)
Peft 库对 require_grad 的修改
Peft 库最核心的工作是调整了所有参数的 require_grad
属性,例如我们创建一个简单的模型:
# --- 准备工作 ---
# 1. 创建一个简单的原始模型
=
# 2. 定义 LoRA 配置
=
# 3. 获取 PEFT 模型
=
# --- 开始检查 requires_grad ---
# 默认情况下,模型的所有参数都应该是可训练的
# PEFT 会冻结大部分参数,只保留 LoRA 部分可训练
# 为了更清晰地展示,我们只筛选出包含 lora 或 base_layer 的参数名
输出如下:
============================================================
)
============================================================
|
|
|
|
============================================================
)
============================================================
|
|
|
|
|
|
|
|
============================================================
|| ||
============================================================