我有一个模型队列,我只允许并行执行 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,并让他们选择免费的?