Tensorflow: Sitzung blieb nach der Gabelung stecken

Erstellt am 21. Mai 2016  ·  3Kommentare  ·  Quelle: tensorflow/tensorflow

Version: Nightly Prebuilt für Python2 mit GPU (gerade jetzt)

Ich erwarte, dass der folgende Code dreimal "10.0" ausgibt, aber session.run ist in allen gegabelten Prozessen stecken geblieben.

import tensorflow as tf
import multiprocessing as mp
import os

class Worker(mp.Process):
    def __init__(self, gid):
        self.gid = gid
        super(Worker, self).__init__()

    def run(self):
        G = tf.Graph()
        with G.as_default():
            x = tf.placeholder(tf.float32, shape=[])
            y = x * 2
            sess = tf.Session()
            print sess.run(y, feed_dict={x: 5})

G = tf.Graph()
with G.as_default():
    sess = tf.Session()
    with sess.as_default():
        x = tf.placeholder(tf.float32, shape=[])
        y = x * 2
        print sess.run(y, feed_dict={x: 5})

procs = [Worker(k) for k in range(2)]
for p in procs: p.start()
for p in procs: p.join()

Das Entfernen des Diagramms/der Sitzung im Masterprozess löst das Problem. Es sieht also so aus, als ob wir nach einer Sitzung keine Fork verwenden können?
Das Problem besteht mit und ohne GPU.

HINWEIS: Dieser Code wird nicht normal beendet. Sie müssen die gegabelten Prozesse wahrscheinlich manuell beenden, nachdem der Master beendet wurde.

Hilfreichster Kommentar

@mrry Bedeutet es, dass es eine Möglichkeit gibt, fork sichere tf.Session mit tf.Session(args) zu erstellen?

Alle 3 Kommentare

Die prozessinterne Sitzung (dh tf.Session() ohne Argumente) ist nicht fork() sicher. Wenn Sie mehrere Geräte für mehrere Prozesse freigeben möchten, erstellen Sie in einem Prozess ein tf.train.Server und erstellen Sie Sitzungen, die eine Verbindung zu diesem Server (mit tf.Session("grpc://...") ) in den anderen Prozessen herstellen.

@mrry Bedeutet es, dass es eine Möglichkeit gibt, fork sichere tf.Session mit tf.Session(args) zu erstellen?

@mavenlin
Der Prototyp von tf.Session ist

tf.Session.__init__(target='', graph=None, config=None)

Hier bezieht sich target auf die Ausführungs-Engine, mit der eine Verbindung hergestellt werden soll. Das heißt, man muss die Arbeitssitzung in einem anderen Prozess im verteilten Modus ausführen, und tf.Session mit Argumenten ist immer noch nicht fork() sicher.

Traurige Nachrichten.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen