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?
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 .
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)
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
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.
Ein Beispiel finden Sie mit tf.distribute.MirroredStrategy
und tf.estimator.train_and_evaluate
hier .