web-dev-qa-db-ja.com

TensorFlowはデフォルトでマシンで利用可能なすべてのGPUを使用しますか?

私のマシンには3つのGTX Titan GPUがあります。 Cifar10で提供されている例をcifar10_train.pyで実行し、次の出力を取得しました。

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つあるかのように実行したいだけです)

17
Zk1001

参照: GPUの使用

デバイスの手動配置

自動的に選択されるデバイスではなく、選択したデバイスで特定の操作を実行したい場合は、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)に基づいて1つを選択し、必要に応じてデバイス間でテンソルを自動的にコピーします。

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の使用

システムに複数のGPUがある場合、最小の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)

以前の回答1。

From CUDA_VISIBLE_DEVICES –マスキングGP

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

環境変数の構文

結果

CUDA_VISIBLE_DEVICES = 1デバイス1のみが表示されますCUDA_VISIBLE_DEVICES = 0,1デバイス0と1が表示されますCUDA_VISIBLE_DEVICES =” 0,1”上記と同じ、引用符はオプションですCUDA_VISIBLE_DEVICES = 0,2,3デバイス0、2、3は見える;デバイス1はマスクされています

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

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

クリスメイソン

22
Guy Coder