14

在使用 numpy 运行多处理时,我遇到了一个问题,Python 意外退出。我已经隔离了问题,因此我现在可以确认在运行以下代码时多处理工作正常:

import numpy as np
from multiprocessing import Pool, Process
import time
import cPickle as p

def test(args):
    x,i = args
    if i == 2:
        time.sleep(4)
    arr = np.dot(x.T,x)
    print i

if __name__ == '__main__':
    x = np.random.random(size=((2000,500)))
    evaluations = [(x,i) for i in range(5)]
    p = Pool()
    p.map_async(test,evaluations)
    p.close()
    p.join()

当我尝试评估下面的代码时会出现问题。这使得 Python 意外退出:

import numpy as np
from multiprocessing import Pool, Process
import time
import cPickle as p

def test(args):
    x,i = args
    if i == 2:
        time.sleep(4)
    arr = np.dot(x.T,x)
    print i

if __name__ == '__main__':
    x = np.random.random(size=((2000,500)))
    test((x,4)) # Added code
    evaluations = [(x,i) for i in range(5)]
    p = Pool()
    p.map_async(test,evaluations)
    p.close()
    p.join()

请帮助某人。我愿意接受所有建议。谢谢。注意:我尝试了两台不同的机器,都出现了同样的问题。

4

2 回答 2

6

我想出了解决问题的方法。在初始化多处理实例之前将 Numpy 与 BLAS 一起使用时会出现此问题。我的解决方法是将 Numpy 代码(运行 BLAS)放入单个进程中,然后运行多处理实例。这不是一种好的编码风格,但它确实有效。请参见下面的示例:

以下将失败 - Python 将退出:

import numpy as np
from multiprocessing import Pool, Process

def test(x):
    arr = np.dot(x.T,x) # On large matrices, this calc will use BLAS.

if __name__ == '__main__':
    x = np.random.random(size=((2000,500))) # Random matrix
    test(x)
    evaluations = [x for _ in range(5)]
    p = Pool()
    p.map_async(test,evaluations) # This is where Python will quit, because of the prior use of BLAS.
    p.close()
    p.join()

以下将成功:

import numpy as np
from multiprocessing import Pool, Process

def test(x):
    arr = np.dot(x.T,x) # On large matrices, this calc will use BLAS.

if __name__ == '__main__':
    x = np.random.random(size=((2000,500))) # Random matrix
    p = Process(target = test,args = (x,))
    p.start()
    p.join()
    evaluations = [x for _ in range(5)]
    p = Pool()
    p.map_async(test,evaluations)
    p.close()
    p.join()
于 2013-11-20T12:43:00.090 回答
6

这是 MacOS X 上多处理和 numpy 的一个已知问题,并且有点重复:

segfault 使用 numpy 的 lapack_lite 在 osx 上进行多处理,而不是 linux

http://mail.scipy.org/pipermail/numpy-discussion/2012-August/063589.html

答案似乎是在链接 Numpy 时使用 Apple 加速框架以外的不同 BLAS ......不幸的是:(

于 2013-10-31T19:44:47.363 回答