事情本身不复杂,线索都在日志里。把训练好的 adapter 加载到 4bit 量化底模上,报 dtype 不一致或权重形状不匹配,直接加载到半精度底模却正常。

第一反应是「加载顺序错了,先合并再量化」,验证下来不成立。

原因不止一个,得分开看。adapter 是在半精度底模上训练的,量化后层结构不同。另一种情况是量化配置与训练时不一致。

还有一种情况,部分层被替换成量化线性层,名字对不上。

上来先按训练时相同的量化配置加载底模

bnb = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16); base = AutoModelForCausalLM.from_pretrained(path, quantization_config=bnb)

再套上 adapter

model = PeftModel.from_pretrained(base, './adapter')

再往下确认可训练参数已正确挂载

model.print_trainable_parameters()

推理验证输出是否正常

python infer.py --model ./adapter --prompt "你好"

怎么算真的好了,看的是同一批现象。模型加载成功,推理输出与训练结束时一致,显存占用保持在 4bit 水平。

补一句。4bit 底模加 adapter 是常见部署组合,但导出成合并权重前必须先反量化,否则精度会二次损失。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189