1

我有一个模型队列,我只允许并行执行 2 个模型,因为我有 2 个 GPU。为此,在我的代码开头,我尝试使用GPUtil. --runtime=nvidia也许它是相关的,这段代码在使用标志启动的 docker 容器中运行。

确定在哪个 GPU 上运行的代码如下所示:

import os
import GPUtil
gpu1, gpu2 = GPUtil.getGPUs()

available_gpu = gpu1 if gpu1.memoryFree > gpu2.memoryFree else gpu2
os.environ['CUDA_VISIBLE_DEVICES'] = str(available_gpu.id)

import tensorflow as tf

现在,我以这种方式启动了两个脚本(稍有延迟,直到第一个脚本占用了 GPU),但它们都尝试使用同一个 GPU!

我进一步检查了问题 - 我手动设置os.environ['CUDA_VISIBLE_DEVICES'] = '1'并让模型运行。在训练时,我检查了输出nvidia-smi并看到以下内容

user@server:~$ docker exec awesome_gpu_container nvidia-smi
Mon Mar 12 06:59:27 2018       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.111                Driver Version: 384.111                   |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 980 Ti  Off  | 00000000:01:00.0  On |                  N/A |
|  0%   50C    P2   131W / 280W |   5846MiB /  6075MiB |     81%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX 1080    Off  | 00000000:03:00.0 Off |                  N/A |
|  0%   39C    P8    14W / 200W |      2MiB /  8114MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

而且我注意到,虽然我已将可见设备设置为1它实际上在 0 上运行

我再次强调,我的任务是对多个模型进行排队,每个开始运行的模型都会自行决定使用哪个 GPU。

我探索了allow_soft_placement=True,但是在两个 GPU 上都分配了内存,所以我停止了这个过程。

最重要的是,我如何确保我的训练脚本只使用一个 GPU,并让他们选择免费的?

4

1 回答 1

3

CUDA 编程指南中所述,CUDA使用的默认设备枚举是“最快的优先”:

CUDA_​DEVICE_​ORDER

FASTEST_FIRST,PCI_BUS_ID,(默认为 FASTEST_FIRST)

FASTEST_FIRST 使 CUDA 使用简单的启发式方法猜测哪个设备最快,并将该设备设为 0,其余设备的顺序未指定。

PCI_BUS_ID 按 PCI 总线 ID 升序排列设备。

如果您设置CUDA_​DEVICE_​ORDER=PCI_BUS_IDCUDA 排序将匹配显示的设备排序nvidia-smi

由于您使用的是 docker,您还可以通过我们的运行时强制执行更强的隔离:
docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=0 ...
但那是在容器启动时。

于 2018-03-13T01:16:34.650 回答