快速结论:这个报错发生在 Transformers 的 MTP(Multi-Token Prediction)生成测试中:`test_generate_with_mtp` 会因为正则匹配错误跳过除 Inkling 外的所有模型,同时直接构造 `MtpModel` 时默认 `logits_processor=None` 会触发 `UnboundLocalError`。优先排查测试门控正则写法,以及 `MtpModel.forward` 中 `next_token_scores` 的变量绑定问题。
适用环境:Transformers `main` 分支(提交 `c49429ed` 及之后),涉及 `deepseek_v3`、`glm4_moe`、`solar_open`、`inkling` 模型,Python 环境未在 Issue 中额外说明。
最快修复方案:Issue 确认了第二个问题已在 #48007(提交 `240b8330`)中修复,将处理器结果重新赋给 `next_token_logits`,不再使用 `next_token_scores`。对于第一个测试跳过问题,暂无已验证的一步修复方案,可将正则改为 `re.search(r”layers\\?\.\d+”, x)` 以同时匹配转义和未转义的点号。
注意事项:测试正则修复属于推测性建议,实际补丁可能需要结合测试覆盖范围重新评估;`test_generate_with_mtp` 只断言生成过程不抛异常,无法覆盖 #47912 中的 EOS 越界 bug。
问题场景
在 Transformers 主分支上运行 MTP 相关生成测试或直接构造 MTPCandidateGenerator 时触发。第一个问题表现为 test_generate_with_mtp 对 deepseek_v3、glm4_moe、solar_open 全部跳过,只有 inkling 能运行;第二个问题表现为直接实例化 MtpModel 后调用 forward 抛出 UnboundLocalError。
报错原文
MTP: `test_generate_with_mtp` skips for every checkpoint but Inkling, and `MtpModel.forward` raises with the default `logits_processor=None`
# 测试跳过时输出:
"No MTP keys registered"
# 直接构造时抛出:
UnboundLocalError: local variable 'next_token_scores' referenced before assignment
原因分析
第一个问题可能原因是测试门控逻辑中的正则匹配错误:_keys_to_ignore_on_load_unexpected 中的条目是正则表达式,点号被转义为 \.,而测试用 re.search(r"layers\.\d+", x) 匹配字面点号,导致 deepseek_v3 和 glm4_moe 的 model\.layers\.61.* 这类模式无法命中;solar_open 的 None 值直接导致跳过。第二个问题已确认是在 MtpModel.forward 中 next_token_scores 只在条件成立时被赋值,而后续代码无条件读取,当 logits_processor 或 full_input_ids 为 None 时触发 UnboundLocalError。
环境排查
- 确认 Transformers 版本是否包含 #48007 修复(提交
240b8330):若在此之后可跳过第二个问题排查。 - 确认当前 main 分支提交是否晚于
0650ff35:测试跳过问题仍然存在。 - 确认直接构造
MTPCandidateGenerator时是否显式传入LogitsProcessorList()(而非默认None)。 - 确认模型是否为
deepseek_v3、glm4_moe、solar_open或inkling,以及对应_keys_to_ignore_on_load_unexpected的实际值。
解决步骤
- 若已更新到包含 #48007 的版本(
240b8330之后),MtpModel.forward的UnboundLocalError已修复,无需额外处理;若使用旧版本,可优先尝试直接传入LogitsProcessorList()绕过此问题。 - 对于测试跳过问题,可优先尝试将测试门控中的正则从
re.search(r"layers\.\d+", x)改为re.search(r"layers\\?\.\d+", x),以同时匹配转义和未转义的点号格式。 - 修改后运行
tests/generation/test_utils.py中的test_generate_with_mtp,确认deepseek_v3和glm4_moe不再被跳过。 - 若仍有跳过,检查模型是否在
_keys_to_ignore_on_load_unexpected中注册了mtp相关的模式,例如参考inkling的[r"model\.mtp\..*"]。
验证方法
运行 test_generate_with_mtp,确认不再输出 “No MTP keys registered” 且所有预期模型(至少包括 deepseek_v3 和 glm4_moe)均执行测试;直接构造 MTPCandidateGenerator() 并调用 generate 或 forward 时不再抛出 UnboundLocalError。
参考来源
huggingface/transformers #48003
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug][ROCm]: AITER FP8 BMM segfaults with data parallel attention](https://www.chat-gpts.plus/wp-content/uploads/2026/09/51957-868e46e8-768x403.jpg)
