Это распространенное заблуждение в модели кодирования Tensorflow.Здесь вы видите конструкцию графа вычислений , НЕ фактическое выполнение.
Блок:
for i in xrange(FLAGS.num_gpus):
with tf.device('/gpu:%d' % i):
with tf.name_scope('%s_%d' % (cifar10.TOWER_NAME, i)) as scope:
# Dequeues one batch for the GPU
image_batch, label_batch = batch_queue.dequeue()
# Calculate the loss for one tower of the CIFAR model. This function
# constructs the entire CIFAR model but shares the variables across
# all towers.
loss = tower_loss(scope, image_batch, label_batch)
переводится в:
For each GPU device (`for i in range..` & `with device...`):
- build operations needed to dequeue a batch
- build operations needed to run the batch through the network and compute the loss
Обратите внимание, как с помощью tf.get_variable_scope().reuse_variables()
вы сообщаете графику, что переменные, используемые для графического графического процессора, должны быть общими для всех (т. Е. Все графики на нескольких устройствах «повторно используют» одни и те же переменные).
Ничто из этого на самом деле не запускает сеть один раз (обратите внимание, что sess.run()
нет): вы просто даете инструкции о том, как должны поступать данные.
Затем, когда вы начнете реальное обучение (я полагаю,вы пропустили этот фрагмент кода при копировании здесь) каждый графический процессор будет извлекать свой пакет и генерировать потери для каждой башни.Я предполагаю, что эти потери усредняются где-то в последующем коде, и среднее значение - это потери, передаваемые оптимизатору.
Вплоть до того момента, пока потери в башне не будут усреднены вместе, все не зависит от других устройств, поэтомуПакет и вычисление потерь может быть сделано параллельно.Затем обновление градиентов и параметров выполняется только один раз, переменные обновляются, и цикл повторяется.
Итак, чтобы ответить на ваш вопрос, no , вычисление потерь для каждой партии не сериализуется, нопоскольку это синхронное распределенное вычисление, вам нужно собрать все потери со всех графических процессоров, прежде чем продолжить работу по вычислению градиентов и обновлению параметров, поэтому у вас все еще есть некоторая часть графика, которая не может быть независимой.