docker - 动态决定要在哪个GPU上运行-NVIDIA docker上的TF

标签 docker tensorflow cuda nvidia-docker

我有一个模型队列,因为我有2个GPU,所以我只允许并行执行2个模型。
为此,在我的代码开头,我尝试使用 GPUtil 确定哪个GPU可用。可能与之相关,此代码在使用--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,并让他们选择免费的GPU?

最佳答案

CUDA programming guide中所述,CUDA使用的默认设备枚举是“最快最快”:

CUDA_​DEVICE_​ORDER

FASTEST_FIRST, PCI_BUS_ID, (default is FASTEST_FIRST)

FASTEST_FIRST causes CUDA to guess which device is fastest using a simple heuristic, and make that device 0, leaving the order of the rest of the devices unspecified.

PCI_BUS_ID orders devices by PCI bus ID in ascending order.


如果设置CUDA_​DEVICE_​ORDER=PCI_BUS_ID,则CUDA顺序将与nvidia-smi显示的设备顺序匹配。
由于您使用的是docker,因此您还可以在我们的运行时中加强隔离:docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=0 ...但这是在容器启动时。

关于docker - 动态决定要在哪个GPU上运行-NVIDIA docker上的TF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49229883/

相关文章:

docker - 如何提高我的 Boot2Docker 虚拟机的性能

docker - 在定义的端口上运行 RC2 项目

python - 无法加载 native TensorFlow 运行时 - TensorFlow 2.1

tensorflow 精简版 : Cannot convert between a TensorFlowLite buffer and a ByteBuffer

CUDA 计算能力 1.0 比 3.5 快

python - 获取: "ERROR: Failed building wheel for xmlsec" when using docker to containerize flask app

python - 在全局上下文中使用一个 GradientTape

cuda常量内存引用

cuda - 为什么CUDA中没有简单的原子自增、自减操作?

macos - 如何连接到在 Docker 容器中运行的服务器?