Основная идея примера с несколькими графическими процессорами заключается в том, что вы явно назначаете операции для tf.device
.В этом примере выполняется цикл по FLAGS.num_gpus
устройствам и создается реплика для каждого из графических процессоров.
Если вы создадите операции-заполнители внутри цикла for, они будут назначены соответствующим устройствам.Все, что вам нужно сделать, это сохранить дескрипторы созданных заполнителей, а затем передать их все независимо в одном вызове session.run
.
placeholders = []
for i in range(FLAGS.num_gpus):
with tf.device('/gpu:%d' % i):
plc = tf.placeholder(tf.int32)
placeholders.append(plc)
with tf.Session() as sess:
fd = {plc: i for i, plc in enumerate(placeholders)}
sess.run(sum(placeholders), feed_dict=fd) # this should give you the sum of all
# numbers from 0 to FLAGS.num_gpus - 1
Чтобы обратиться к вашему конкретному примеру, достаточно заменить batch_queue.dequeue()
вызовите конструкцию двух заполнителей (для тензоров image_batch
и label_batch
), сохраните эти заполнители где-нибудь, а затем укажите нужные значения.
Другой (несколько хакерский) способ - переопределитьТензоры image_batch
и label_batch
непосредственно в вызове session.run
, потому что вы можете feed_dict любой тензор (не только заполнитель).Вам все равно нужно где-то хранить тензоры, чтобы иметь возможность ссылаться на них из вызова run
.