Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用numpy和x27进行分段故障;s lapack_lite在osx(而不是linux)上具有多处理功能_Python_Numpy_Segmentation Fault_Multiprocessing - Fatal编程技术网

Python 使用numpy和x27进行分段故障;s lapack_lite在osx(而不是linux)上具有多处理功能

Python 使用numpy和x27进行分段故障;s lapack_lite在osx(而不是linux)上具有多处理功能,python,numpy,segmentation-fault,multiprocessing,Python,Numpy,Segmentation Fault,Multiprocessing,以下测试代码为OSX 10.7.3上的me故障,但不适用于其他机器: from __future__ import print_function import numpy as np import multiprocessing as mp import scipy.linalg def f(a): print("about to call") ### these all cause crashes sign, x = np.linalg.slogdet(a)

以下测试代码为OSX 10.7.3上的me故障,但不适用于其他机器:

from __future__ import print_function

import numpy as np
import multiprocessing as mp
import scipy.linalg

def f(a):
    print("about to call")

    ### these all cause crashes
    sign, x = np.linalg.slogdet(a)
    #x = np.linalg.det(a)
    #x = np.linalg.inv(a).sum()

    ### these are all fine
    #x = scipy.linalg.expm3(a).sum()
    #x = np.dot(a, a.T).sum()

    print("result:", x)
    return x

def call_proc(a):
    print("\ncalling with multiprocessing")
    p = mp.Process(target=f, args=(a,))
    p.start()
    p.join()


if __name__ == '__main__':
    import sys
    n = int(sys.argv[1]) if len(sys.argv) > 1 else 50

    a = np.random.normal(0, 2, (n, n))
    f(a)

    call_proc(a)
    call_proc(a)
其中一个故障的输出示例:

$ python2.7 test.py
about to call
result: -4.96797718087

calling with multiprocessing
about to call

calling with multiprocessing
about to call
出现一个OSX“问题报告”,抱怨0x0000000000000108的
KERN\u无效\u地址之类的segfault

如果我使用
n=33运行它,它会崩溃

如果我注释掉在原始流程中完成的
f(a)
调用,则对
call\u proc
的两个调用都可以。如果我在不同的大数组上调用
f
,它仍然会出错;如果我在另一个小数组上调用它,或者如果我调用
f(大数组)
然后将
f(小数组)
传递到另一个进程,它就可以正常工作。它们实际上不需要是相同的函数
np.inv(大数组)
然后传递到
np.linalg.slogdet(不同的大数组)
也会发生故障

所有被注释掉的
np.linalg
事物在
f
中都会导致崩溃
np.dot(self.a,self.a.T).sum()
scipy.linalg.exp3m
工作正常。据我所知,区别在于前者使用numpy的lapack_lite,后者不使用


这种情况发生在我的桌面上

  • python 2.6.7,numpy 1.5.1
  • python 2.7.1、numpy 1.5.1、scipy 0.10.0
  • python 3.2.2、numpy 1.6.1、scipy 0.10.1
2.6和2.7是我认为默认的系统安装;我从源代码tarballs手动安装了3.2版本。所有这些NUMPY都链接到系统加速框架:

$ otool -L `python3.2 -c 'from numpy.core import _dotblas; print(_dotblas.__file__)'`
/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/numpy/core/_dotblas.so:
    /System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
    /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.1)
我在另一台具有类似设置的Mac电脑上也有同样的行为

但是
f
的所有选项都适用于其他正在运行的机器

  • OSX 10.6.8,Python 2.6.1和numpy 1.2.1链接到Accelerate 4和vecLib 268(除了它没有scipy或
    SlogSet
  • Debian 6与Python 3.2.2、numpy 1.6.1和scipy 0.10.1链接到系统ATLAS
  • Ubuntu 11.04与Python 2.7.1、numpy 1.5.1和scipy 0.8.0链接到system ATLAS

我做错什么了吗?这可能是什么原因造成的?我不认为在一个被pickle和unpickle的numpy数组上运行一个函数怎么可能导致它以后在另一个进程中出错



更新:当我进行核心转储时,回溯在大中央调度接口
调度组异步调度中。这可能是numpy/GCD和多处理之间的交互中的一个bug。我已将此报告为,但如果有人对解决方法或如何解决此错误有任何想法,将不胜感激。:)

事实证明,OSX上默认使用加速框架。除了链接到一个不同的BLAS之外,没有其他真正的方法来解决这个问题,而且他们似乎对修复这个问题不感兴趣。

根据@ogrisel的评论,在使用
多处理.Pool
之前,我尝试调用
多处理.set\u start\u方法('forkserver')
,效果非常好

作为一个成熟的库,numpy不应该导致分段错误或以其他方式中止当前进程。你在提交错误报告了吗?是的,我报告了:。然而,这张罚单的响应完全为零,我只是停止在OSX上运行该代码。我将使用numpy master在10.8上重新测试,并在下周发布一个更新。在Python 3.4中,将有用于多处理的
forkserver
模式,这将使在多处理中使用Accelerate或OpenBLAS成为可能。@ogrisel的评论应该是答案。对我来说工作很有魅力!