4

マシンのコア全体で並列に実行される既存の Python コードがあります。それが完了する仕事は、基本的に入力ファイルを開き、内容を読み取り、かなり重い計算を実行し、結果を出力ファイルに書き込み、for ループで次のファイルを取得して、もう一度実行します。これを多くのコアで並列化するために、ライブラリのPool関数を利用します。multiprocessing簡単な例として:

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

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

私が取り組んでいるネットワークには、99% の時間アイドル状態になっているマシンがいくつかあることに気付きました。したがって、このコードで自分のローカル コアだけでなく、彼らのコアも利用する方法があるのではないかと考えました。

疑似コードでは、コードは次のようになります。

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)

ローカル マシンと他の IP アドレスの両方を、各マシンで使用するコアの数と共にサーバーとして指定できるようになりました。

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

pathosグーグルで調べてみると、ライブラリとscoopライブラリがこれに役立つ可能性があることに気付きました。pathosライブラリと非常によく似たコマンドを持っているようで、multiprocessing本当に魅力的です。ただし、どちらの場合も、ローカル並列ジョブを分散並列ジョブに変換する方法を示す簡単な例を見つけることができません。multiprocessingライブラリのプール/マップ機能にできる限り近づけたいと思っています。

どんな助けや例も大歓迎です!

4

1 に答える 1

3

の例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 ''

上記では、インスタンスの初期化時にncpusandserversをキーワードとして設定できました。Pool

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

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ことを知っておく必要があります。そして、それがリモート マシンに接続します。pathoslocalhost

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

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

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

ただし、手動で設定することに抵抗がある場合は、 と を設定するpathosスクリプトが提供されています。スクリプトを使用することは、手動で行うよりも柔軟性がやや劣り、問題が発生した場合の診断が少し難しくなります…しかし、それでも…ここでスクリプトを参照してください: https://github.com/uqfoundation/pathos/tree/master/scripts .tunnelppserver

于 2016-03-23T13:44:42.273 に答える