Loading `RTDetrModel` from a detection checkpoint (or `SEWDForCTC` from a SEW-D checkpoint) gives a model with every weight randomly initial

当你用 RTDetrModel 从检测头 checkpoint(或 SEWDForCTC 从 SEW-D checkpoint)加载权重时,如果日志显示 Loading `RTDetrModel` from a detection checkpoint (or `SEWDForCTC` from a

快速结论:当你用 RTDetrModel 从检测头 checkpoint(或 SEWDForCTC 从 SEW-D checkpoint)加载权重时,如果日志显示 Loading `RTDetrModel` from a detection checkpoint (or `SEWDForCTC` from a SEW-D checkpoint) gives a model with every weight randomly initial 伴随 “newly initialized” 警告,说明模型全部权重被随机初始化,没有真正读到预训练参数。优先排查 base_model_prefix 与模型内部属性嵌套是否一致。

适用环境:Issue 已确认:transformers 5.18.0.dev0、Python 3.10.20、PyTorch 2.12.0+cu130(CUDA)、huggingface_hub 1.15.0、safetensors 0.8.0、Accelerate 1.13.0、Linux x86_64、NVIDIA GeForce RTX 3060;复现脚本为 CPU 运行,未使用分布式或并行。

最快修复方案:升级到包含 PR #48744 修复的 transformers 版本。该修复将 rt_detr/rt_detr_v2/pp_doclayout_v2/pp_doclayout_v3base_model_prefix 对齐到实际属性 self.model,并修正 sew-d(含连字符)与 self.sew_d 的不一致;验证结果为 RTDetrModel 加载 PekingU/rtdetr_r18vd 时 0 个 missing keys,SEWDForCTC 加载 asapp/sew-d-tiny-100k 时仅 lm_head.* 缺失。

注意事项:该修复影响 RT-DETR 系列、SEW-D 及相关变体的加载映射;Issue 中提到 clipsegtimesfm、CLIP/MetaCLIP-2 的 …WithProjection 包装器、VideoPrism 视频模型也存在同类前缀不匹配,但 PR #48744 明确验证的是 RT-DETR 与 SEW-D 家族。长期方案是修改 TRF002 规则,要求 base_model_prefix 满足 isidentifier() 并与 head 嵌套基模型的属性名一致。若你所在版本尚未包含该 PR,可优先尝试在加载后手动检查 missing_keys/unexpected_keys,不要仅凭“加载成功”就认为权重已正确载入。

问题场景

用户希望在不带检测头的情况下获取 RT-DETR 的 encoder 特征,因此运行 RTDetrModel 文档字符串示例,从 PekingU/rtdetr_r50vd 加载 base model。模型能跑通、输出 shape 正确,但全部 502 个权重都报 missing 并被重新初始化;AutoModel 行为相同。反过来,用 SEWDForCTC 加载预训练 asapp/sew-d-tiny-100k 也得到随机初始化权重,导致 CTC 微调在无声无息中从零开始。该问题同样出现在基于 RT-DETR 构建的多个模型(rt_detr_v2d_finedeimv2pp_doclayout_v2/v3pp_ocrv5/pp_ocrv6 检测器),以及对 PekingU/rtdetr_v2_r18vdustc-community/dfine-small-coco 使用 AutoModel 时分别丢失 505/505 和 740/740 权重;此外还涉及 clipsegtimesfm、CLIP 与 MetaCLIP-2 的 …WithProjection 包装器以及 VideoPrism 视频模型。

报错原文

Loading `RTDetrModel` from a detection checkpoint (or `SEWDForCTC` from a SEW-D checkpoint) gives a model with every weight randomly initialized

RTDetrModel    <- PekingU/rtdetr_r18vd               missing 502/502 unexpected 526  base_model_prefix='rt_detr'
RTDetrModel    <- PekingU/rtdetr_r18vd               missing 502/502 unexpected 526  base_model_prefix='rt_detr'
SEWDForCTC     <- asapp/sew-d-tiny-100k              missing 222/222 unexpected 220  base_model_prefix='sew-d'
SEWDModel      <- asapp/sew-d-tiny-100k-ft-ls100h    missing 220/220 unexpected 222  base_model_prefix='sew-d'
the head stores the base model under: ['model']

原因分析

根因是 base_model_prefix 与 head 内部实际嵌套 base model 的属性名不一致。检测头把 base model 保存为 self.model,却声明 base_model_prefix = "rt_detr";loader 依靠这个前缀在 base checkpoint 与 head checkpoint 之间添加/剥离名称来对齐权重(core_model_loading.py:1473-1480),当前缀匹配不到任何属性时,键名永远无法对齐,于是所有权重在一侧报 missing、在另一侧报 unexpected。SEW-D 声明 "sew-d",连字符甚至不能作为属性名;而 DETR 声明 "model",因此两个方向都能正确加载。该问题自各模型加入以来一直存在,且不抛异常,只输出通常的 “newly initialized” 警告,因此长期未被发现。

环境排查

  • transformers 版本:Issue 中为 5.18.0.dev0,需确认是否为包含 PR #48744 的版本。
  • Python 版本:Issue 中为 3.10.20。
  • PyTorch 版本:Issue 中为 2.12.0+cu130(CUDA)。
  • huggingface_hub 1.15.0、safetensors 0.8.0、Accelerate 1.13.0。
  • 显卡:NVIDIA GeForce RTX 3060;但复现为 CPU-only。
  • 目标模型与 checkpoint:RTDetrModel/AutoModel 加载 PekingU/rtdetr_r18vdSEWDForCTC 加载 asapp/sew-d-tiny-100kSEWDModel 加载 asapp/sew-d-tiny-100k-ft-ls100h 等。
  • 是否使用分布式或并行:Issue 中为否。

解决步骤

  1. 确认问题是否存在:用 from_pretrained(..., output_loading_info=True) 加载上述 checkpoint,检查 missing_keys 是否几乎等于 len(model.state_dict()),以及 unexpected_keys 数量是否对称。
  2. 检查 type(model).base_model_prefix 的值,并与 head 中嵌套 base model 的实际属性名对比(例如 RTDetrForObjectDetection 下 base model 存放在 model 属性下)。
  3. 升级到包含 PR #48744 的 transformers 版本;该 PR 将 RT-DETR 系列的前缀对齐为实际属性名,并修正 SEW-D 的连字符前缀。
  4. 若暂时无法升级,可优先尝试在加载后检查 missing_keys/unexpected_keys,确认权重是否真的载入;Issue 中未给出用户侧的手动映射补丁步骤。
  5. 若使用 rt_detr_v2pp_doclayout_v2/v3 等同一布局变体,确认所用版本是否包含对应修复;PR #48744 已一并修复这些变体。
  6. 关注 TRF002 规则变更:要求 base_model_prefix 满足 isidentifier() 且与 head 嵌套基模型的属性一致,以防同类问题再次出现。

验证方法

重新运行 Issue 中的复现脚本,观察 output_loading_info=True 返回的 missing_keys/unexpected_keys:修复后 RTDetrModel 加载 PekingU/rtdetr_r18vd 应为 0 个 missing keys;SEWDForCTC 加载 asapp/sew-d-tiny-100k 应仅 lm_head.* 缺失,其余共享权重均被正确载入。同时可检查 test_correct_missing_keys 相关回归测试是否已重新启用并通过。

参考来源

huggingface/transformers #48722

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 23324

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注