Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >奇怪的多进程块导入Numba函数

奇怪的多进程块导入Numba函数
EN

Stack Overflow用户
提问于 2017-06-26 16:41:38
回答 3查看 810关注 0票数 18

环境

  • GNU/Linux (Fedora 25)。
  • Conda environment.
  • Python 3.6.1.
  • Numba 0.33.0 (np112py36_0).

初始设置(工作正常)

两个文件main.pynumbamodule.py

main.py

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

代码语言:javascript
运行
AI代码解释
复制
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

代码语言:javascript
运行
AI代码解释
复制
import numba


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

我可以运行main.py脚本,并看到两个进程都在打印:

代码语言:javascript
运行
AI代码解释
复制
$ 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导入之后添加一个建议的(如下所示)导入(即:取消一行注释并尝试):

代码语言:javascript
运行
AI代码解释
复制
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()调用处):

代码语言:javascript
运行
AI代码解释
复制
$ 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触发了这个块,这让我感到害怕,对我来说意义不大。这是否依赖于时间/延迟,这就是为什么一些导入会破坏它,而另一些则不会。

备注

  • 如果我从numbamodule.py中删除了import numba@numba.jit,那么它总是可以工作的,所以也许它和Numba有关?

  • 我也可以在更老的Numba/Python版本中重现同样的行为。尝试使用Numba 0.25.0和0.22.1 (都使用Python3.5.3)。

更新

  • 2017-07-03:只是为了说明一下,我并不是在寻找解决方法(我已经在真实的代码中找到了一个)。我真的很想知道在这样的情况下如何处理。了解发生了什么,并学习如何调试和发现问题,以便在损坏的包/构建/环境中报告问题。您将如何proceed?
  • 2017-07-10:数据块,尤其是在import_module() call.
  • 2017-07-11:Numba issue acknowledged.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-13 21:02:56

这似乎是一个Numba bug,在issue 2431中得到了承认。

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

@stuartarchibald评论道:

...看起来有一个进程被阻塞是因为它实际上有分段故障...从这个位置出现的段错误几乎总是由于线程在LLVM中执行并发操作,或者在Numba初始化序列期间安装函数的一些问题造成的。..。无法再使用llvmlite==0.22.0dev0numba==0.37.0.dev进行复制...

票数 1
EN

Stack Overflow用户

发布于 2017-07-08 10:50:51

这只适用于matplotlib调试,实际上是猜测,但可能会帮助您缩小问题的范围。

当包含matplotlib时,您可以使用以下命令启动程序:

代码语言:javascript
运行
AI代码解释
复制
python main.py --verbose-helpful

它显示了matplotlib初始化时的调试输出。由于它听起来像是只存在于您的特定系统上的问题,因此matplotlibrc可能存在一些配置问题,其配置方式使其以交互模式启动。

下面是对可用的调试模式的概述:https://matplotlib.org/users/customizing.html

票数 0
EN

Stack Overflow用户

发布于 2017-07-03 08:48:00

下面是Python Docker官方环境的重现。Dockerfile紧随其后(将您的.py文件放在一起)。

代码语言:javascript
运行
AI代码解释
复制
FROM python:3.5

RUN pip install numba matplotlib pyro4

ADD . /opt
WORKDIR /opt

CMD python main.py

然后:

代码语言:javascript
运行
AI代码解释
复制
docker build -t so-44764520 .
docker run --rm -it so-44764520

两者都以相同的方式工作,没有“工作”的导入,matplotlibPyro4,并在main.py中使用它们。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44764520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档