Как все мы знаем, TensorFlow Distributed Runtime позволяет легко обмениваться переменными между пс и работниками.Но я удивляюсь такой ситуации:
Мы объявляем переменные в ps: 0, но обновляем их на worker: 0, используя assign_add, где будет работать эта операция (assign_add)?
По моему мнению, в TensorFlow есть два возможных способа.
Кандидат 1: Поскольку переменная counter
находится в узле ps
, поэтому рабочий отправит 1
на пс и выполнить assign_add(1)
в пс .
Кандидат 2: Поскольку assign_add(1)
выполняется на сеансе работника, таким образом, работниквытащите переменную counter
из ps, обновите ее, запустив op assign_add(1)
, и отправьте ее обратно в ps.
(еще один вопрос: является ли последний шаг в Candidate 2, который отправляет его обратно в ps, необязательным?)
# ...
if FLAGS.job_name == 'ps':
with tf.device('/job:ps/task:0'):
counter = tf.Variable(0, name='counter', trainable=False)
with tf.Session(server.target):
sess.run(tf.global_variables_initializer())
elif FLAGS.job_name == 'worker':
with tf.device('/job:ps/task:0'):
counter = tf.Variable(0, name='counter', trainable=False)
with tf.Session(server.target):
sess.run(counter.assign_add(1))
Добро пожаловать в ваши советы, которые помогут мне более детально понять распределенный Tensorflow :)