Я пытаюсь обучить модель CNN, используя механизм параллелизма данных. Я публикую фрагмент кода метода поезда для простоты,
def train_model(file_loc='', data_details='', epochs='',checkpoint='', learning_rate=1e-5):
train_initializer = data_details['train_it_init']
test_initializer = data_details['test_it_init']
iterator = data_details['iterator']
batch_list = [iterator.get_next() for _ in range(NUM_GPUS)]
with tf.device('/cpu:0'):
num_class=14
tower_grads = []
tower_losses = []
opt = tf.train.AdamOptimizer(learning_rate)
dropout_rate = tf.placeholder(tf.float32)
for i in range(NUM_GPUS):
with tf.variable_scope(tf.get_variable_scope()):
with tf.device('/gpu:{}'.format(i)), tf.name_scope('tower_{}'.format(i)) as scope:
xbatch, ybatch = batch_list[i]
total_loss = tower_loss(scope, xbatch, ybatch, dropout_rate=dropout_rate)
tower_grads.append(opt.compute_gradients(total_loss))
avg_grads = average_gradients(tower_grads)
train_op = opt.apply_gradients(avg_grads)
Я пытаюсь использовать 4 GPU (NUM_GPUS), но проблема в том, что одновременно активен только 1 GPU. Кажется, каждый графический процессор выполняет свою работу, но в последовательном порядке. Я не могу понять, почему он так себя ведет. Я использую набор данных api, итератор и инициализатор итератора находятся в словаре data_details (проверено, работает), а вывод модели вызывается внутри вызова метода tower_loss (..) в рамках определенной переменной и области имен. Любое предложение будет очень полезно.
Мой GPU использует, как показано ниже,
Использование GPU