2017-10-05 5 views
0

私は、SyncReplicaOptimizerとMonitoredTraining Sessionを使用して分散テンソルフローで同期トレーニングコードを作成しようとしています。Distributed Tensorflow、Masterはトレーニング中に立ち往生しますが、SyncReplicasOptimizerとMonitoredTrainingSessionを使用している間は、トレーニングを開始しませんか?

私が直面している問題は、マスターがいくつかの手順の後にトレーニングを中断し、作業者のいずれもトレーニングを開始しないということです。これまでに遭遇したのは誰ですか?

これは私が書いたコードです。データはテンソルフローレコードから読み込まれます。私はテンソルフローのウェブサイトに記載されている正確な方法に従っています。

def build(self): 
    self.modelObj = Model(self.imagesize, self.targetSize) 
    self.modelObj.model() 
    self.global_step = tf.contrib.framework.get_or_create_global_step() 
    self.opt = tf.train.AdamOptimizer(self.learningrate) 
    if self.syncTraining: 
     self.trainer = tf.train.SyncReplicasOptimizer(self.opt,replicas_to_aggregate=self.num_workers,total_num_replicas=self.num_workers) 
    else: 
     self.trainer = self.opt 
    self.trainstep = self.trainer.minimize(self.modelObj.loss, global_step=self.global_step) 
    self.saver = tf.train.Saver(max_to_keep=1) 
    self.summary_op = tf.summary.merge_all() 
    self.init_op = tf.global_variables_initializer() 
    if self.syncTraining: 
     self.sync_replicas_hook = self.trainer.make_session_run_hook(is_chief = (self.task_index==0)) 


def train(self): 
    if self.syncTraining: 



     with tf.train.MonitoredTrainingSession(master=self.server.target, 
               is_chief=(self.task_index==0), 
               checkpoint_dir=self.logdir, 
               hooks=[self.sync_replicas_hook]) as self.session: 
      step = 0 
      try: 
       while not self.session.should_stop(): 
        # training 

        [trainx, trainy_] = self.session.run([self.trainx, self.trainy_]) 
        feed = {self.modelObj.x: trainx, self.modelObj.y_: trainy_, 
          self.modelObj.batch: self.batch_size, self.modelObj.keep_prob: 0.7} 
        _, trainloss = self.session.run([self.trainstep, self.modelObj.loss], feed_dict=feed) 

        print("step: %d, training loss %f" % (step, trainloss)) 

        step += 1 

      except tf.errors.OutOfRangeError: 
       print('training finished, number of epochs reached') 

答えて

1

解決策を見出した。

遅延も

time.sleep(5) 

を追加することにより、チーフ労働者のスタートは、パラメータサーバに対して同じ操作を行うと、CPUの代わりにGPUにパラメータサーバを実行してみてください。

2

はい、psはgpuに配置しないでください。 私もこの質問をしました。私は、tf.train.replica_device_setterのps_device = "/ job:ps/cpu:0"を明示的に要求して解決します。 全体のコードは次のようである:アグラワル@prateekする

with tf.device(tf.train.replica_device_setter(
           ps_device="/job:ps/cpu:0", 
           worker_device="/job:worker/task:%d" % (worker_index), 
           cluster=cluster_spec)): 

感謝

関連する問題