wake-up-neo.com

So führen Sie Tensorflow Estimator auf mehreren GPUs mit Datenparallelität aus

Ich habe einen Standard Tensorflow Estimator mit einigen Modellen und möchte ihn auf mehreren GPUs statt auf nur einer ausführen. Wie kann dies unter Verwendung der Datenparallelität erreicht werden? 

Ich habe die Tensorflow-Dokumente durchsucht, aber kein Beispiel gefunden. Nur Sätze, die sagen, dass es mit Estimator einfach wäre.

Hat jemand ein gutes Beispiel mit dem tf.learn.Estimator? Oder einen Link zu einem Tutorial oder so?

10
andy

Ich denke, dass tf.contrib.estimator.replicate_model_fn eine sauberere Lösung ist. Das Folgende ist aus tf.contrib.estimator.replicate_model_fn documentation,

...
def model_fn(...):  # See `model_fn` in `Estimator`.
  loss = ...
  optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)
  optimizer = tf.contrib.estimator.TowerOptimizer(optimizer)
  if mode == tf.estimator.ModeKeys.TRAIN:
    #  See the section below on `EstimatorSpec.train_op`.
    return EstimatorSpec(mode=mode, loss=loss,
                         train_op=optimizer.minimize(loss))

  #  No change for `ModeKeys.EVAL` or `ModeKeys.PREDICT`.
  return EstimatorSpec(...)
...
classifier = tf.estimator.Estimator(
  model_fn=tf.contrib.estimator.replicate_model_fn(model_fn))

Was Sie tun müssen, ist, Optimizer mit tf.contrib.estimator.TowerOptimize und model_fn() mit tf.contrib.estimator.replicate_model_fn()..__ zu umschließen. Ich folgte der Beschreibung und ließ ein TPU-Squeezenet-Modell auf einem Computer mit 4 GPUs funktionieren. Meine Modifikationen hier .

5
freedom

Ich denke das ist alles was du brauchst.

Link: https://www.youtube.com/watch?v=bRMGoPqsn2

Weitere Details: https://www.tensorflow.org/api_docs/python/tf/distribute/Strategy

Erklärt: https://medium.com/tensorflow/multi-gpu-training-with-estimators-tf-keras-and-tf-data-ba584c3134db

NUM_GPUS = 8
dist_strategy = tf.contrib.distribute.MirroredStrategy(num_gpus=NUM_GPUS)
config = tf.estimator.RunConfig(train_distribute=dist_strategy)
estimator = tf.estimator.Estimator(model_fn,model_dir,config=config)
1
HARSH PATHAK

Sie können Umfang und Gerät dafür verwenden:

 with tf.variable_scope(tf.get_variable_scope()):
  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:

Vollständiges Beispiel dort: https://github.com/tensorflow/models/blob/master/tutorials/image/cifar10/cifar10_multi_gpu_train.py

1

Das Standardbeispiel ist: https://github.com/tensorflow/tensorflow/blob/r1.4/tensorflow/contrib/learn/python/learn/estimators/estimator.py

Sie können Daten parallel ausführen, indem Sie die verfügbaren GPU-Geräte durchlaufen lassen und Teile Ihres Stapels an kopierte Versionen Ihres Modells senden (alle innerhalb Ihres model_fn). Anschließend werden die Ergebnisse zusammengeführt. 

1
jonas25007

Ein Beispiel finden Sie mit tf.distribute.MirroredStrategy und tf.estimator.train_and_evaluatehier .

0
Ali