如何 运行 在具有数据并行性的多个 GPU 上使用 Tensorflow Estimator

How to run Tensorflow Estimator on multiple GPUs with data parallelism

我有一个带有某些模型的标准 tensorflow Estimator,我想 运行 在多个 GPU 而不是一个 GPU 上使用它。如何使用数据并行性来做到这一点?

我搜索了 Tensorflow Docs 但没有找到示例;只有句子说使用 Estimator 会很容易。

有没有人有使用 tf.learn.Estimator 的好例子?或者 link 教程之类的?

标准示例是:https://github.com/tensorflow/tensorflow/blob/r1.4/tensorflow/contrib/learn/python/learn/estimators/estimator.py

运行 数据并行的一种方法是循环可用的 GPU 设备,并将批处理的块发送到模型的复制版本(全部在您的 model_fn 中完成),然后合并结果。

您可以为此使用示波器和设备:

 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:

完整示例: https://github.com/tensorflow/models/blob/master/tutorials/image/cifar10/cifar10_multi_gpu_train.py

我认为 tf.contrib.estimator.replicate_model_fn is a cleaner solution. The following is from tf.contrib.estimator.replicate_model_fn 文档,

...
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))

您需要做的是用 tf.contrib.estimator.TowerOptimize 包装优化器,用 tf.contrib.estimator.replicate_model_fn() 包装优化器 model_fn()。 我按照描述使 TPU squeezenet 模型在具有 4 个 GPU 的机器上运行。我的修改here.

我想这就是您所需要的。

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

更多详情:https://www.tensorflow.org/api_docs/python/tf/distribute/Strategy

解释: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)

已更新

对于 TF-2.0 和 Keras,您可以使用它 (https://www.tensorflow.org/tutorials/distribute/keras)

您可以找到使用 tf.distribute.MirroredStrategytf.estimator.train_and_evaluate here 的示例。