いくつかのモデルを備えた標準のtensorflow Estimatorがあり、1つではなく複数のGPUで実行したいと考えています。データの並列処理を使用してこれをどのように行うことができますか?
Tensorflowドキュメントを検索しましたが、例は見つかりませんでした。 Estimatorがあれば簡単だと言っている文章だけ。
Tf.learn.Estimatorを使用した良い例はありますか?またはチュートリアルへのリンクなどですか?
私は tf.contrib.estimator.replicate_model_fn がよりクリーンなソリューションだと思います。以下は 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
_でラップし、model_fn()
をtf.contrib.estimator.replicate_model_fn()
でラップすることです。説明に従って、4つのGPUが搭載されたマシンでTPUスクイーズネットモデルを動作させました。私の変更 ここ 。
これで十分です。
リンク: https://www.youtube.com/watch?v=bRMGoPqsn2
詳細: 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)
スコープとデバイスを使用できます。
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
標準的な例は次のとおりです: https://github.com/tensorflow/tensorflow/blob/r1.4/tensorflow/contrib/learn/python/learn/estimators/estimator.py
データ並列で実行する1つの方法は、利用可能なGPUデバイスをループして、バッチのチャンクをモデルのコピーされたバージョンに送信し(すべてmodel_fn内で実行)、結果をマージすることです。
tf.distribute.MirroredStrategy
およびtf.estimator.train_and_evaluate
here を使用して例を見つけることができます。