Tensorflow: Сессия зависла после форка

Созданный на 21 мая 2016  ·  3Комментарии  ·  Источник: tensorflow/tensorflow

Версия: ночная сборка для 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()

Удаление графика / сеанса в главном процессе решит проблему. Получается, что после сеанса мы не можем использовать вилку?
Проблема существует с графическим процессором и без него.

ПРИМЕЧАНИЕ: этот код не завершается нормально. Возможно, вам придется вручную убить разветвленные процессы после выхода мастера.

Самый полезный комментарий

@mrry Означает ли это, что есть способ создать fork safe tf.Session с помощью tf.Session(args) ?

Все 3 Комментарий

Внутрипроцессный сеанс (т. Е. 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.

Грустные новости.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги