Как минимизировать оптимизатор в дистрибутиве с несколькими процессорами

#tensorflow #deep-learning #multi-gpu

#tensorflow #глубокое обучение #мульти-gpu

Вопрос:

Я пытаюсь адаптировать модель MNIST DL для одновременного запуска на многих графических процессорах. Однако я не могу найти способ заставить его работать. Я новичок в DL, поэтому я не до конца понимаю всю логику этого кода. Я пробовал много вещей, но, похоже, ничего не работало. Это код:

 strategy = tf.distribute.MirroredStrategy()

with strategy.scope():
  y_ = tf.placeholder(tf.float32, [None, 10])
  # LINES TO MAKE MODEL...
  y_conv = tf.matmul(h_fc1_drop, W_fc2)   b_fc2

  #Crossentropy
  cross_entropy = tf.reduce_mean(
      tf.nn.softmax_cross_entropy_with_logits_v2(labels=y_, logits=y_conv))
  
  train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)

  correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
  accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
 

Я получаю эту проблему:

 RuntimeError: Use `_distributed_apply()` instead of `apply_gradients()` in a cross-replica context.
 

Адаптация функции минимизации для использования этой _distributed_apply() функции не решает эту проблему. Если я изменю

   #train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
 

Для

   opt = tf.train.AdamOptimizer(1e-4)
  grads_and_vars = opt.compute_gradients(cross_entropy)
  train_step = opt._distributed_apply(strategy, grads_and_vars)
 

Я получаю следующую ошибку:

 Traceback (most recent call last):
  File "/home/baq/.local/lib/python3.7/site-packages/tensorflow/python/distribute/cross_device_ops.py", line 108, in _make_tensor_into_per_replica
    device = input_tensor.device
AttributeError: 'NoneType' object has no attribute 'device'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "multigpu.py", line 97, in <module>
    train_step = opt._distributed_apply(strategy, grads_and_vars)
  File "/home/baq/.local/lib/python3.7/site-packages/tensorflow/python/training/optimizer.py", line 665, in _distributed_apply
    ds_reduce_util.ReduceOp.SUM, grads_and_vars)
  File "/home/baq/.local/lib/python3.7/site-packages/tensorflow/python/distribute/distribute_lib.py", line 1254, in batch_reduce_to
    return self._batch_reduce_to(reduce_op, value_destination_pairs)
  File "/home/baq/.local/lib/python3.7/site-packages/tensorflow/python/distribute/mirrored_strategy.py", line 739, in _batch_reduce_to
    reduce_op, value_destination_pairs)
  File "/home/baq/.local/lib/python3.7/site-packages/tensorflow/python/distribute/cross_device_ops.py", line 285, in batch_reduce
    value_destination_pairs)
  File "/home/baq/.local/lib/python3.7/site-packages/tensorflow/python/distribute/cross_device_ops.py", line 133, in _normalize_value_destination_pairs
    per_replica = _make_tensor_into_per_replica(pair[0])
  File "/home/baq/.local/lib/python3.7/site-packages/tensorflow/python/distribute/cross_device_ops.py", line 110, in _make_tensor_into_per_replica
    raise ValueError("Cannot convert `input_tensor` to a `PerReplica` object "
ValueError: Cannot convert `input_tensor` to a `PerReplica` object because it doesn't have device set.
 

Есть идеи о том, как это решить? Спасибо.

Комментарии:

1. Какую версию TensorFlow вы используете? Похоже на 1.x. Это намеренно?

2. Я предполагаю, что вы уже просматривали документы. — TF — distributed_training и blogs — Масштабирование обучения на нескольких графических процессорах

3. > «tf.placeholder(tf.float32, [None, 10])» > «tf.train. AdamOptimizer» Это код TF1. Пожалуйста, не создавайте ничего нового в TF1.

4. Вы ищете этот документ: tensorflow.org/tutorials/distribute/custom_training