web-dev-qa-db-ja.com

tensorflowマルチGPU並列使用

順番にではなく、並列で8GPUを使用したいと思います。

たとえば、このコードを実行すると、

import tensorflow as tf

with tf.device('/gpu:0'):
    for i in range(10):
        print(i)

with tf.device('/gpu:1'):
    for i in range(10, 20):
        print(i)

Cmdコマンド 'CUDA_VISIBLE_DEVICE =' 0,1 'を試しましたが、結果は同じです。

「010 1 11 2 3 12 ....など」の結果を見たい

しかし、実際の結果は順番に「0 1 2 3 4 5 ..... 10 11 1213 ..」です。

どうすれば希望の結果を得ることができますか?

5
younginsong

**質問の編集が表示されるので、これを回答に追加します**

操作をTensorflowセッションに渡す必要があります。そうしないと、コードは(多くのプログラミング言語と同様に)シーケンシャルとして解釈され、操作はシーケンシャルに完了します。

質問の以前の理解のために、以下で説明する複数のGPUを使用してニューラルネットワークのトレーニングを作成するための議論:

悪いニュースは、単にこれを行う魔法の機能がないことです。

良いニュースは、いくつかの確立された方法があるということです。

1つ目は、モデルを複数のGPUに複製し、CPUを介して同期する、一部のCUDAや他のGPU開発者にとってなじみのあるものです。これを行う1つの方法は、データセットをバッチに分割するか、この場合はタワーと呼ばれ、各GPUにタワーをフィードすることです。これがMNISTデータセットであり、2つのGPUがある場合は、CPUをデバイスとして明示的に使用してこのデータの開始を開始できます。これで、データセットが小さくなると、相対的なバッチサイズが大きくなる可能性があります。エポックを完了すると、勾配を共有し、平均して両方のネットワークをトレーニングできます。もちろん、これは8GPUを使用する場合に簡単に拡張できます。

最小限の例 タスクの分散とCPUでの結果の収集を以下に示します。

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

ただし、多くのデバイス間でデータを転送すると、正確にyour_gpu_number倍のアクセラレーションを得ることができなくなります。したがって、パフォーマンスを最大化するために各GPUのワークロードを最適化し、デバイス間の通信を可能な限り回避する必要があります。

2つ目は、ニューラルネットワークをいくつかのデバイスに分割し、トレーニングしてマージすることです。

複数のGPUでモデルを明示的に実行するには、その方法でアルゴリズムを設定する必要があります。これらをチェックしてください:

https://www.tensorflow.org/guide/using_gpu#using_multiple_gpus

https://Gist.github.com/j-min/69aae99be6f6acfadf2073817c2f61b

3
Semih Korkmaz