Версия: ночная сборка для Python2 с графическим процессором (только сейчас)
Я ожидаю, что следующий код напечатает «10.0» 3 раза, но session.run застрял во всех разветвленных процессах.
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()
Удаление графика / сеанса в главном процессе решит проблему. Получается, что после сеанса мы не можем использовать вилку?
Проблема существует с графическим процессором и без него.
ПРИМЕЧАНИЕ: этот код не завершается нормально. Возможно, вам придется вручную убить разветвленные процессы после выхода мастера.
Внутрипроцессный сеанс (т. Е. tf.Session()
без аргументов) не предназначен для использования в качестве fork()
-безопасного. Если вы хотите разделить набор устройств между несколькими процессами, создайте tf.train.Server
в одном процессе и создайте сеансы, которые подключаются к этому серверу (с tf.Session("grpc://...")
) в других процессах.
@mrry Означает ли это, что есть способ создать fork
safe tf.Session
с помощью tf.Session(args)
?
@mavenlin
Прототип tf.Session
- это
tf.Session.__init__(target='', graph=None, config=None)
Здесь target
обозначает механизм выполнения, к которому нужно подключиться. То есть нужно запустить рабочий сеанс в другом процессе в распределенном режиме, а tf.Session
с аргументами все еще не является fork()
-safe.
Грустные новости.
Самый полезный комментарий
@mrry Означает ли это, что есть способ создать
fork
safetf.Session
с помощьюtf.Session(args)
?