Create a PEFT Module Guideline
概览
想在自己的仓库里“魔改”PEFT,最常见的套路是:
- Clone 官方
peft
源码 - 在
tuner/
里新建一个模块目录 - 用可编辑安装(
pip install -e
)替换你项目中的 PEFT - 按需写
config.py
、layer.py
、model.py
下面我用 LoRA(低秩适配器)举例,带你一步步梳理如何从零创建一个可复用的 PEFT Module。读不懂的地方我会额外加个小标注👀,帮助你快速上手。
一、准备工作
建仓库、拉源码
1
2
3
4mkdir peft-mogai
cd peft-mogai
git clone https://github.com/huggingface/peft.git
pip install -e ./peft --config-settings editable_mode=compat注:
-e
(editable)模式可以让你改源码后,项目自动生效。搭建模块目录
在peft/peft/tuners/
目录下,创建你自己的文件夹,比如lora_mogai/
:1
2
3
4
5
6peft/peft/tuners/
└── lora_mogai/
├── __init__.py
├── config.py
├── layer.py
└── model.py__init__.py
:导出你的 Config、Layer、Model。
1
2
3
4
5
6# lora_mogai/__init__.py
from .config import MogaiConfig
from .layer import MogaiLayer, Linear
from .model import MogaiModel
__all__ = ["MogaiConfig", "MogaiLayer", "Linear", "MogaiModel"]
二、写配置(config.py)
1 |
|
👀 为什么要继承
PeftConfig
?
它让你的 Config 能和 PEFT 主流程无缝对接,比如自动解析 CLI、序列化存盘等。
三、实现基础 Adapter Layer(layer.py)
核心思路:
- 保存原始层
base_layer
- 动态创建低秩矩阵 A 和 B
- 在
forward
里叠加 delta = B(A(x))
1 |
|
👀 小贴士:
- 把所有 adapter 参数都放到
ModuleDict
里,方便按名字管理;- 初始把 B 置零,可以保证训练初期模型行为和原模型一致。
四、拼装模型(model.py)
在 model.py
中,我们用 MogaiModel
继承自 PEFT 的 BaseTuner
,核心作用是:
- 扫描并替换:在
_create_and_replace
方法里,遍历用户指定的target_modules
,把原始的nn.Linear
或Conv1D
层替换成我们前面写好的lora_mogai.layer.Linear
。 - 动态注册:根据
MogaiConfig
里配置的r
、mogai_alpha
、mogai_dropout
等参数,调用Linear
中的update_layer
方法,初始化或更新对应层的 LoRA 参数。 - 保存/恢复状态:在
_replace_module
里,还会保留被替换层可能携带的.state
(例如缓存、RNN 隐状态等),确保替换后模型行为一致。 - 开关与合并:实现了
set_adapter
、enable_adapter_layers
/disable_adapter_layers
、merge_and_unload
等方法,让你可在训练、推理、部署时灵活地打开、关闭或将 LoRA 增量固化到原模型。
1 |
|
下面这个函数是用来标记哪些参数是可训练的,哪些是不可训练的。这个函数会在 PeftModel
的 __init__
函数中被调用。
1 |
|
运行一个完整示例
下面演示如何直接使用 MogaiModel
进行微调:
1 |
|
Mix Mode
get_peft_model
会返回两种class PeftModel和 PeftMixedModel。需要在call get_peft_model
时指定mixed=True
. 需要在 /src/peft/tuners/mixed/model.py
中把新创建的module加入到Comptaible Tuner中。
1 |
|