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

誰か助けてください。私はすべての提案を受け入れます。ありがとう。注: 2 台の異なるマシンを試しましたが、同じ問題が発生します。

4

2 に答える 2

6

問題の回避策を見つけました。この問題は、マルチプロセッシング インスタンスを初期化する前に Numpy を BLAS と一緒に使用すると発生します。私の回避策は、Numpy コード (BLAS を実行) を 1 つのプロセスに配置し、その後マルチプロセッシング インスタンスを実行することです。これは良いコーディング スタイルではありませんが、機能します。以下の例を参照してください。

以下は失敗します - 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 に答える