2016-08-08 1 views
1

단일 시스템에서 tensorflow가있는 가변 자동 인코딩을 구현했습니다. 이제 분산 된 메커니즘이 제공되는 tensorflow를 사용하여 클러스터에서 실행하려고합니다. 그러나 다음과 같은 문제가 며칠 동안 나를 붙였습니다. 여기 InvalidArgumentError를 사용하여 분산 된 Tensorflow 실행 : dtype float을 사용하여 자리 표시 자 텐서 '자리 표시 자'에 값을 입력해야합니다.

Traceback (most recent call last): 
    File "/home/yama/mfs/ZhuSuan/examples/vae.py", line 265, in <module> 
    print('>> Test log likelihood = {}'.format(np.mean(test_lls))) 
    File "/usr/lib/python2.7/contextlib.py", line 35, in __exit__ 
    self.gen.throw(type, value, traceback) 
    File "/mfs/yama/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/training/supervisor.py", line 942, in managed_session 
    self.stop(close_summary_writer=close_summary_writer) 
    File "/mfs/yama/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/training/supervisor.py", line 768, in stop 
    stop_grace_period_secs=self._stop_grace_secs) 
    File "/mfs/yama/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/training/coordinator.py", line 322, in join 
    six.reraise(*self._exc_info_to_raise) 
    File "/mfs/yama/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/training/coordinator.py", line 267, in stop_on_exception 
    yield 
    File "/mfs/yama/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/training/coordinator.py", line 411, in run 
    self.run_loop() 
    File "/mfs/yama/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/training/supervisor.py", line 972, in run_loop 
    self._sv.global_step]) 
    File "/mfs/yama/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 372, in run 
    run_metadata_ptr) 
    File "/mfs/yama/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 636, in _run 
    feed_dict_string, options, run_metadata) 
    File "/mfs/yama/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 708, in _do_run 
    target_list, options, run_metadata) 
    File "/mfs/yama/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 728, in _do_call 
    raise type(e)(node_def, op, message) 
tensorflow.python.framework.errors.InvalidArgumentError: You must feed a value for placeholder tensor 'Placeholder' with dtype float 
    [[Node: Placeholder = Placeholder[dtype=DT_FLOAT, shape=[], _device="/job:worker/replica:0/task:0/gpu:0"]()]] 
    [[Node: model_1/fully_connected_10/Relu_G88 = _Recv[client_terminated=false, recv_device="/job:worker/replica:0/task:0/cpu:0", send_device="/job:worker/replica:0/task:0/gpu:0", send_device_incarnation=3964479821165574552, tensor_name="edge_694_model_1/fully_connected_10/Relu", tensor_type=DT_FLOAT, _device="/job:worker/replica:0/task:0/cpu:0"]()]] 
Caused by op u'Placeholder', defined at: 
    File "/home/yama/mfs/ZhuSuan/examples/vae.py", line 201, in <module> 
    x = tf.placeholder(tf.float32, shape=(None, x_train.shape[1])) 
    File "/mfs/yama/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/ops/array_ops.py", line 895, in placeholder 
    name=name) 
    File "/mfs/yama/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/ops/gen_array_ops.py", line 1238, in _placeholder 
    name=name) 
    File "/mfs/yama/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/ops/op_def_library.py", line 704, in apply_op 
    op_def=op_def) 
    File "/mfs/yama/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2260, in create_op 
    original_op=self._default_original_op, op_def=op_def) 
    File "/mfs/yama/tensorflow/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1230, in __init__ 
    self._traceback = _extract_stack() 

난 그냥 단순의 주요 기능을 붙여, 내 코드입니다 :

if __name__ == "__main__": 
    tf.set_random_seed(1234) 

    # Load MNIST 
    data_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 
          'data', 'mnist.pkl.gz') 
    x_train, t_train, x_valid, t_valid, x_test, t_test = \ 
     dataset.load_mnist_realval(data_path) 
    x_train = np.vstack([x_train, x_valid]) 
    np.random.seed(1234) 
    x_test = np.random.binomial(1, x_test, size=x_test.shape).astype('float32') 

    # Define hyper-parametere 
    n_z = 40 

    # Define training/evaluation parameters 
    lb_samples = 1 
    ll_samples = 5000 
    epoches = 10 
    batch_size = 100 
    test_batch_size = 100 
    iters = x_train.shape[0] // batch_size 
    test_iters = x_test.shape[0] // test_batch_size 
    test_freq = 10 

    ps_hosts = FLAGS.ps_hosts.split(",") 
    worker_hosts = FLAGS.worker_hosts.split(",") 

    # Create a cluster from the parameter server and worker hosts. 
    clusterSpec = tf.train.ClusterSpec({"ps": ps_hosts, "worker": worker_hosts}) 

    print("Create and start a server for the local task.") 
    # Create and start a server for the local task. 
    server = tf.train.Server(clusterSpec, 
          job_name=FLAGS.job_name, 
          task_index=FLAGS.task_index) 

    print("Start ps and worker server") 
    if FLAGS.job_name == "ps": 
     server.join() 
    elif FLAGS.job_name == "worker": 
     #set distributed device 
     with tf.device(tf.train.replica_device_setter(
      worker_device="/job:worker/task:%d" % FLAGS.task_index, 
      cluster=clusterSpec)): 

      print("Build the training computation graph") 
      # Build the training computation graph 
      x = tf.placeholder(tf.float32, shape=(None, x_train.shape[1])) 
      optimizer = tf.train.AdamOptimizer(learning_rate=0.001, epsilon=1e-4) 
      with tf.variable_scope("model") as scope: 
       with pt.defaults_scope(phase=pt.Phase.train): 
        train_model = M1(n_z, x_train.shape[1]) 
        train_vz_mean, train_vz_logstd = q_net(x, n_z) 
        train_variational = ReparameterizedNormal(
         train_vz_mean, train_vz_logstd) 
        grads, lower_bound = advi(
         train_model, x, train_variational, lb_samples, optimizer) 
        infer = optimizer.apply_gradients(grads) 

      print("Build the evaluation computation graph") 
      # Build the evaluation computation graph 
      with tf.variable_scope("model", reuse=True) as scope: 
       with pt.defaults_scope(phase=pt.Phase.test): 
        eval_model = M1(n_z, x_train.shape[1]) 
        eval_vz_mean, eval_vz_logstd = q_net(x, n_z) 
        eval_variational = ReparameterizedNormal(
         eval_vz_mean, eval_vz_logstd) 
        eval_lower_bound = is_loglikelihood(
         eval_model, x, eval_variational, lb_samples) 
        eval_log_likelihood = is_loglikelihood(
         eval_model, x, eval_variational, ll_samples) 

      global_step = tf.Variable(0) 
      saver = tf.train.Saver() 
      summary_op = tf.merge_all_summaries() 
      init_op = tf.initialize_all_variables() 

     # Create a "supervisor", which oversees the training process. 
     sv = tf.train.Supervisor(is_chief=(FLAGS.task_index == 0), 
           logdir=LogDir, 
           init_op=init_op, 
           summary_op=summary_op, 
           saver=saver, 
           global_step=global_step, 
           save_model_secs=600) 
     # Run the inference 
     with sv.managed_session(server.target) as sess: 
      epoch = 0 
      while not sv.should_stop() and epoch < epoches: 
      #for epoch in range(1, epoches + 1): 
       np.random.shuffle(x_train) 
       lbs = [] 
       for t in range(iters): 
        x_batch = x_train[t * batch_size:(t + 1) * batch_size] 
        x_batch = np.random.binomial(n=1, p=x_batch, size=x_batch.shape).astype('float32') 
        _, lb = sess.run([infer, lower_bound], feed_dict={x: x_batch}) 
        lbs.append(lb) 
       if epoch % test_freq == 0: 
        test_lbs = [] 
        test_lls = [] 
        for t in range(test_iters): 
         test_x_batch = x_test[ 
          t * test_batch_size: (t + 1) * test_batch_size] 
         test_lb, test_ll = sess.run(
          [eval_lower_bound, eval_log_likelihood], 
          feed_dict={x: test_x_batch} 
         ) 
         test_lbs.append(test_lb) 
         test_lls.append(test_ll) 
        print('>> Test lower bound = {}'.format(np.mean(test_lbs))) 
        print('>> Test log likelihood = {}'.format(np.mean(test_lls))) 
     sv.stop() 

나는 며칠 동안 내 코드를 해결하려고해야하지만 내 모든 노력은 실패했다. 당신의 도움을 찾고!

답변

4

이 예외의 원인은 작업 중 하나가 백그라운드에서 tf.train.Supervisor 실행이 tf.placeholder() 텐서 x에 따라 달라집니다,하지만 값을 공급하기에 충분한 정보를 갖고 있지 않는 것입니다.

라이브러리 코드는 종종 학습 데이터에 의존하는 값을 요약하기 때문에 가장 큰 원인은 summary_op = tf.merge_all_summaries()입니다. 백그라운드에서 요약을 수집에서 수퍼바이저를 방지하기 위해, tf.train.Supervisor 생성자에 summary_op=None를 전달합니다

 # Create a "supervisor", which oversees the training process. 
     sv = tf.train.Supervisor(is_chief=(FLAGS.task_index == 0), 
           logdir=LogDir, 
           init_op=init_op, 
           summary_op=None, 
           saver=saver, 
           global_step=global_step, 
           save_model_secs=600) 

이 일을 한 후에는 요약을 수집하기 위해 다른 준비를해야합니다. 가장 쉬운 방법은 summary_op을 주기적으로 sess.run()으로 전달한 다음 결과를 sv.summary_computed()으로 전달하는 것입니다.

+0

안녕하세요, mrry. 나는 서버적인 방법으로 당신의 충고를 시도했다. – sproblvem

+0

죄송합니다. 마지막 의견은 완전하지 않습니다. 난 당신의 해결책을 시도, 오류가 남아있다. 프로그램이 sess.run (summary_op) 및 sv.summary_computed()를 호출하는 경우. 오류 로그는 여전히 "자리 표시 자 텐서의 값을 입력해야합니다"라는 사실을 상기시켜줍니다. 또는 sess.run (summary_op)을 주기적으로 실행하지 않고 summary_op = None으로 설정하면 프로그램이 멈추게됩니다. 더 이상의 조언? 감사합니다. 답장을 기다리고 있습니다. – sproblvem

0

나는 똑같은 문제가있었습니다. 다음 mrry의 제안은 내가하여이를 해결할 수 있었다 : 내 자신의 summary_op 만들기 및 sess.run에 전달 (mrry가 제안)

  • 을 summary_op = 없음을 설정하지하여 관리자에 요약 로깅을 비활성화

    1. () 나머지 평가 대상과 함께 결과 요약을 보면서 'my_summary'라고합시다.
    2. 내 자신의 요약 작성자 만들기. 내가 sess.run (summary_op)와() sv.summary_computed을 할 mrry의 제안을 사용하지 않은,

    가 명확히하기 위해 (요약, epoch_count) summary_writer.add_summary, 대신 'my_summary'예로 전화 다른 작업과 함께 summary_op을 실행 한 다음 요약을 직접 작성했습니다. 또한 수석 작성에 대한 요약 작성을 조절할 수도 있습니다.

    기본적으로 감독자의 요약 작성 서비스를 완전히 무시해야합니다. 수퍼바이저의 놀랍게도 한계/버그처럼 보입니다. 입력에 의존하는 작업 (위치 지정자에 존재 함)을 로깅하려는 경우는 드물지 않기 때문입니다. 예를 들어 내 네트워크 (자동 인코딩)에서 비용은 입력에 따라 다릅니다.

  • 0

    비슷한 점을 발견했습니다. 경찰관은 전술 한 오류 메시지와 함께 추락했습니다. 그러나 자체 수퍼바이저가 아닌 MonitoredTrainingSession을 사용하고 있었기 때문에 기본 요약을 사용하지 않도록 설정하여 문제를 해결할 수있었습니다. 비활성화하려면 MonitoredTrainingSession의 생성자에

    save_summaries_secs=None, 
    save_summaries_steps=None, 
    

    을 제공해야합니다. 그 후, 모든 것이 순조롭게 진행되었습니다! Code on Github