Version : nightly préconstruit pour Python2 avec GPU (tout à l'heure)
Je m'attends à ce que le code suivant affiche "10.0" 3 fois, mais session.run est resté bloqué dans tous les processus fork.
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()
La suppression du graphique/de la session dans le processus maître résoudra le problème. Il semble donc qu'une fois qu'il y a une session, nous ne pouvons pas utiliser de fork ?
Le problème existe avec et sans GPU.
REMARQUE : ce code ne se termine pas normalement. Vous aurez probablement besoin de tuer manuellement les processus forkés après la sortie du maître.
La session in-process (c'est-à-dire tf.Session()
sans arguments) n'est pas conçue pour être fork()
-safe. Si vous souhaitez partager un ensemble de périphériques entre plusieurs processus, créez un tf.train.Server
dans un processus et créez des sessions qui se connectent à ce serveur (avec tf.Session("grpc://...")
) dans les autres processus.
@mrry Cela signifie-t-il qu'il existe un moyen de créer fork
safe tf.Session
avec tf.Session(args)
?
@mavenlin
Le prototype de tf.Session
est
tf.Session.__init__(target='', graph=None, config=None)
Ici, target
fait référence au moteur d'exécution auquel se connecter. C'est-à-dire qu'il faut exécuter la session de travail dans un autre processus, en mode distribué, et tf.Session
avec des arguments n'est toujours pas fork()
-safe.
Mauvaise nouvelle.
Commentaire le plus utile
@mrry Cela signifie-t-il qu'il existe un moyen de créer
fork
safetf.Session
avectf.Session(args)
?