web-dev-qa-db-ja.com

Tensorflowとマルチプロセッシング:セッションの受け渡し

私は最近、仮想ロボット制御にニューラルネットワークを使用するプロジェクトに取り組んでいます。私はそれをコード化するためにテンソルフローを使用し、それはスムーズに実行されました。これまでのところ、シーケンシャルシミュレーションを使用してニューラルネットワークがどの程度優れているかを評価しましたが、時間を短縮するためにいくつかのシミュレーションを並行して実行したいデータを取得するために必要です。

これを行うには、Pythonのmultiprocessingパッケージをインポートします。最初は、sess変数(sess=tf.Session())をシミュレーションを実行する関数に渡していました。ただし、このsess変数を使用するステートメントに到達すると、警告なしでプロセスが終了します。少し探してみたところ、次の2つの投稿が見つかりました: Tensorflow:セッションをaに渡すpython multiprocess および 複数のtensorflowセッションを同時に実行する =

それらは非常に関連していますが、それを機能させる方法を理解することができませんでした。個々のプロセスごとにセッションを作成し、ニューラルネットの重みをトレーニング可能なパラメーターに割り当ててみましたが、成功しませんでした。また、セッションをファイルに保存してからプロセス内でロードしようとしましたが、そこでもうまくいきませんでした。

誰かがセッション(またはセッションのクローン)をいくつかのプロセスに渡すことができましたか?

ありがとう。

15
MrRed

Kerasをラッパーとして使用し、tensorflowをバッキングとして使用しますが、同じ一般的な原則を適用する必要があります。

あなたがこのようなことをしようとすると:

import keras
from functools import partial
from multiprocessing import Pool

def ModelFunc(i,SomeData):
    YourModel = Here
    return(ModelScore)

pool = Pool(processes = 4)
for i,Score in enumerate(pool.imap(partial(ModelFunc,SomeData),range(4))):
    print(Score)

失敗します。ただし、次のようなものを試した場合:

from functools import partial
from multiprocessing import Pool

def ModelFunc(i,SomeData):
    import keras
    YourModel = Here
    return(ModelScore)

pool = Pool(processes = 4)
for i,Score in enumerate(pool.imap(partial(ModelFunc,SomeData),range(4))):
    print(Score)

うまくいくはずです。プロセスごとにテンソルフローを個別に呼び出してみてください。

6
June Skeeter

Python multiprocessingを使用してTensorFlow Sessionmultiprocessing.Poolにまっすぐ進む方法で渡すことはできません。これは、Sessionオブジェクトはpickleできないためです(基本的にシリアル化できません。 GPUメモリとそのような状態)。

actors を使用してコードを並列化することをお勧めします。これは基本的に「オブジェクト」の並列計算の類似体であり、分散設定で状態を管理するために使用されます。

Ray は、これを行うための優れたフレームワークです。 TensorFlow Sessionを管理し、シミュレーションを実行するためのメソッドを公開するPythonクラスを定義できます。

import ray
import tensorflow as tf

ray.init()

@ray.remote
class Simulator(object):
    def __init__(self):
        self.sess = tf.Session()
        self.simple_model = tf.constant([1.0])

    def simulate(self):
        return self.sess.run(self.simple_model)

# Create two actors.
simulators = [Simulator.remote() for _ in range(2)]

# Run two simulations in parallel.
results = ray.get([s.simulate.remote() for s in simulators])

RayでTensorFlowを並列化する の例をいくつか示します。

Rayのドキュメント を参照してください。私はRay開発者の一人であることに注意してください。

4