17

マルチプロセッシングを使用して簡単なテストを実行しようとしています。numpy をインポートするまで (プログラムで使用されていなくても)、テストはうまく機能します。コードは次のとおりです。

from multiprocessing import Pool
import time
import numpy as np #this is the problematic line


def CostlyFunc(N):
    """"""
    tstart = time.time()
    x = 0
    for i in xrange(N):
        for j in xrange(N):
            if i % 2: x += 2
            else: x -= 2       
    print "CostlyFunc : elapsed time %f s" % (time.time() - tstart)
    return x

#serial application
ResultList0 = []
StartTime = time.time()
for i in xrange(3):
    ResultList0.append(CostlyFunc(5000))
print "Elapsed time (serial) : ", time.time() - StartTime


#multiprocessing application
StartTime = time.time()
pool = Pool()
asyncResult = pool.map_async(CostlyFunc, [5000, 5000, 5000])
ResultList1 = asyncResult.get()
print "Elapsed time (multiporcessing) : ", time.time() - StartTime

numpy をインポートしない場合、結果は次のようになります。

CostlyFunc : elapsed time 2.866265 s
CostlyFunc : elapsed time 2.793213 s
CostlyFunc : elapsed time 2.794936 s
Elapsed time (serial) :  8.45455098152
CostlyFunc : elapsed time 2.889815 s
CostlyFunc : elapsed time 2.891556 s
CostlyFunc : elapsed time 2.898898 s
Elapsed time (multiporcessing) :  2.91595196724

合計の経過時間は、1 つのプロセスに必要な時間とほぼ同じであり、計算が並列化されていることを意味します。numpy をインポートすると、結果は次のようになります。

CostlyFunc : elapsed time 2.877116 s
CostlyFunc : elapsed time 2.866778 s
CostlyFunc : elapsed time 2.860894 s
Elapsed time (serial) :  8.60492110252
CostlyFunc : elapsed time 8.450145 s
CostlyFunc : elapsed time 8.473006 s
CostlyFunc : elapsed time 8.506402 s
Elapsed time (multiporcessing) :  8.55398178101

コアが 1 つしか使用されないため、シリアルとマルチプロセッシングの両方の方法で合計経過時間は同じです。問題がnumpyに由来することは明らかです。multiprocessing と NumPy のバージョン間に互換性がない可能性はありますか?

現在、LinuxでPython2.7、NumPy 1.6.2、マルチプロセッシング0.70a1を使用しています

4

2 に答える 2

4

(最初の投稿で、うまく構成されていない場合や調整されていない場合は申し訳ありません)

MKL_NUM_THREADS を 1 に設定することで、マルチスレッドを使用するために Numpy を停止できます。

私が使用したdebianの下で:

export MKL_NUM_THREADS=1

関連するスタックオーバーフローの投稿からのソース: Python: How do you stop numpy from multithreading?

結果:

user@pc:~/tmp$ python multi.py
CostlyFunc : elapsed time 3.847009 s
CostlyFunc : elapsed time 3.253226 s
CostlyFunc : elapsed time 3.415734 s
Elapsed time (serial) :  10.5163660049
CostlyFunc : elapsed time 4.218424 s
CostlyFunc : elapsed time 5.252429 s
CostlyFunc : elapsed time 4.862513 s
Elapsed time (multiporcessing) :  9.11713695526

user@pc:~/tmp$ export MKL_NUM_THREADS=1

user@pc:~/tmp$ python multi.py
CostlyFunc : elapsed time 3.014677 s
CostlyFunc : elapsed time 3.102548 s
CostlyFunc : elapsed time 3.060915 s
Elapsed time (serial) :  9.17840886116
CostlyFunc : elapsed time 3.720322 s
CostlyFunc : elapsed time 3.950583 s
CostlyFunc : elapsed time 3.656165 s
Elapsed time (multiporcessing) :  7.399310112

最終的にnumpyを並行して実行したいと思うので、それが役立つかどうかはわかりません。numpyのスレッド数をマシンに合わせて調整してみてください。

于 2013-10-04T16:59:13.950 に答える