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.
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.
Hilfreichster Kommentar
@mrry Bedeutet es, dass es eine Möglichkeit gibt,
fork
sicheretf.Session
mittf.Session(args)
zu erstellen?