先把当时的情况摆出来。给 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 会直接报错,但如果写了正则却匹配到零层,它可能安静地不训练任何参数,所以要养成打印占比的习惯。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。