2016-01-17 9 views
16

私のマシンに3台のGTX Titan GPUがあります。私はcifar10_train.pyとCifar10に提供された例を実行すると、次の出力ました:TensorFlowはデフォルトで、マシン内のすべての使用可能なGPUを使用しますか?

I tensorflow/core/common_runtime/gpu/gpu_init.cc:60] cannot enable peer access from device ordinal 0 to device ordinal 1 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:60] cannot enable peer access from device ordinal 1 to device ordinal 0 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:127] DMA: 0 1 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 0: Y N 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 1: N Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:694] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX TITAN, pci bus id: 0000:03:00.0) 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:694] Creating TensorFlow device (/gpu:1) -> (device: 1, name: GeForce GTX TITAN, pci bus id: 0000:84:00.0) 

それはTensorFlow 2つのデバイス(gpu0とgpu1)に自分自身を初期化しようとしているように私には見えますが。

私の質問は、それは2つのだけのデバイス上でそれを行うと、それを防ぐためにどのような方法があるのはなぜですか? (私は、単一のGPUがあるかのように実行したい)

+1

は、[全体のリソースを占有しないようにTFを強制する方法を発見されましたか? (multi-gpuに関する)](https://groups.google.com/a/tensorflow.org/forum/#!searchin/discuss/gpu/discuss/QmMqfikKxlU/BC5P4XrDEgAJ)[CUDA_VISIBLE_DEVICES - Masking GPUs](http ://acceleware.com/blog/cudavisibledevices-masking-gpus) –

+0

これは本当に役立ちます。しかし、なぜTensorFlowはマシン上のすべてのデバイスに対して自動的に初期化されますか? Btwは私が受け入れる答えを出します。 – Zk1001

+0

TensorFlowは、「研究への生産」を目指しています。すべての計算能力を使用するデフォルトは、仕事をできるだけ早く完了させるという期待に応えているようです。実際にチューニングすることができます。しかし、あなたは3つのGPUについて言及しており、2つしかあなたのログには表示されません。どうして? –

答えて

19

参照:Using GPUs

マニュアルデバイス配置

お好みのデバイス上で実行するために特定の操作を希望の場合自動的に選択されたものの代わりに、tf.deviceを使用して、そのコンテキスト内のすべての操作が同じデバイス割り当てを持つようにデバイスコンテキストを作成することができます。

# Creates a graph. 
with tf.device('/cpu:0'): 
  a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a') 
  b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b') 
c = tf.matmul(a, b) 
# 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(c)) 

あなたは今aとbがcpu:0に割り当てられていることがわかります。デバイスが明示的にMatMul操作のために指定されていなかったので、TensorFlowランタイムは操作と使用可能なデバイス(GPU:0この例では)に基づいていずれかを選択し、必要に応じて、自動的にデバイス間のテンソルをコピーします。以前

Device mapping: 
/job:localhost/replica:0/task:0/gpu:0 -> device: 0, name: Tesla K40c, pci bus 
id: 0000:05:00.0 
b: /job:localhost/replica:0/task:0/cpu:0 
a: /job:localhost/replica:0/task:0/cpu:0 
MatMul: /job:localhost/replica:0/task:0/gpu:0 
[[ 22.  28.] 
 [ 49.  64.]] 

2.

を参照してください回答:あなたはあなたの中に複数のGPUを持っている場合は、マルチGPUシステム

上の単一のGPUを使用してUsing GPUs

をシステムでは、IDが最も小さいGPUがデフォルトで選択されます。あなたが別のGPU上で実行したい場合は、明示的に設定を指定する必要があります。

# Creates a graph. 
with tf.device('/gpu:2'): 
    a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a') 
    b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b') 
    c = tf.matmul(a, b) 
# 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(c) 

以前CUDA_VISIBLE_DEVICES – Masking GPUs

から1

回答あなたのCUDAアプリケーションをい特定のGPUをターゲットにする必要がありますか? GPU対応コードを記述している場合は、通常、デバイスクエリを使用して、 で目的のGPUを選択します。しかし、 テストのための迅速かつ簡単な解決策は、あなたのCUDAアプリケーションが見ているデバイスを制限 に環境変数CUDA_VISIBLE_DEVICESを使用することです。あなたはノード上のリソースを共有しようとしているか、 あなたのGPUが特定のGPUをターゲットに実行可能な有効にしたい場合、これは 便利です。

環境変数構文

= 1つののみがデバイス1

CUDA_VISIBLE_DEVICESは CUDA_VISIBLE_DEVICESが分かるであろう結果= 0,1デバイス0と1は、上記のように=」0,1” 同じ可視 CUDA_VISIBLE_DEVICESなり、引用符はオプションです CUDA_VISIBLE_DEVICES = 0,2,3デバイス0,2,3が表示されます。デバイス1 がマスクされています

CUDAはゼロから始まる可視デバイスを列挙します。最後の の場合、デバイス0,2,3がデバイス0,1,2として表示されます。 を文字列の順序を「2,3,0」に変更すると、デバイス2,3,0が列挙されます それぞれ0,1,2とする。 が存在しないデバイスにCUDA_VISIBLE_DEVICESが設定されていると、すべてのデバイスがマスクされます。 の有効なデバイス番号と無効なデバイス番号の組み合わせを指定できます。無効な値 の前のすべてのデバイスが列挙され、無効な値の後のすべてのデバイスは にマスクされます。

システムで使用可能なハードウェアのデバイスIDを確認するには、 を使用して、CUDA SDKに含まれているNVIDIAのdeviceQuery実行可能ファイルを実行できます。 ハッピープログラミング!

クリス・メイソン

+0

私はまったく同じでした。しかし、私が '' 'nvidia-smi''を実行すると、すべてのgpuデバイスから同じ量のメモリが使用されていました。 –

+0

リンク先テンソルフロー情報が古い/壊れています。代わりに(2017/10現在)、以下を試してください:https://www.tensorflow.org/tutorials/using_gpu – michael

+0

@Michael Thanks。更新された答え。 –

関連する問題