web-dev-qa-db-ja.com

複数のGPUを使用するTensorflowの複数のセッション

2つのGPUを備えたワークステーションがあり、複数のテンソルフロージョブを同時に実行しようとしているため、一度に複数のモデルをトレーニングできます。

たとえば、script1.pyでpython APIを使用して、セッションを異なるリソースに分離しようとしました:

with tf.device("/gpu:0"):
    # do stuff

script2.pyで:

with tf.device("/gpu:1"):
    # do stuff

script3.py

with tf.device("/cpu:0"):
    # do stuff

各スクリプトを単独で実行すると、指定されたデバイスを使用していることがわかります。 (また、モデルは単一のGPUに非常によく適合し、両方が使用可能であっても別のGPUを使用しません。)

ただし、1つのスクリプトが実行されているときに別のスクリプトを実行しようとすると、常にこのエラーが発生します。

I tensorflow/core/common_runtime/local_device.cc:40] Local device intra op parallelism threads: 8
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:909] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_init.cc:103] Found device 0 with properties: 
name: GeForce GTX 980
major: 5 minor: 2 memoryClockRate (GHz) 1.2155
pciBusID 0000:01:00.0
Total memory: 4.00GiB
Free memory: 187.65MiB
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:909] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_init.cc:103] Found device 1 with properties: 
name: GeForce GTX 980
major: 5 minor: 2 memoryClockRate (GHz) 1.2155
pciBusID 0000:04:00.0
Total memory: 4.00GiB
Free memory: 221.64MiB
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 Y 
I tensorflow/core/common_runtime/gpu/gpu_init.cc:137] 1:   Y Y 
I tensorflow/core/common_runtime/gpu/gpu_device.cc:702] Creating    TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 980, pci bus id: 0000:01:00.0)
I tensorflow/core/common_runtime/gpu/gpu_device.cc:702] Creating TensorFlow device (/gpu:1) -> (device: 1, name: GeForce GTX 980, pci bus id: 0000:04:00.0)
I tensorflow/core/common_runtime/gpu/gpu_bfc_allocator.cc:42] Allocating 187.40MiB bytes.
E tensorflow/stream_executor/cuda/cuda_driver.cc:932] failed to allocate 187.40M (196505600 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
F tensorflow/core/common_runtime/gpu/gpu_bfc_allocator.cc:47] Check failed: gpu_mem != nullptr  Could not allocate GPU device memory for device 0. Tried to allocate 187.40MiB
Aborted (core dumped)

すべてのデバイスがモデルの実行に使用されるわけではない場合でも、ロード時に各tensorflowプロセスがマシン上のすべてのGPUを取得しようとしているようです。

各プロセスが使用するGPUの量を制限するオプションがあるようです

tf.GPUOptions(per_process_gpu_memory_fraction=0.5)

...私は試していませんが、2つのプロセスが各GPUで各プロセスを実行する代わりに、各GPUの50%を共有しようとするようです...

1つのGPUのみを使用し、他のGPUを別のTensorflowプロセスで使用できるようにtensorflowを構成する方法を知っている人はいますか?

19
j314erre

TensorFlowは、TensorFlowが認識できるすべてのGPUデバイス(メモリの同じ割合)を使用しようとします。異なるGPUで異なるセッションを実行する場合は、以下を実行する必要があります。

  1. 各セッションを異なるPythonプロセスで実行します。
  2. CUDA_VISIBLE_DEVICES環境変数 の異なる値で各プロセスを開始します。たとえば、スクリプトの名前がmy_script.pyで、4つのGPUがある場合、次のコマンドを実行できます。

    $ CUDA_VISIBLE_DEVICES=0 python my_script.py  # Uses GPU 0.
    $ CUDA_VISIBLE_DEVICES=1 python my_script.py  # Uses GPU 1.
    $ CUDA_VISIBLE_DEVICES=2,3 python my_script.py  # Uses GPUs 2 and 3.
    

    TensorFlowのGPUデバイスにはゼロから番号が付けられます(つまり、"/gpu:0"など)。ただし、これらはCUDA_VISIBLE_DEVICESで表示したデバイスに対応しています。

49
mrry