Tensorflow多GPU多会话

26

我有一个装有2个GPU的工作站,我想同时运行多个TensorFlow作业,这样我就可以同时训练多个模型等等。

例如,我尝试使用python API在脚本1.py中将会话分离到不同的资源上:

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,即使两个都可用也不会使用另一个。)

但是,如果一个脚本正在运行,我尝试运行另一个脚本,我总是会收到这个错误:

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)

我没试过,但这似乎会使两个进程尝试共享50%的每个GPU,而不是在单独的GPU上运行每个进程...

有人知道如何配置tensorflow只使用一个GPU并将另一个GPU留给另一个tensorflow进程吗?


我正在尝试同时运行多个TensorFlow作业。+1 - Guy Coder
1个回答

60

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让其可见的设备。


1
太好了,这个很有效。我之前一直在使用不同的进程。现在我能够在不同的GPU上运行独立的进程,并同时训练多个模型。此外,使用这种方法,无需在代码中指定tf.device,因为tensorflow会自动根据CUDA_VISIBLE_DEVICES进行使用。谢谢。 - j314erre
2
在Jupyter笔记本中使用os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"os.environ["CUDA_VISIBLE_DEVICES"]="0"。参考https://dev59.com/R1oU5IYBdhLWcg3wCjvx。 - Matt Kleinsmith
2
如果我们需要知道有多少个可用的GPU,我们可以运行以下命令:nvidia-smi -L。然后我们就能确定我们可以显示多少个CUDA设备了。 - Pablo Rivas
@mrry 这是并行运行还是串行运行? - Coddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接