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.
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.
Comentários muito úteis
@mrry Significa que existe uma maneira de criar
fork
safetf.Session
comtf.Session(args)
?