#3755·peft

`modules_to_save` 当名称是 LoRA 子模块的后缀时(例如 "out"、"A")会引发 TypeError

作者: AHSharan创建于 2026年9月16日更新于 2026年9月17日

QQ 系统信息

  • peft:主( " fd570a5f " ),0.21.0

  • 变压器:5.17.0

  • 火炬:2.14.0

  • 加速:1.15.0

  • 齐特莫克:

  • 平台:Linux,仅限CPU

  • 谁能帮忙?

@ 本贾明博桑

  • 复制

[Python] 导入火炬 从火炬导入n 从 peft 导入 LoraConfig, 获取 peft 模型

类 Net(nn.Module): \ nit ( 自己) : 超级 (. ) init () self.lin = nn.Linear(8,8) 互联网档案馆的存檔,存档日期2013-12-02. 自行输出 = nn.Linear(8, 2)

向前( 自, x) : 返回自定义( self.lin (x))

配置 = LoraConfig(r=4,目标 模块=["lin"],模块 to save=["出") 获取 peft 模型( Net (), 配置)

回溯( 最近最后一次通话) : . . . . . . . . 文件"./peft/utils/other.py", 第1118行,以 set trainable 新 “ 模块 ” = 包装器 cls( 目标、 适配器 名称、 ** wrapper kwargs) 文件 "./peft/utils/other.py",第605行,单位为 init super (. ). init (模块 to save,适配器 名称,绑定 模块=tied 模块) 文件 "./peft/utils/ other.py", 第327行, 单位: init 自检查 模块( ) 文件 "./ peft/ utils/ other.py", 第352行, 请检查 模块 提升类型Error( f"{self. error message name ()} 无法应用到类型 {cls name} 的模块中 ) TypeError: 模块 to save 无法被应用到 < class'torch.nn.modules.container.ModuleDict' 类型的模块中.


同样的情况还有:"modules to save= ["A"] (matches `lin.lora A')或"["B" (matches `lin.lora B').

因为...

`src/peft/utils/other.py'将`moules to save'条目与`key.ends with(目标-key)'相匹配。 包装在LORA层被注入后进行,因此此时模型还包含"lin.lora-dropout","lin.lora-A","lin.lora-B"和"lin.lora-dropout".ends with ("out")"是真的. 洛拉地层的“ModuleDict”随后被转给“Modules ToSaveWrapper”,其类型检查提高。

适配器名称相撞案( " lin.lora-A.default " 当适配器被称作 " 默认 " 时)已有一名警卫,负责检查 " 祖父母* " 是否为 " BaseTunerLayer " 。 *父母*是调子层的情况没有覆盖.

预期行为

只有真正的 " 出 " 模块被 " Modules TosaveWrapper " 所包裹;一个PEFT层为自己创造的分模块(`lora-A',`lora-B',`lora-Tropout ' .)绝不应当是`模块-to-save ' 候选人。

建议的固定办法

在`Set trainable'中,跳过父母为`BaseTunerLayer'(`Continue')的比赛。 这使得现有的后缀匹配没有受到任何影响(我看到了#1917,在那里解释这必须保持倒向相容性),只阻止了PEFT匹配自己的内部.

在`测试/测试-初始化.py'中,我在`测试-模块-to-save-targets lora-layer-causes'旁边准备了固定(5行)和准回归测试。 测试在`主要 ' 上失败并随固定装置而通过;`测试/测试-初始化.py'、`测试/测试-其他.py'、`测试/测试-可训练-托肯.py'和`模块-至-save'/`可训练-托肯'测试在`测试/测试-常规-模型.py'中没有变化,而`制造质量'则没有变化。
. . . . . . .

内容来源: huggingface/peft