先把当时的情况摆出来。给 ChatGLM 加 LoRA 时报 ValueError: Target modules [‘q_proj’,’v_proj’] not found in base model,同样的配置在 LLaMA 上却能正常训练。

真正麻烦的地方在于,几个原因的现象几乎一样。不同模型的注意力层命名不同,ChatGLM 用 query_key_value。少数情况下是模型被包了一层,实际层名前多了 base_model 前缀。

另外,target_modules 写成正则但没开启正则匹配。少数情况下是多模态模型里语言塔和视觉塔命名不一致。

先打印全部模块名,筛出线性层

python -c "import torch;[print(n) for n,_ in model.named_modules() if isinstance(_,torch.nn.Linear)][:20]"

接着按真实层名改配置

cfg = LoraConfig(r=8, lora_alpha=16, target_modules=['query_key_value'], task_type='CAUSAL_LM')

需要模糊匹配时显式使用正则

cfg = LoraConfig(target_modules=r'.*q_proj|.*v_proj', task_type='CAUSAL_LM')

训练前打印一次可训练参数占比

print(trainable_ratio)

恢复的判定其实很直接。训练启动后日志显示可训练参数占比在百分之一到三之间,loss 正常下降,不再出现模块找不到的报错。

这里还有个坑。层名对不上时 PEFT 会直接报错,但如果写了正则却匹配到零层,它可能安静地不训练任何参数,所以要养成打印占比的习惯。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189