从 4.36 升到 4.45 后加载自己微调的 7B 权重,日志刷出大量 Some weights of the model checkpoint were not used,lm_head 与 embed 的键名对不上,推理输出全是乱码。

真正麻烦的地方在于,几个原因的现象几乎一样。新版改了部分模块的命名空间,键前缀和旧权重不一致;AutoModel 选错了类,与权重的架构不匹配;关了 trust_remote_code 走默认实现,自定义层没有被创建;存量权重是旧版本 save_pretrained 存的,配置里的 arch 已过时。

先列出多出来和缺失的键

python -c "from transformers import AutoModel;m=AutoModel.from_pretrained('out/ckpt');print('loaded')"

再往下放宽不匹配继续加载,看差异有多大

python -c "from transformers import AutoModelForCausalLM;print(AutoModelForCausalLM.from_pretrained('out/ckpt',ignore_mismatched_sizes=True))"

接着核对配置里声明的架构

python -c "import json;print(json.load(open('out/ckpt/config.json'))['architectures'])"

回到与训练一致的版本重新导出

pip install "transformers==4.36.2"

那几天正好在做别的变更,先把时间线对齐才敢动手。

排查用的命令都是临时敲的,没有写成脚本,事后才整理。

恢复的判定其实很直接。日志里不再出现 not used 与 newly initialized,同一段 prompt 的输出与升级前逐字一致,lm_head 权重不是随机值。

出现 newly initialized 说明部分权重被随机初始化,服务能跑但结果是错的,别只看有没有抛异常。拖得越久,排查成本越高,因为现场状态会被后续操作覆盖。

作者 9823189