Tensorflow: A sessão travou após a bifurcação

Criado em 21 mai. 2016  ·  3Comentários  ·  Fonte: tensorflow/tensorflow

Versão: pré-construído noturno para Python2 c / GPU (agora)

Estou esperando que o código a seguir imprima "10.0" 3 vezes, mas session.run travou em todos os processos bifurcados.

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()

Remover o gráfico / sessão no processo mestre resolverá o problema. Então, parece que uma vez que há uma sessão, não podemos usar o fork?
O problema existe com e sem GPU.

NOTA: este código não termina normalmente. Você provavelmente precisará encerrar manualmente os processos bifurcados após a saída do mestre.

Comentários muito úteis

@mrry Significa que existe uma maneira de criar fork safe tf.Session com tf.Session(args) ?

Todos 3 comentários

A sessão em processo (ou seja, tf.Session() sem argumentos) não foi projetada para ser fork() -segura. Se você quiser compartilhar um conjunto de dispositivos entre vários processos, crie um tf.train.Server em um processo e crie sessões que se conectam a esse servidor (com tf.Session("grpc://...") ) nos outros processos.

@mrry Significa que existe uma maneira de criar fork safe tf.Session com tf.Session(args) ?

@mavenlin
O protótipo de tf.Session é

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

Aqui target se refere ao mecanismo de execução ao qual se conectar. Ou seja, é preciso rodar a sessão de trabalho em outro processo, em modo distribuído, e tf.Session com argumentos ainda não é fork() -seguro.

Notícias tristes.

Esta página foi útil?
0 / 5 - 0 avaliações