web-dev-qa-db-fra.com

Comment exécuter Tensorflow Estimator sur plusieurs GPU avec parallélisme de données

J'ai un estimateur de tensorflow standard avec un modèle et je veux l'exécuter sur plusieurs GPU au lieu d'un seul. Comment cela peut-il être fait en utilisant le parallélisme de données? 

J'ai effectué une recherche dans la documentation Tensorflow, mais je n'ai pas trouvé d'exemple. seulement des phrases disant que ce serait facile avec Estimator.

Est-ce que quelqu'un a un bon exemple en utilisant le tf.learn.Estimator? Ou un lien vers un tutoriel ou plus?

10
andy

Je pense que tf.contrib.estimator.replicate_model_fn est une solution plus propre. Ce qui suit est extrait de 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))

Ce que vous devez faire est d’emballer l’optimiseur avec tf.contrib.estimator.TowerOptimize et model_fn() avec tf.contrib.estimator.replicate_model_fn(). J’ai suivi la description et fait en sorte que le modèle squeezenet TPU fonctionne sur une machine à 4 GPU. Mes modifications ici .

5
freedom

Vous pouvez utiliser scope et device pour cela:

 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:

Exemple complet à cet endroit: https://github.com/tensorflow/models/blob/master/tutorials/image/cifar10/cifar10_multi_gpu_train.py }

1
Vincent Teyssier

L'exemple standard est: https://github.com/tensorflow/tensorflow/blob/r1.4/tensorflow/contrib/learn/python/learn/estimators/estimator.py

Une façon de l'exécuter en parallèle des données consiste à effectuer une boucle sur les périphériques GPU disponibles et à envoyer des fragments de votre lot aux versions copiées de votre modèle (le tout dans votre fichier model_fn), puis à fusionner les résultats. 

1
jonas25007