2

Python のマルチプロセッシング ライブラリを使用して、分散型ニューラル ネットワークを実験しようとしています。現時点では、サーバー プロセスがニューラル ネットワークを作成し、バッチが共有キューに入れられ、クライアント プロセスによって処理され、結果が別の共有キュー。

これまでのところ、バッチを処理して勾配を生成するために、マルチプロセッシング配列を使用して共有したネットワークの重みのコピーが子プロセスに必要であることを除いて、すべてが機能しています。クライアント プロセスは重みの読み取り専用コピーのみを必要としますが、サーバー プロセスは各トレーニング エポックの後にローカル コピーを更新します。

私の質問は、共有メモリを更新して変更された重みを反映し、次のエポックでクライアント プロセスが勾配を計算するための正しい値を持つようにする方法です。

4

1 に答える 1

1

multiprocessingこれを読んでから遊んでいて、 のデータを更新するのmp.Arrayはそれほど難しくないことがわかりました。ループを使用してArray. 次のスニペットは、マスターが頻繁に (可能な限り速く) 変更するデータを同期するために使用された単純なマスターワーカーセットをセットアップしますmp.Process(使用しPoolた方が良かったのですが、これは私にとってはより高速でした)。mp.Array

from multiprocessing import Process, RLock, Array
from time import sleep

def worker(n, array, arrayLock):
    while True:
        arrayLock.acquire()
        print("Worker: %i -> %s" % (n, ",".join(str(i) for i in array)))
        arrayLock.release()
        sleep(n + 1)

if __name__ == '__main__':
    arrayLock = RLock()
    array = Array('i', range(10), lock=arrayLock)

    pd = {}
    for i in range(3):
        pd[i] = Process(target=worker, args=(i, array, arrayLock))
        pd[i].start()

    try:
        while True:
            arrayLock.acquire()
            for i in range(len(array)):
                array[i] = -array[i]
            arrayLock.release()
    except KeyboardInterrupt:
        pass

    for p in pd.values():
        p.terminate()

次の出力が得られます

~> python mp_shared.py
Worker: 0 -> 0,1,2,3,4,5,6,7,8,9
Worker: 1 -> 0,-1,-2,-3,-4,-5,-6,-7,-8,-9
Worker: 2 -> 0,1,2,3,4,5,6,7,8,9
Worker: 0 -> 0,-1,-2,-3,-4,-5,-6,-7,-8,-9
Worker: 1 -> 0,-1,-2,-3,-4,-5,-6,-7,-8,-9
Worker: 0 -> 0,1,2,3,4,5,6,7,8,9

プロセス間でのデータの更新は、Array. ただし、結果が次のようになるという問題が発生しました(データの交互の符号に注意してください)

Worker: 0 -> 0,-1,2,-3,4,-5,6,-7,8,-9
Worker: 1 -> 0,-1,2,-3,4,-5,6,-7,8,-9
Worker: 2 -> 0,-1,2,-3,4,-5,6,-7,8,-9

これは、配列に対して読み取りまたは書き込みを行っているときに、Lock自動的に作成されたがループ全体のアクセスを同期しないことが原因でした! Arrayマスター プロセスはArray、ワーカーがロックを取得する間に変更を行ったり来たりします。

これを避けるためRLockに、. をすべてのワーカーに渡して、誰もがアトミック操作を実行できるようにしました (あなたの状況では、勾配計算のエラーを防ぐために読み取りと書き込みがアトミックであることが重要であると確信しています)。RLockArrayLockArrayRLock

編集:

別の代替案のように見えますmmapが、その使用法と、変更がここで必要に応じて機能するかどうかについてコメントすることはできません.

于 2013-02-03T04:54:00.953 に答える