gpt4 book ai didi

python - 奇怪的多处理 block 导入 Numba 函数

转载 作者:IT老高 更新时间:2023-10-28 21:05:18 25 4
gpt4 key购买 nike

环境

  • GNU/Linux (Fedora 25)。
  • Conda 环境。
  • Python 3.6.1。
  • Numba 0.33.0 (np112py36_0)。

初始设置(工作正常)

两个文件main.pynumbamodule.py:

main.py

这会产生 2 个进程来运行 execute_numba 函数。

import time
from importlib import import_module
from multiprocessing import Process


def execute_numba(name):
# Import the function
importfunction = 'numbamodule.numba_function'
module = import_module(importfunction.split('.')[0])
function = getattr(module, importfunction.split('.')[-1])
while True:
print(str(name) + ' - executing Numba function...')
# Execute the function
function(10)
time.sleep(0.1)


if __name__ == '__main__':
processes = [Process(target=execute_numba, args=(i,)) for i in range(2)]
[p.start() for p in processes]
time.sleep(1)
[p.terminate() for p in processes]

numbamodule.py

其中定义了一个简单的函数numba_function:

import numba


@numba.jit()
def numba_function(x):
total = 0
for i in range(x):
total += i
return total

我可以运行 main.py 脚本并查看两个进程的打印:

$ python main.py
0 - executing Numba function...
1 - executing Numba function...
0 - executing Numba function...
1 - executing Numba function...
0 - executing Numba function...
1 - executing Numba function...
[...]

打破它

我打破它的方式有点奇怪,但这是我在尝试最小化可重现测试用例时偶然发现的。请告诉我您是否也可以重现相同的行为。

main.py 中,我只是在最后一个 Process 导入之后添加一个建议的(波纹管)导入(即:取消注释一行并尝试):

import time
from importlib import import_module
from multiprocessing import Process

#
# Adding one of the import lines bellow results in a block...
# (you may need to install the packages first in the virtual environment)
#
#import matplotlib
#import Pyro4
#import scipy
#import dill


def execute_numba(name):
# [...]

然后一个进程可能会阻塞在 execute_numba 函数(特别是在 import_module() 调用):

$ python main.py 
1 - executing Numba function...
1 - executing Numba function...
1 - executing Numba function...
1 - executing Numba function...
1 - executing Numba function...
1 - executing Numba function...
[...]

对我来说,matplotlibPyro4 导入“工作”最好。我什至无法获得 100% 的运行... :-/

请注意,我只是添加了一个导入行,而不是实际使用包。其他一些外部导入也会导致阻塞,但我发现上面提出的那些“工作”最好(阻塞最多)。

发生了什么?

首先,你能重现同样的行为吗? (对非虚拟化 GNU/Linux 机器特别感兴趣)

我不知道如何调试它或为什么会发生这种情况。有什么想法吗?

添加一个随机 import xxx 会触发该 block 的事实让我感到害怕并且对我来说毫无意义。这是否取决于时间/延迟,这就是为什么有些导入会破坏它而另一些不会?

注意事项

  • 如您所见,没有回溯,该过程只是阻塞。
  • 如果我从 numbamodule.py 中删除 import numba@numba.jit,那么它将始终有效,所以也许它有和 Numba 有什么关系?
  • 我也可以使用旧 Numba/Python 版本重现相同的行为。尝试使用 Numba 0.25.0 和 0.22.1(都使用 Python 3.5.3)。

更新

  • 2017-07-03:为了清楚起见,我不是在寻找解决方法(我已经在实际代码中找到了解决方法)。我真的很想知道如何处理这样的案件。了解正在发生的事情并学习如何调试和发现问题,以便在它是损坏的包/构建/环境时报告它。您将如何进行?
  • 2017-07-10:阻塞尤其发生在 import_module() 调用中。
  • 2017-07-11: Numba issue acknowledged .

最佳答案

这似乎是一个 Numba 错误,在 issue 2431 中得到确认.

现在好像解决了。如果您遇到这种情况,请更新您的 numballvmlite 安装。如果这不能解决问题,您可能应该在该问题中添加评论以重新打开它。

正如@stuartarchibald 评论的那样:

[...] it looks like one processed is blocked is because it has in actual fact segfaulted [...]

[...] Segfaults appearing from this location are almost always due to threads performing concurrent operations inside LLVM, or some issue to do with installing functions during Numba's initialisation sequence. [...]

[...] cannot reproduce any more with llvmlite==0.22.0dev0 and numba==0.37.0.dev [...]

关于python - 奇怪的多处理 block 导入 Numba 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44764520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com