数据截至 (上游 commit 5779b17b9a67)
02 · 方法注册表与适配器注入
这一章讲什么:
get_peft_model(model, LoraConfig(...))这一行背后发生的一切——方法怎么注册、入口怎么分流、注入循环怎么按名字找到q_proj并把它换掉。这是 PEFT 对任意模型都适用的原因,也是自己加新方法的必读路径。
1. 它要解决的两个小问题
- 统一入口问题: 库里有 44 种微调方法(
src/peft/tuners/下每个目录一个),用户不该为每种方法学一套 API。 - 零侵入问题: transformers 每星期都在发新模型,PEFT 不可能为每个模型写适配代码。注入必须对模型源码零依赖。
两个问题的答案分别是:一张注册表 和 按模块名匹配的原地替换。
2. 注册表:导入即登记
2.1 名册与注册函数
所有方法的枚举值在 PeftType(src/peft/utils/peft_types.py:19),注册函数是 register_peft_method(src/peft/utils/peft_types.py:128)。它往四张全局表里填条目(表本身是 src/peft/mapping.py:30-33 的空 dict):
| 表 | 键 → 值 |
|---|---|
PEFT_TYPE_TO_CONFIG_MAPPING | peft_type → config 类 |
PEFT_TYPE_TO_TUNER_MAPPING | peft_type → tuner(模型级注入类) |
PEFT_TYPE_TO_PREFIX_MAPPING | peft_type → 参数名前缀(如 lora_) |
PEFT_TYPE_TO_MIXED_MODEL_MAPPING | peft_type → 可混用的 tuner(子集) |
2.2 注册发生在 import 时
每个 tuner 包的 __init__.py 末尾调一次注册。LoRA 的(src/peft/tuners/lora/__init__.py:66):
register_peft_method(name="lora", config_cls=LoraConfig, model_cls=LoraModel, is_mixed_compatible=True)
注册函数本身是严格的前置校验器:名字必须小写、必须先有对应 PeftType 枚举、不允许重名、前缀不许撞车(src/peft/utils/peft_types.py:167-192