3

私のマシンのコア全体で並列に動作するPythonコードの既存ビットがあります。完成した仕事は、基本的に入力ファイルを開き、内容を読み、かなり重い数学を実行し、結果をファイルに出力し、forループの次のファイルを取り出してもう一度やります。これを多くのコアにわたって並列化するには、multiprocessingライブラリのPool関数を使用します。簡単な例として:Pythonの分散型マルチプロセッシングプール

import multiprocessing 
import time 

data = (
['a', '2'], ['b', '4'], ['c', '6'], ['d', '8'], 
['e', '1'], ['f', '3'], ['g', '5'], ['h', '7'] 
) 

def mp_worker((inputs, the_time)): 
    print " Processs %s\tWaiting %s seconds" % (inputs, the_time) 
    time.sleep(int(the_time)) 
    print " Process %s\tDONE" % inputs 

def mp_handler(): 
    p = multiprocessing.Pool(8) 
    p.map(mp_worker, data) 

if __name__ == '__main__': 
    mp_handler() 

この例では、ちょうど私が8つのコア間multiprocessing.Pool機能を実装しました方法を示すために使用されています。本質的に私のコード内のmp_worker関数ははるかに複雑ですが、あなたは私のドリフトを取得します。

私が取り組んでいるネットワークには、時間の99%がアイドル状態になっているマシンがいくつかあることに気づきました。したがって私は、このコードで自分のコアとローカルコアを利用する方法があるのか​​どうか疑問に思っていました。

私はそれぞれに使用したいコア数と一緒に切断するように私は今、私のローカルマシンと他のIPアドレスの両方を指定することができます
def mp_handler(): 
    p = multiprocessing.Pool(servers=['local host', 192.168.0.1, 192.168.0.2], ncores=[8,8,4]) 
    p.map(mp_worker, data) 

擬似コードでは、コードは次のようになる可能性機械。

私のネットワーク上の他のマシンは私に所有されており、インターネットに接続されていないため、セキュリティ上の目的でSSHを使用することについて騒がしいことはありません。

私は、pathosscoopライブラリが私にこれを手伝ってくれるかもしれないことに気付きました。 pathosには、私にとって本当に魅力的なmultiprocessingライブラリに非常によく似たコマンドがあります。しかし、どちらの場合でも、ローカル並列ジョブを分散並列ジョブに変換する方法を示す簡単な例は見つかりません。私は可能な限りmultiprocessingライブラリのプール/マップ機能の近くに滞在したいと思っています。

ご迷惑をおかけして申し訳ございません。

+0

チェックアウトhttps://wiki.python.org/moin/ParallelProcessing – mata

答えて

2

pathosの例は、あなたの擬似コードによく似ています。上記

from pathos.parallel import stats 
from pathos.parallel import ParallelPool as Pool 
pool = Pool() 

def host(id): 
    import socket 
    import time 
    time.sleep(1.0) 
    return "Rank: %d -- %s" % (id, socket.gethostname()) 


print "Evaluate 10 items on 2 cpus" 
pool.ncpus = 2 
pool.servers = ('localhost:5653',) 
res5 = pool.map(host, range(10)) 
print pool 
print '\n'.join(res5) 
print stats() 
print '' 

Poolインスタンスを初期化するとき、あなたはキーワードとしてncpusserversを設定することができました。

結果は次のようになります。

Evaluate 10 items on 2 cpus 
<pool ParallelPool(ncpus=2, servers=('localhost:5653',))> 
Rank: 0 -- hilbert.local 
Rank: 1 -- hilbert.local 
Rank: 2 -- hilbert.local 
Rank: 3 -- hilbert.local 
Rank: 4 -- hilbert.local 
Rank: 5 -- hilbert.local 
Rank: 6 -- hilbert.local 
Rank: 7 -- hilbert.local 
Rank: 8 -- hilbert.local 
Rank: 9 -- hilbert.local 
Job execution statistics: 
job count | % of all jobs | job time sum | time per job | job server 
     10 |  100.00 |  10.0459 |  1.004588 | local 
Time elapsed since server creation 5.0402431488 
0 active tasks, 2 cores 

複数のサーバーを持っている場合は、潜在的にリモートサーバで、あなただけのserversタプルにエントリを追加する必要があります。これは完璧な例ではありません。サーバーを別のマシンに移動する方法を正確に示していないためです。しかし、良い例ですが、ssh tunnelを使用する予定がある場合は、リモートマシンでpathosを指していないことを知っておくべきでしょうが、代わりにトンネルポートでlocalhostを指しています。リモートマシン。

pathosは(ppのフォークである)ppftを使用しているため、リモートサーバーを設定する方法にppからの例で見ることができます。基本的にはシェルスクリプトを使って次のようなことができます。

for i in $nodes 
do 
    ssh -f $i /home/username/bin/ppserver.py -p $portnum -w 2 -t 30 & 
done 

ここで、ループは受け取ったノード(ノード)の上にあります。各ノードについて、ssh -fコマンドを使用して、特定のポート(-p)、2人の作業者(-w)、および30秒間のアイドル(-t)後のタイムアウトを開始するためにppserverを開始します。 ppのドキュメント(http://www.parallelpython.com/content/view/15/30)を参照してください。 pathosでは、実際にはppserverを起動し、動作させるためにポートを指定する必要があります。次に、コードの最初のブロックのserverタプルにホスト名とポートを追加します。

ただし、手作業で設定することに悪い場合は、tunnelppserverを設定するスクリプトを提供しています(pathos)。スクリプトを使用するのは、手動で行うよりも少し柔軟性がなく、問題が起こったときに診断するのが少し難しいです...でも、ここのスクリプト:https://github.com/uqfoundation/pathos/tree/master/scriptsを参照してください。

+0

私は 'pathos'著者です。(2)分散コンピューティングはかなり脆弱ですので、事前に注意してください(3)配布しようとしている関数のコストは、分散クラスタへの接続を作成するコストよりも高くなければならず、Pythonインスタンスを起動する必要があります。 (4)すべてのマシンに同じバージョンの 'ppft'をインストールする必要があります。そうしないと、エラーが発生します。 –

関連する問題