promptflow [BUG] 进程池中的全局状态存在竞态条件

2mbi3lxu  于 2个月前  发布在  其他
关注(0)|答案(2)|浏览(41)

描述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 ]

我们通过修改调用子流程的方式解决了这个问题:

from pathlib import Path
flow_path = Path(__file__).parent / "sub_flow1"
flow = load_flow(flow_path)
dffbzjpn

dffbzjpn1#

同样不确定是否应该打开另一个问题,但示例项目还显示了跟踪查看器中的一个错误。当我打开控制台中提供的链接时,只有出错的案例会出现。这对我来说每次都发生在那个项目上,尽管我还没有在我们的实际应用程序中注意到它。
这里应该有10行:

我们已经注意到跟踪查看器中的其他微妙错误。有时表格格式中显示的信息与点击它时的底层案例不匹配。相同的运行行可能会重复几次,然后我们需要点击每一行来找到我们正在寻找的实际案例。
我的怀疑是这两个问题都与其他并发问题有关,而不是跟踪查看器本身的问题。

8i9zcol2

8i9zcol22#

你好 @bhanson-techempower ,感谢联系我们并提供详细重现功能。我们已经调查了这个问题,我将对此进行更多解释。

首先得出结论

  1. 将'load_flow'从@tool函数中移除/2.使用绝对路径/3.将并发数设置为1,这些都可以解决这个问题。

根本原因

1.当运行流程时,promptflow会将工作目录更改为流程目录,以确保流程可以成功运行并具有正确的导入。
1.没有依赖关系的节点会并发执行。
1.在你的流程中,这3个节点之间没有相互依赖,因此它们在一个进程中并发执行,导致在执行到load_flow行时出现问题,因为由于工作目录的更改而导致流程路径被错误地解析,从而相互影响。

关于解决方法的详细说明

1.将'load_flow'从@tool函数中移除--在导入文件时加载流程,此时工作目录不会改变,因此流程可以成功加载。

1.使用绝对路径--使用绝对路径加载流程可以很好地工作,因为工作目录不再会影响路径。
1.将并发数设置为1--当并发数为1时,工作目录会逐步正确地更改和还原,因此使用正确的工作目录加载流程可以成功工作。

要解决此问题

要完全解决此问题,我们需要使每个节点独立运行,例如在单独的进程中运行。恐怕这将是一项长期的工作,我已经添加了“长期”标签,我们将为此问题保持开放状态,任何遇到相同问题的人都可以参与讨论。如果我们对相关部分进行了更改,此项目将得到更新。

相关问题