2017-03-28 63 views
0

我写了一个非常简单的程序,运行得很好,没有分布,但在分布式模式下挂起CheckpointSaverHook(尽管我的本地主机上的所有内容!)。我已经看到有关于挂在分布式模式的几个问题,但没有一个与我的问题相符。TensorFlow:极简主义程序在分布式模式下失败

这里的脚本(玩具制造与新层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"}ps启动它(这是工人,同样的type用于启动参数服务器

我在windows-64上使用tensorflow-1.0.1(但是与1.0.0具有相同的行为),但是我从来没有得到任何错误,它只是挂在经过INFO:tensorflow:Create CheckpointSaverHook.永远......我试图将VisualStudio C++调试器附加到过程中,但很少成功到目前为止,所以我无法打印堆栈以查看原生部分发生的情况。

问题:这不是DNNLinearCombinedClassifier的问题,因为它也不如tf.contrib.learn.LinearClassifier。正如评论中指出的那样,这不是因为两个进程都在localhost上运行,因为在单独的虚拟机上运行时也会失败。

编辑:我认为这实际上是一个服务器启动的问题。看起来当你处于本地模式时,服务器不会启动(不管是否分发),参考。 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() 

这将防止在本地模式正在启动对工人的服务器......任何人有一个想法,如果它是一个错误或有我丢失的东西?

+0

请注意,如果我在两个独立的虚拟机内部运行相同的脚本,它们也无法运行它......所以这不是因为都在本地主机上。 –

+0

在TensorFlow存储库上打开github问题:https://github.com/tensorflow/tensorflow/issues/8796 –

回答

相关问题