IPython での非常に並列な作業を高速化するために、しばらくの間、スレッドとプロセスに苦労してきました。私が呼び出している関数の詳細がどの程度役立つかはわかりません。そのため、ここに bash を示しますが、さらに必要な場合はお問い合わせください。
私の関数の呼び出し署名は次のようになります
def intersplit_array(ob,er,nl,m,mi,t,ti,dmax,n0=6,steps=50):
基本的に、ob
、er
およびnl
は観測値のパラメータでありm
、mi
、 、t
、ti
およびdmax
は観測が比較されるモデルを表すパラメータです。(n0
およびsteps
は、関数の固定数値パラメーターです。) 関数は、 、、およびm
の関連情報を使用して、 およびのすべてのモデルをループし、このモデルが一致する確率を計算します。これは非常に大きいことに注意してください。これは、約 700 000 個の 22x3 NumPy 配列のリストです。と同様のサイズです。関連する場合、私の通常の IPython インスタンスは、システムメモリの約 25% を使用します: 16GB の RAM の 4GB です。mi
t
ti
dmax
m
mi
dmax
top
これを 2 つの方法で並列化しようとしました。まず、SciPy Cookbook でparallel_map
提供されている関数を使用してみました。電話をかけました
P = parallel_map(lambda i: intersplit_array(ob,er,nl,m[i+1],mi[i:i+2],t[i+1],ti[i:i+2],dmax[i+1],range(1,len(m)-1))
これが実行され、正しい答えが提供されます。パーツがなければparallel_
、これは関数を各要素に 1 つずつ適用した結果にすぎません。ただし、これは単一のコアを使用するよりも遅くなります。これは Global Interpreter Lock に関連していると思いますか?
次に、Pool
fromを使用しようとしましたmultiprocessing
。プールを初期化しました
p = multiprocessing.Pool(6)
そして、私の関数を呼び出そうとしました
P = p.map(lambda i: intersplit_array(ob,er,nl,m[i+1],mi[i:i+2],t[i+1],ti[i:i+2],dmax[i+1],range(1,len(m)-1))
まず、エラーが発生します。
Exception in thread Thread-3:
Traceback (most recent call last):
File "/usr/lib64/python2.7/threading.py", line 551, in __bootstrap_inner
self.run()
File "/usr/lib64/python2.7/threading.py", line 504, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib64/python2.7/multiprocessing/pool.py", line 319, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
を調べるとtop
、余分なipython
プロセスがすべて表示されます。それぞれのプロセスが明らかに RAM の 25% を占めており (まだ 4GB の空き容量があるため、そうではありません)、0% の CPU を使用しています。私はそれが何もしていないと推測します。IPythonも使えません。しばらく Ctrl-C を試しましたが、300 番目のプール ワーカーを超えた時点であきらめました。