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を構成する方法を知っている人はいますか?
TensorFlowは、TensorFlowが認識できるすべてのGPUデバイス(メモリの同じ割合)を使用しようとします。異なるGPUで異なるセッションを実行する場合は、以下を実行する必要があります。
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
で表示したデバイスに対応しています。