順番にではなく、並列で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 ..」です。
どうすれば希望の結果を得ることができますか?
**質問の編集が表示されるので、これを回答に追加します**
操作を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