TensorFlow:极简主义程序在分布式模式下失败

时间:2017-03-28 17:25:33

标签: python tensorflow

我编写了一个非常简单的程序,在没有分发的情况下运行得很好,但是在分布式模式下挂起CheckpointSaverHook(尽管我的本地主机上的所有东西!)。我已经看到有关悬挂在分布式模式下的一些问题,但似乎没有一个与我的问题相符。

这是脚本(使用新图层API玩具):

import numpy as np
import tensorflow as tf
from tensorflow.contrib.learn.python.learn import learn_runner
from tensorflow.contrib import layers

DATA_SIZE=10
DIMENSION=5
FEATURES='features'

def generate_input_fn():
    def _input_fn():
        mid = int(DATA_SIZE/2)

        data = np.array([np.ones(DIMENSION) if x < mid else -np.ones(DIMENSION) for x in range(DATA_SIZE)])
        labels = ['0' if x < mid else '1' for x in range(DATA_SIZE)]

        table = tf.contrib.lookup.string_to_index_table_from_tensor(tf.constant(['0', '1']))
        label_tensor = table.lookup(tf.convert_to_tensor(labels, dtype=tf.string))

        return dict(zip([FEATURES], [tf.convert_to_tensor(data, dtype=tf.float32)])), label_tensor
    return _input_fn

def build_estimator(model_dir):
    features = layers.real_valued_column(FEATURES, dimension=DIMENSION)
    return tf.contrib.learn.DNNLinearCombinedClassifier(
        model_dir=model_dir,
        dnn_feature_columns=[features],
        dnn_hidden_units=[20,20])

def generate_exp_fun():
    def _exp_fun(output_dir):
        return tf.contrib.learn.Experiment(
            build_estimator(output_dir),
            train_input_fn=generate_input_fn(),
            eval_input_fn=generate_input_fn(),
            train_steps=100
        )
    return _exp_fun

if __name__ == '__main__':
    tf.logging.set_verbosity(tf.logging.DEBUG)
    learn_runner.run(generate_exp_fun(), 'job_dir')

要测试分布式模式,我只需使用环境变量TF_CONFIG={"cluster": {"ps":["localhost:5040"], "worker":["localhost:5041"]}, "task":{"type":"worker","index":0}, "environment": "local"}启动它(这适用于worker,与ps类型相同,用于启动参数服务器。

我在windows-64上使用tensorflow-1.0.1(但与1.0.0具有相同的行为),只有CPU。我实际上从来没有得到任何错误,它只是在INFO:tensorflow:Create CheckpointSaverHook.之后永远挂起......我试图将VisualStudio C ++调试器附加到进程但到目前为止收效甚微,所以我无法打印出什么是堆栈发生在本土部分。

P.S。:DNNLinearCombinedClassifier不是问题,因为简单的tf.contrib.learn.LinearClassifier也失败了。正如评论中所指出的,这不是由于两个进程都在localhost上运行,因为它在单独的VM上运行时也会失败。

编辑:我认为服务器启动实际上存在问题。当你处于本地模式时(无论是否分发),看起来服务器没有启动,参见tensorflow/contrib/learn/python/learn/experiment.py l.250-258

# Start the server, if needed. It's important to start the server before
# we (optionally) sleep for the case where no device_filters are set.
# Otherwise, the servers will wait to connect to each other before starting
# to train. We might as well start as soon as we can.
config = self._estimator.config
if (config.environment != run_config.Environment.LOCAL and
    config.environment != run_config.Environment.GOOGLE and
    config.cluster_spec and config.master):
  self._start_server()

这将阻止服务器在本地模式下为工作人员启动...任何人都知道这是一个错误还是我缺少的东西?

1 个答案:

答案 0 :(得分:0)

所以这已经回答:https://github.com/tensorflow/tensorflow/issues/8796。最后,应该使用CLOUD进行任何分布式操作。