Многопроцессорность с помощью numpy делает Python неожиданно завершающим в OSX

У меня возникла проблема, когда Python неожиданно завершает работу при запуске многопроцессорной обработки с помощью numpy. Я выделил проблему, так что теперь я могу подтвердить, что многопроцессорная обработка работает при запуске кода, указанного ниже:

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()

Пожалуйста, помогите кому-нибудь. Я открыт для всех предложений. Благодарю. Примечание. Я попробовал две разные машины и возникла одна и та же проблема.

Ответ 1

Я выяснил обходное решение проблемы. Проблема возникает, когда 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()

Ответ 2

Это известная проблема с многопроцессорной обработкой и numpy на MacOS X и несколько дубликатов:

segfault с помощью lapack_lite от numpy с многопроцессорной обработкой на osx, а не на linux

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

Ответ, похоже, заключается в использовании другой BLAS, отличной от рамки ускорения Apple, при связывании Numpy... unfortunate: (