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 | |