2017-02-24 11 views
2

の労働者の数を指定するには私は、例えば、モンテカルロの、実行してきましたが、いくつかの線形代数演算で、DASKは、ユーザ指定の設定を無効にしているようです、例えば:はどのように設定することができ、<a href="http://dask.pydata.org/en/latest/scheduler-overview.html#configuring-the-schedulers" rel="nofollow noreferrer">Dask documentation</a>が示すように、あなたがDask.arrayの労働者の数を指定したいと仮定しDask.array

import dask.array as da 
import dask 
from multiprocessing.pool import ThreadPool 

dask.set_options(pool=ThreadPool(num_workers)) 
mat1 = da.random.random((size, size) chunks=chunk_size) 
mat2 = da.random.random((size, size) chunks=chunk_size) 
mat3 = mat1.dot(mat2) 
mat3.compute() 

私は小さなマトリクスサイズでそのプログラムを実行すると、それは明らかに使用しています労働者はnum_workersのみですが私が行列のサイズを大きくすると、突然画像が示すように、ダースの労働者が生まれます。 enter image description here

したがって、num_workers労働者のみを使用してDaskに問題を解決するにはどうすればよいですか?

+1

スレッドBLASに対してnumpyをコンパイルしていますか?そうであれば、各作業員は自分の労働者を産んでいるかもしれません。 'pstree'は、産卵階層の理解を深めるのに役立ちます。 –

+0

はい!私はIntelpythonを使用していますので、numpyはMKLにリンクしています。私は、MKLスレッドの数をhttp://stackoverflow.com/questions/28283112/using-mkl-set-num-threads-with-numpy#28293128に示すように制限し、問題は解消されました。どうもありがとうございました! –

答えて

0

スレッドスケジューラを使用する場合、Daskは新しいプロセスを生成しません。代わりに、メインプロセス内のすべてを実行します。

ただし、これにより、関数の処理自体が停止することはありません。コメントでMike Grahamが指摘しているように、Daskのような並列ソリューションとMKLやOpenBLASなどの並列BLASの実装を混在させることには注意が必要です。これによりパフォーマンスが低下する可能性があります。 1つの呼び出しにつき1つのスレッドを使用するように、2つのライブラリのうちの1つを設定することが最善の方法です。

なぜ私は複数のpythonプロセスが表示されているのか混乱しています。私の知る限りでは、スレッドDaskもMKLも計算のための新しいプロセスを作成しません。しかし、MKLスレッドの数を制限して肯定的な結果が出た場合、MKLは最後にチェックインしてから変更されている可能性があります。

関連する問題

 関連する問題