[bug]: Qwen-Image Edit reference-image tokens get 1-D positions under transformers 5

该报错出现在 InvokeAI 的 Qwen-Image Edit 模式、使用 transformers 5.x 调用 Qwen2.5-VL 文本编码器时:编码器只传了 input_ids、attention_mask、pixel_values 和 image_grid_thw,没有传 mm_tok

快速结论:该报错出现在 InvokeAI 的 Qwen-Image Edit 模式、使用 transformers 5.x 调用 Qwen2.5-VL 文本编码器时:编码器只传了 input_ids、attention_mask、pixel_values 和 image_grid_thw,没有传 mm_token_type_ids,导致参考图 token 回退为 1-D 文本位置而非 3-D(mRoPE)位置。优先排查编码器是否把 processor 返回的 mm_token_type_ids 继续传给模型。

适用环境:InvokeAI main 分支(提交 ea1056bd81);transformers 5.10.4;Qwen-Image Edit 模式配合 Qwen2.5-VL 编码器。Issue 未明确给出操作系统、Python、CUDA、显卡信息。

最快修复方案:暂无确认的一步修复方案。Issue 中提出的方案(可优先尝试):在 QwenImageTextEncoderInvocation._run_encoder() 中把 processor 输出的 mm_token_type_ids 一并转发给 Qwen2_5_VLForConditionalGeneration,并用 getattr(..., None) 兼容不提供该字段的输入或 processor 版本;该方案目前只在提交者的个人 fork 分支上验证,尚未合并。

注意事项:该改动会改变 Edit 模式下的编码器隐状态,从而影响出图结果,建议固定随机种子对比修改前后的效果。现有 diffusers 的 Qwen-Image Edit pipeline 同样没有传该字段,InvokeAI 当前行为与 diffusers 一致;这是 transformers 5 升级带来的行为变化,尚未有官方确认的回归结论。纯文生图路径不受影响,因为没有视觉 grid 时不会进入多模态位置计算分支。

问题场景

在 InvokeAI 中使用 Qwen-Image Edit 模式,并附带一张参考图编码提示词时触发。具体位置是 invokeai/app/invocations/text_encoder/qwen_image_text_encoder.py 的 _run_encoder:它把 input_ids、attention_mask、pixel_values、image_grid_thw 传给 Qwen2.5-VL,但没有传 mm_token_type_ids。

报错原文

[bug]: Qwen-Image Edit reference-image tokens get 1-D positions under transformers 5

原因分析

可能原因(Issue 中已给出复现证据):在 transformers 5.x 中,Qwen2_5_VLModel 只有在同时拿到 mm_token_type_ids 和视觉 grid 时,才会为图像 token 构建 3-D(mRoPE)位置编码;缺少该字段时回退为 1-D 文本位置。而 Qwen2.5-VL 的 processor 默认会返回该字段(return_mm_token_type_ids: True),编码器没有把它继续传递。证据包括:在微型随机 Qwen2.5-VL 上,传入 mm_token_type_ids 后编码器输出最大差异达 0.033;transformers 4.x 下位置是从 input_ids 中的图像 token 计算的,推测这才是 Qwen-Image Edit 训练时的行为。MiniMax H3 已经构建并传递了该字段(invokeai/backend/minimax_h3/text_conditioning.py:97),可作为参照。

环境排查

  • 确认 InvokeAI 版本/提交是否为 main @ ea1056bd81 或包含该编码器实现的分支。
  • 确认 transformers 版本是否为 5.x(Issue 中为 5.10.4),并与 4.x 行为做对照。
  • 确认使用的模型是 Qwen-Image Edit + Qwen2.5-VL 编码器,且提示词带参考图。
  • 检查 processing 输出中是否包含 mm_token_type_ids,以及 _run_encoder 是否将其传给模型。
  • Issue 未提供操作系统、Python、CUDA、显卡信息,这些项目无需作为排查前提。

解决步骤

  1. 按 Issue 的复现方法确认现象:用一张参考图编码 Edit 提示词,分别在当前节点实现和传入 mm_token_type_ids=model_inputs.mm_token_type_ids 的情况下编码,对比 _EDIT_DROP_IDX 之后的隐藏状态。
  2. 若确认存在差异,可优先尝试参考提交者的修复思路:在 _run_encoder() 中将 processor 输出的 mm_token_type_ids 转发给 Qwen2_5_VLForConditionalGeneration。
  3. 使用 getattr(model_inputs, "mm_token_type_ids", None) 读取该字段,保证在不提供该字段的输入或旧版 processor 下仍可运行。
  4. 不要改动纯文本生成路径:没有视觉 grid 时 transformers 不会进入多模态位置计算分支。
  5. 补充一个基于微型 Qwen2.5-VL 的 CPU 回归测试(而非 mock forward):构造 4 个图像 token、image grid 为 [1, 4, 4] 且视觉 patch 输入匹配的批次,检查 rotary embedding 实际位置——传入时应得到时间、高、宽三个不同坐标,不传时三个轴为同一个 1-D 序列。
  6. 在固定随机种子下对比 Edit 出图结果,评估该修复对出图的影响。

验证方法

回归测试应在旧实现下失败、在应用修复后通过;同时确认显式传入 mm_token_type_ids 时图像 token 获得时间/高/宽三个维度各自不同的位置坐标,不传时退化为单一 1-D 序列。另可在固定种子下对比修复前后的 Edit 出图,确认条件编码变化符合预期。提交者还提到 Ruff 检查、格式检查和 diff 校验均通过,可作为合并前的附加验证。

参考来源

invoke-ai/InvokeAI #9983

提交者 fork 分支:fix/9983-qwen-edit-mm-token-types(未合并,仅供参考)

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 31625

发表回复

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