快速结论:该报错发生在运行 SAM-HQ 模型集成测试时,由于权重加载 bug 导致 `positional_embedding` 被随机初始化,造成测试结果不稳定。优先排查 `_keys_to_ignore_on_load_missing` 是否被错误保留在模型配置中。
问题场景
用户在 Hugging Face Transformers 库中运行 SAM-HQ 模型的集成测试(非单元测试)时触发问题。测试命令为 pytest tests/models/sam_hq/test_modeling_sam_hq.py::SamHQModelIntegrationTest,预期所有 CUDA 测试通过,实际结果为 11 失败、3 通过。
报错原文
tests/models/sam_hq/test_modeling_sam_hq.py::SamHQModelIntegrationTest may fail since a lot of cases are lack of set_seed()
pytest tests/models/sam_hq/test_modeling_sam_hq.py::SamHQModelIntegrationTest
actual: 11 failed, 3 passed
原因分析
可能有两个层面的原因:
- 表面原因:`positional_embedding` 在模型加载时使用
torch.randn()随机初始化,且被添加到_keys_to_ignore_on_load_missing列表中,导致每次测试的输出结果不一致(flaky)。 - 根本原因(已确认):提交
0b369802cf移除了_tied_weights_keys(正确操作),但错误地保留了_keys_to_ignore_on_load_missing,导致prompt_encoder.shared_embedding.positional_embedding无法从 checkpoint 加载,而是每次随机初始化。
此问题也可能会影响 tests/models/sam/test_modeling_sam.py 中的类似测试。
环境排查
- 确认 Transformers 版本为 latest main 分支(即包含提交
0b369802cf的版本) - 确认测试运行时是否使用了 CUDA 设备(GPU)
- 检查模型配置文件中的
_keys_to_ignore_on_load_missing是否包含prompt_encoder.shared_embedding.positional_embedding
解决步骤
- 首选方案(已由 PR #43463 修复):从模型配置中移除
_keys_to_ignore_on_load_missing,确保positional_embedding能够从 checkpoint 正常加载,而非随机初始化。这是正确的修复方式——从 checkpoint 加载权重,而非用set_seed()掩盖随机初始化问题。 - 临时方案(PR #43211 的中间尝试):在测试类的
setUp()方法中添加set_seed(0),强制每次测试使用相同的随机种子。该方案符合 KISS 和 DRY 原则,仅需 8 行代码变更,但未被采用为最终修复。 - 如果遇到类似问题但无法立即更新 Transformers 版本,可先尝试方案 2 作为临时工作区。
验证方法
- 更新 Transformers 到包含 PR #43463 或 #43420 修复的版本。
- 重新运行测试命令:
pytest tests/models/sam_hq/test_modeling_sam_hq.py::SamHQModelIntegrationTest - 确认所有测试通过,输出无随机性波动(即使多次运行结果也应一致)。
- 可选:验证 SAM(非 HQ)模型的类似测试
tests/models/sam/test_modeling_sam.py是否也通过。
参考来源
huggingface/transformers #42890
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


