[bug]: Long node chains into an If branch raise RecursionError

当 Iterate 与 If 分支输入之间存在超长普通节点链(约 480 个以上节点)时, GraphExecutionState.next() 会因递归深度超限抛出 RecursionError ;优先检查 InvokeAI 是否为包含 PR #9843 修复的版本。

快速结论:当 Iterate 与 If 分支输入之间存在超长普通节点链(约 480 个以上节点)时,GraphExecutionState.next() 会因递归深度超限抛出 RecursionError;优先检查 InvokeAI 是否为包含 PR #9843 修复的版本。

适用环境:Issue 中确认的是 main 分支 aa46003581(7.0.0-alpha.2-post),且在 #9789 相关代码上同样出现;未提供操作系统、Python、CUDA、显卡等环境信息。

最快修复方案:升级到包含 PR #9843 的 InvokeAI 版本。该 PR 将进入 If 分支的普通依赖遍历改为迭代实现,Issue 中称 1,000 节点回归测试在当时的 main 本地通过。

注意事项:修复针对的是“普通节点链进入 If 分支”的依赖遍历;Issue 未说明其他递归路径是否也受影响,也未给出具体可用的稳定版本号,升级前请确认目标版本已合入 PR #9843。

问题场景

用户在 InvokeAI 中构建包含 Iterate、If 和大量普通测试节点的计算图,节点数量约 400 时可执行,约 480 以上时触发该问题。Issue 中的复现代码创建了一个约 1,000 节点的 AnyTypeTestInvocation 链,接到 If 的 true_input,用于测试分支条件与值传递。

报错原文

RecursionError: maximum recursion depth exceeded

原因分析

根据 Issue 描述,报错位于 graph_if_runtime._get_effective_iteration_paths_for_edge。该函数在推断 If 的 frames 时,每遇到一个未准备的上游节点就递归一次;当进入 If 分支输入的上游节点链很长时,递归调用次数会超过 Python 的递归深度限制。实际会话处理器的调用栈更深,因此线上实际可承受的节点数可能低于测试环境。

环境排查

  • 检查 InvokeAI 是否为 main aa46003581(7.0.0-alpha.2-post)或包含相同代码的版本。
  • 确认是否基于 #9789 相关改动。
  • 统计从 Iterate 到 If 分支输入之间的普通节点数量,重点关注数十到数百节点以上的长链。
  • 检查调用该图的会话处理器栈深度;调用栈更深时可能更早触发。
  • 查询已安装版本是否包含 PR #9843 的修复;Issue 中未提供具体发布版本号。

解决步骤

  1. 将 InvokeAI 更新到已合入 PR #9843 的版本;若使用源码运行,切换到包含该 PR 的 main。
  2. 用 Issue 中的复现脚本或自己的长节点链图重新执行,观察 GraphExecutionState.next() 是否仍抛出 RecursionError。
  3. 若仍需在旧版本上运行,可优先尝试临时缩短 Iterate 到 If 分支输入之间的节点链,或减少长链中的普通节点数量;但这一方案仅基于 Issue 中“400 完成、480 以上失败”的描述,并非修复方案。

验证方法

重新运行长节点链工作流,确认 GraphExecutionState.next() 不再抛出 RecursionError,且 If 分支的 true/false 输入能按预期求值并完成收集。若本地有回归测试,可运行对应 1,000 节点测试,确认通过。

参考来源

invoke-ai/InvokeAI #9821

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 29363

发表回复

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