KerasのマルチGPU


33

複数のGPUでトレーニングを分割するために、kerasライブラリ(またはテンソルフロー)でどのようにプログラムできますか?8個のGPUを備えたAmazon ec2インスタンスにいて、それらすべてを使用してより高速にトレーニングしたいとしますが、コードは単一のCPUまたはGPU用です。


3
テンソルフローのドキュメントを確認しましたか?
n1tk

@ sb0709:今朝読み始めましたが、ケラでそれをどうやってやろうと思っていました
ヘクターブランディン

1
kerasではわかりませんが、テンソルフローの場合:tfは、CPUの場合(サポートされているGPUが存在する場合)でも、デフォルトで計算にGPUを使用します。したがって、forループを実行できます。「for d in ['/ gpu:1'、 '/ gpu:2'、 '/ gpu:3' ... '/ gpu:8'、]:」および「tf.device(d)」には、すべてのインスタンスGPUリソ​​ースが含まれている必要があります。したがって、実際にはtf.device()が使用されます。
n1tk

このような ??['/ gpu:1'、 '/ gpu:2'、 '/ gpu:3' ... '/ gpu:8'、]のd:tf.device(d)そしてそれは?私はそのようにしてみます:)
ヘクターブランディン

1
私が知っている限り、別のデバイスで任意のタスクを実行できます。
n1tk

回答:


37

Keras FAQから:

https://keras.io/getting-started/faq/#how-can-i-run-a-keras-model-on-multiple-gpus

以下は、「データ並列処理」を有効にするためのコピー&ペーストされたコードです。つまり、各GPUでデータの異なるサブセットを個別に処理します。

from keras.utils import multi_gpu_model

# Replicates `model` on 8 GPUs.
# This assumes that your machine has 8 available GPUs.
parallel_model = multi_gpu_model(model, gpus=8)
parallel_model.compile(loss='categorical_crossentropy',
                       optimizer='rmsprop')

# This `fit` call will be distributed on 8 GPUs.
# Since the batch size is 256, each GPU will process 32 samples.
parallel_model.fit(x, y, epochs=20, batch_size=256)

これは、執筆時点でTensorflowバックエンドに対してのみ有効であるように見えることに注意してください。

更新(2018年2月)

Kerasはmulti_gpu_modelを使用した自動gpu選択を受け入れるようになったため、gpusの数をハードコーディングする必要がなくなりました。このプルリクエストの詳細。つまり、これにより、次のようなコードが有効になります。

try:
    model = multi_gpu_model(model)
except:
    pass

しかし、より明確にするため、次のようなものに固執することができます。

parallel_model = multi_gpu_model(model, gpus=None)

ボーナス

すべてのGPU、特にNVIDIAを実際に使用しているかどうかを確認するには、以下を使用して端末の使用状況を監視できます。

watch -n0.5 nvidia-smi

参照:


multi_gpu_model(model, gpus=None)わずか1つのGPUがある場合には仕事を?使用可能なGPUの数に自動的に適応するのは素晴らしいことです。
CMCDragonkai

はい、私は、それは1つのGPUで動作すると思います参照github.com/keras-team/keras/pull/9226#issuecomment-361692460をしますが、あなたのコードは、単純なモデルの代わりにmulti_gpu_model上で実行するように構成されていることに注意する必要がある場合があります。ほとんどの場合、それはおそらく重要ではありませんが、中間層の出力を取得するようなことをしようとする場合は、それに応じてコーディングする必要があります。
weiji14

マルチGPUモデルの違いへの参照はありますか?
CMCDragonkai


その参照は素晴らしい@ weiji14でした。ただし、これが推論にどのように機能するかにも興味があります。ケラスは何らかの形でバッチを均等に分割しますか、または利用可能なモデルレプリカでラウンドロビンスケジュールを実行しますか?
CMCDragonkai

4
  1. TensorFlowの場合:

GPUを使用したTensorFlow

使用方法のサンプルコードを次に示します。したがって、各タスクについて、デバイス/デバイスのリストが指定されます。

# Creates a graph.
c = []
for d in ['/gpu:2', '/gpu:3']:
  with tf.device(d):
    a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3])
    b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2])
    c.append(tf.matmul(a, b))
with tf.device('/cpu:0'):
  sum = tf.add_n(c)
# Creates a session with log_device_placement set to True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# Runs the op.
print(sess.run(sum))

tfは、CPUの場合(サポートされているGPUが存在する場合)でも、デフォルトで計算にGPUを使用します。したがって、forループを実行できます。「for d in ['/ gpu:1'、 '/ gpu:2'、 '/ gpu:3' ... '/ gpu:8'、]:」および「tf.device(d)」には、すべてのインスタンスGPUリソ​​ースが含まれている必要があります。したがって、実際にはtf.device()が使用されます。

Kerasモデルトレーニングを複数のGPUにスケーリングする

  1. ケラス

args.num_gpusよりもMxnetを使用するKerasの場合、num_gpusは必要なGPUのリストです。

def backend_agnostic_compile(model, loss, optimizer, metrics, args):
  if keras.backend._backend == 'mxnet':
      gpu_list = ["gpu(%d)" % i for i in range(args.num_gpus)]
      model.compile(loss=loss,
          optimizer=optimizer,
          metrics=metrics, 
          context = gpu_list)
  else:
      if args.num_gpus > 1:
          print("Warning: num_gpus > 1 but not using MxNet backend")
      model.compile(loss=loss,
          optimizer=optimizer,
          metrics=metrics)
  1. horovod.tensorflow

すべてのUberオープンソースのHorovodに加えて、素晴らしいと思います。

ホロヴォード

import tensorflow as tf
import horovod.tensorflow as hvd

# Initialize Horovod
hvd.init()

# Pin GPU to be used to process local rank (one GPU per process)
config = tf.ConfigProto()
config.gpu_options.visible_device_list = str(hvd.local_rank())

# Build model…
loss = 
opt = tf.train.AdagradOptimizer(0.01)

# Add Horovod Distributed Optimizer
opt = hvd.DistributedOptimizer(opt)

# Add hook to broadcast variables from rank 0 to all other processes during
# initialization.
hooks = [hvd.BroadcastGlobalVariablesHook(0)]

# Make training operation
train_op = opt.minimize(loss)

# The MonitoredTrainingSession takes care of session initialization,
# restoring from a checkpoint, saving to a checkpoint, and closing when done
# or an error occurs.
with tf.train.MonitoredTrainingSession(checkpoint_dir=“/tmp/train_logs”,
                                      config=config,
                                      hooks=hooks) as mon_sess:
 while not mon_sess.should_stop():
   # Perform synchronous training.
   mon_sess.run(train_op)

2

基本的に、次の例を使用できます。必要なのは、kerasのインポート後にcpuおよびgpuの消費値を指定することです。

import keras

config = tf.ConfigProto( device_count = {'GPU': 1 , 'CPU': 56} )
sess = tf.Session(config=config) 
keras.backend.set_session(sess)

その後、モデルに適合します。

model.fit(x_train, y_train, epochs=epochs, validation_data=(x_test, y_test))

最後に、上限の作業ではなく、消費値を減らすことができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.