2016-08-28 10 views
3

私はTensorFlowクラスタを稼働させています.1つのクライアントプロセスを使用してデータをエンキューし、別のプロセスからデキューしようとしています。私はこれを働かせることができません、何が間違っているのですか?テンソルをTensorFlowキューにプッシュして別のプロセスからプルするにはどうすればよいですか?

ここでデータをプッシュする私のプログラムです:

# queue_push.py 
import tensorflow as tf 
import time 

with tf.container("qtest"): 
    q = tf.FIFOQueue(capacity=10, dtypes=[tf.float32], 
        shapes=[[]], name="q") 
    v = tf.placeholder(tf.float32, shape=()) 
    enqueue = q.enqueue([v]) 

with tf.Session("grpc://localhost:2210") as sess: 
    while True: 
     t = time.time() 
     print(t) 
     sess.run(enqueue, feed_dict={v: t}) 
     time.sleep(1) 

とデータをプルする私のプログラム:

# queue_pull.py 
import tensorflow as tf 
import time 

with tf.container("qtest"): 
    q = tf.FIFOQueue(capacity=10, dtypes=[tf.float32], 
        shapes=[[]], name="q") 
    dequeue = q.dequeue() 

with tf.Session("grpc://localhost:2222") as sess: 
    while True: 
     v = sess.run(dequeue) 
     print("Pulled:", v) 
     time.sleep(0.5) 

私はそれらを実行すると、ここで私が得るものです:

$ python queue_push.py 
1472420887.974484 
1472420888.991067 
1472420889.995756 
1472420890.998365 
1472420892.001799 
1472420893.008567 
1472420894.011109 
1472420895.014532 
1472420896.02017 
1472420897.024806 
1472420898.03187 
(then blocked forever) 

そして、並行して:

$ python queue_pull.py 
(blocked forever) 
+1

コードを大好き!最後に、エンキューはsession.run(...)内で実行する必要があります!! ARGH!ありがとう! – stolsvik

答えて

4

複数のセッション間でtf.FIFOQueue(または他のTensorFlowキュー)を共有するには、shared_nameオプションの引数をconstructorに渡し、各インスタンスで同じ文字列に設定する必要があります。たとえば、次のように2つのスクリプトでqを作成することができます。

q = tf.FIFOQueue(capacity=10, dtypes=[tf.float32], shapes=[[]], 
       shared_name="shared_q", name="q") 

shared_nameは、キューのnameと同じである必要はありませんが、それはで作成された他のすべてのキューの間で一意である必要がありません同じコンテナを同じデバイス上に作成します。 with tf.container():ブロックを使用せずにキューを共有できます。 tf.container()ブロックはステートフルオブジェクトをグループ化して、選択的に(tf.Session.reset()を使用して)クリアできるようにします。


N.B.tf.Variableオブジェクトのデフォルトの共有動作は異なります。は、nameプロパティに基づき、デフォルトではです。それ以外の場合、TensorFlowグラフのすべての共有オブジェクト(キュー、リーダーなど)は、コンストラクタにshared_name引数を設定した場合にのみ共有されます。

+1

素晴らしい、もう一度!あなたのSOの答えは金鉱です。私はあなたに飲み物を提供することができるようにビットコインアドレスを持っていますか? :) – MiniQuark

+1

喜んで助けて!私はビットコインアドレスを持っていませんが、賞賛は十分に報酬以上です:)。 – mrry

関連する問題