Почему распределенная трассировка временной шкалы tensorflow помечает операцию QueueDequeue как операцию PS?

#tensorflow #tensorflow-serving

#tensorflow #обслуживание tensorflow

Вопрос:

Я запускаю распределенную начальную модель tensorflow на кластере компьютеров AWS ubuntu и выводю трассировки временной шкалы через

 # Track statistics of the run using Timeline
run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
run_metadata = tf.RunMetadata()

# Run
loss_value, step = sess.run([train_op, global_step], options=run_options, run_metadata=run_metadata)

# Create timeline and write it to a json file
tl = timeline.Timeline(run_metadata.step_stats)
ctf = tl.generate_chrome_trace_format()
with open('timeline%d.json' % FLAGS.task_id, 'w') as f:
f.write(ctf)
  

Когда я просматриваю временную шкалу, созданную рабочей машиной, я вижу это:
Трассировка временной шкалы для рабочей машины

Обратите внимание на операцию QueueDequeue справа, которая, как указано на временной шкале, является частью /job:ps/replica:0/task:0/cpu:0 , сервера параметров.

Поскольку ScatterUpdate выполняется сразу после QueueDequeue, как показано на изображении, я полагаю, что эта операция соответствует операции оптимизатора синхронизации реплик, в которой рабочий пытается удалить токен из очереди и выполнить обновление scatter: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/training/sync_replicas_optimizer.py#L412

Но если это так, эту операцию должен выполнять рабочий, а не сервер параметров. Почему временная шкала указывает, что сервер параметров выполняет это?

Я использую tensorflow 0.11, только для процессора.

Ответ №1:

Похоже, что это правильно и что операция удаления из очереди выполняется на PS. Просто рабочий имеет зависимость от этой операции, что означает, что рабочий, по сути, ожидает успешного удаления из очереди.