快速结论:该报错出现在 ImageGPTModel 开启 add_cross_attention=True 后走编码器-解码器跨注意力(cross-attention)分支的场景,核心是解码器长度与编码器长度在 non-singleton dimension 3 上不匹配;优先排查 ImageGPTModel 跨注意力路径本身以及传入的 encoder_attention_mask 是否被正确使用。
适用环境:依据 Issue 已确认:transformers 5.18.0.dev0,Linux x86_64(glibc 2.39),Python 3.10.20,PyTorch 2.12.0+cu130,huggingface_hub 1.15.0,safetensors 0.8.0,accelerate 1.13.0,未安装 DeepSpeed;复现脚本本身为纯 CPU、无 checkpoint;显卡为 NVIDIA GeForce RTX 3060(但脚本未使用 GPU)。
最快修复方案:暂无确认的一步修复方案。Issue 中未给出可直接执行的 patch 或版本升级步骤;维护者在讨论中表示“已经修复(We already fixed this iirc)”,但未提供对应 PR/commit 供直接验证。可优先尝试将 transformers 升级到包含该修复的版本或 main 最新提交后重跑复现脚本。
注意事项:维护者明确表示该跨注意力特性属于低优先级,且未来计划弃用 add_cross_attention 配置项,甚至可能删除相关功能,因此即使问题被修复,也不建议在生产中长期依赖 ImageGPT 的跨注意力路径;评论中提到的 GPTBigCode 同类问题不在本 Issue 承诺范围内。
问题场景
用户在运行 ImageGPTModel 并配置 add_cross_attention=True 时,尝试传入 encoder_hidden_states 与 encoder_attention_mask 走跨注意力路径。Issue 指出该路径是从 GPT-2 手动复制而来,但出现了四处问题:跨注意力崩溃、忽略 encoder_attention_mask、缓存被重复计算。对比测试中 GPT-2 在同一套条件下四项均通过,ImageGPT 全部失败。触发点包括默认调用(use_cache 默认 True,与 generate() 行为一致)、use_cache=False 时验证编码器 padding mask 是否生效、加入带 padding 的解码器 attention_mask 的常规批量调用,以及传入 EncoderDecoderCache 后的单步缓存解码。
报错原文
RuntimeError: The size of tensor a (11) must match the size of tensor b (7) at non-singleton dimension 3
原因分析
可能原因:ImageGPTModel 的跨注意力实现存在缺陷,导致解码器张量与编码器张量在注意力头维度(non-singleton dimension 3)上的形状不一致——报错中的 11 对应编码器序列长度(ENC=11),7 对应解码器序列长度(SEQ=7)。Issue 正文将问题归为四类:跨注意力崩溃、忽略 encoder_attention_mask(编码器 padding 未在输出中屏蔽)、缓存被重复计算,以及从 GPT-2 复制时引入的相关代码缺陷(如 is_updated 仅在 EncoderDecoderCache 下绑定、encoder_attention_mask 未传递到 attention_interface、2D unsqueeze 未赋值等)。具体内部成因以 Issue 原文对 modeling_imagegpt.py 的分析为准。
环境排查
- 确认
transformers版本(Issue 为 5.18.0.dev0),并确认是否已包含维护者所说的修复提交。 - 确认 Python 版本(Issue 为 3.10.20)。
- 确认 PyTorch 版本与 CUDA 构建(Issue 为 2.12.0+cu130)。
- 确认
huggingface_hub、safetensors、accelerate版本(Issue 分别为 1.15.0、0.8.0、1.13.0)。 - 确认模型配置中是否设置了
add_cross_attention=True,以及是否传入了encoder_hidden_states与encoder_attention_mask。 - 确认
use_cache取值,以及是否传入了EncoderDecoderCache(不同分支触发的失败点不同)。
解决步骤
- 先用 Issue 提供的最小复现脚本在本地确认问题是否仍然存在,脚本为纯 CPU、无需 checkpoint,可直接运行。
- 对照运行 GPT-2 与 ImageGPT 两部分输出,记录四项测试各自的通过/失败状态,确认失败点与报错是否一致。
- 将
transformers升级到维护者声称已修复的版本或main最新提交。 - 升级后重新执行同一复现脚本,观察第 1 项默认调用、第 2 项编码器 padding mask、第 3 项带解码器 attention mask 调用、第 4 项缓存解码是否全部通过。
- 若升级后仍失败,可在原 Issue 中请求重新打开(维护者表示“feel free to reopen if not”),并附上升级后的版本信息与完整复现输出。
验证方法
重新运行 Issue 中的复现脚本后:第 1 项 ImageGPT 不再抛出 RuntimeError: The size of tensor a (11) must match the size of tensor b (7) at non-singleton dimension 3;第 2 项中“padding ignored”应为 False 且 max|delta| 接近 0,说明编码器 padding mask 被正确使用;第 3 项带解码器 attention_mask 的批量调用不再报错;第 4 项单步缓存解码可正常完成且缓存不被重复计算。全部通过即可认为问题已解决。
参考来源
huggingface/transformers #48693
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。


