描述bug
提示流似乎修改了全局工作目录,并且在执行过程中的流程池中的工作节点可以获得不同的工作目录。
如何重现bug
我在这里创建了一个示例项目来重现bug: https://github.com/bhanson-techempower/promptflow-concurrency-bug
有些运行会成功,而其他一些随机失败,错误信息为:
流程路径 .../promptflow-concurrency-bug/sub_flow2/sub_flow3 不存在。
由于特定节点的工作目录已经被更改后,该节点的worker被生成。
使用示例项目,我几乎每次都能重现这个bug。
在我们的生产应用中,当我们运行一批20个运行时,我们大约看到了一半的时间。
预期行为
每次流程都成功执行,因为prompt flow在进程之间不共享额外的全局状态。
运行信息:
- 使用
pf -v
版本的Promptflow包:
{
"promptflow": "1.12.0",
"promptflow-core": "1.12.0",
"promptflow-devkit": "1.12.0",
"promptflow-tracing": "1.12.0"
}
Executable '.../promptflow-concurrency-bug/venv/bin/python'
Python (Darwin) 3.11.3 (main, May 25 2023, 12:42:30) [Clang 11.1.0 ]
- 操作系统:macOS Sonoma 14.5
附加上下文 - References of _change_working_dir
- References of getcwd
- 这个评论也显得很可疑
我们通过修改调用子流程的方式解决了这个问题:
from pathlib import Path
flow_path = Path(__file__).parent / "sub_flow1"
flow = load_flow(flow_path)
2条答案
按热度按时间dffbzjpn1#
同样不确定是否应该打开另一个问题,但示例项目还显示了跟踪查看器中的一个错误。当我打开控制台中提供的链接时,只有出错的案例会出现。这对我来说每次都发生在那个项目上,尽管我还没有在我们的实际应用程序中注意到它。
这里应该有10行:
我们已经注意到跟踪查看器中的其他微妙错误。有时表格格式中显示的信息与点击它时的底层案例不匹配。相同的运行行可能会重复几次,然后我们需要点击每一行来找到我们正在寻找的实际案例。
我的怀疑是这两个问题都与其他并发问题有关,而不是跟踪查看器本身的问题。
8i9zcol22#
你好 @bhanson-techempower ,感谢联系我们并提供详细重现功能。我们已经调查了这个问题,我将对此进行更多解释。
首先得出结论
根本原因
1.当运行流程时,promptflow会将工作目录更改为流程目录,以确保流程可以成功运行并具有正确的导入。
1.没有依赖关系的节点会并发执行。
1.在你的流程中,这3个节点之间没有相互依赖,因此它们在一个进程中并发执行,导致在执行到
load_flow
行时出现问题,因为由于工作目录的更改而导致流程路径被错误地解析,从而相互影响。关于解决方法的详细说明
1.将'load_flow'从@tool函数中移除--在导入文件时加载流程,此时工作目录不会改变,因此流程可以成功加载。
1.使用绝对路径--使用绝对路径加载流程可以很好地工作,因为工作目录不再会影响路径。
1.将并发数设置为1--当并发数为1时,工作目录会逐步正确地更改和还原,因此使用正确的工作目录加载流程可以成功工作。
要解决此问题
要完全解决此问题,我们需要使每个节点独立运行,例如在单独的进程中运行。恐怕这将是一项长期的工作,我已经添加了“长期”标签,我们将为此问题保持开放状态,任何遇到相同问题的人都可以参与讨论。如果我们对相关部分进行了更改,此项目将得到更新。