Tensorflow: La session s'est bloquée après le fork

Créé le 21 mai 2016  ·  3Commentaires  ·  Source: tensorflow/tensorflow

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.

Commentaire le plus utile

@mrry Cela signifie-t-il qu'il existe un moyen de créer fork safe tf.Session avec tf.Session(args) ?

Tous les 3 commentaires

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.

Cette page vous a été utile?
0 / 5 - 0 notes