MTP: `test_generate_with_mtp` skips for every checkpoint but Inkling, and `MtpModel.forward` raises with the default `logits_processor=None`

这个报错发生在 Transformers 的 MTP(Multi-Token Prediction)生成测试中:`test_generate_with_mtp` 会因为正则匹配错误跳过除 Inkling 外的所有模型,同时直接构造 `MtpModel` 时默认 `logits_processor=N

快速结论:这个报错发生在 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_mtpdeepseek_v3glm4_moesolar_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_v3glm4_moemodel\.layers\.61.* 这类模式无法命中;solar_openNone 值直接导致跳过。第二个问题已确认是在 MtpModel.forwardnext_token_scores 只在条件成立时被赋值,而后续代码无条件读取,当 logits_processorfull_input_idsNone 时触发 UnboundLocalError

环境排查

  • 确认 Transformers 版本是否包含 #48007 修复(提交 240b8330):若在此之后可跳过第二个问题排查。
  • 确认当前 main 分支提交是否晚于 0650ff35:测试跳过问题仍然存在。
  • 确认直接构造 MTPCandidateGenerator 时是否显式传入 LogitsProcessorList()(而非默认 None)。
  • 确认模型是否为 deepseek_v3glm4_moesolar_openinkling,以及对应 _keys_to_ignore_on_load_unexpected 的实际值。

解决步骤

  1. 若已更新到包含 #48007 的版本(240b8330 之后),MtpModel.forwardUnboundLocalError 已修复,无需额外处理;若使用旧版本,可优先尝试直接传入 LogitsProcessorList() 绕过此问题。
  2. 对于测试跳过问题,可优先尝试将测试门控中的正则从 re.search(r"layers\.\d+", x) 改为 re.search(r"layers\\?\.\d+", x),以同时匹配转义和未转义的点号格式。
  3. 修改后运行 tests/generation/test_utils.py 中的 test_generate_with_mtp,确认 deepseek_v3glm4_moe 不再被跳过。
  4. 若仍有跳过,检查模型是否在 _keys_to_ignore_on_load_unexpected 中注册了 mtp 相关的模式,例如参考 inkling[r"model\.mtp\..*"]

验证方法

运行 test_generate_with_mtp,确认不再输出 “No MTP keys registered” 且所有预期模型(至少包括 deepseek_v3glm4_moe)均执行测试;直接构造 MTPCandidateGenerator() 并调用 generateforward 时不再抛出 UnboundLocalError

参考来源

huggingface/transformers #48003

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 21280

发表回复

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