Toccata in Nowhere.

Tensorflow 指定训练GPU

2020.07.02

在使用多GPU服务器集群时,多用户使用会出现 GPU 资源拥塞的情况,需要指定使用某个特定GPU进行训练避免这种情况。

查询GPU编号

使用 nvidia-smi 查询 GPU 信息,例如:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.50       Driver Version: 430.50       CUDA Version: 10.1     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  TITAN V             Off  | 00000000:04:00.0 Off |                  N/A |
| 25%   34C    P8    N/A /  N/A |      0MiB / 12066MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  TITAN V             Off  | 00000000:06:00.0 Off |                  N/A |
| 26%   37C    P8    N/A /  N/A |      0MiB / 12066MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

其中 GPU 项即对应 GPU的编号。

指定使用的GPU

方法 1

引入os库设定系统变量CUDA_VISIBLE_DEVICES,指定可见GPU,例如:

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"

指定使用 0 号GPU。

方法 2

使用 tf.device()方法进行指定,例如:

tf.device('/gpu:2')

指定使用 2 号GPU。

方法 3

在运行 python 程序前,在 shell 里进行指定(同样是指定可见GPU),例如:

CUDA_VISIBLE_DEVICES=2 python train.py

指定使用 2 号GPU。

以上方法皆支持多GPU标注,例如:

CUDA_VISIBLE_DEVICES=1           Only device 1 will be seen
CUDA_VISIBLE_DEVICES=0,1         Devices 0 and 1 will be visible
CUDA_VISIBLE_DEVICES="0,1"       Same as above, quotation marks are optional
CUDA_VISIBLE_DEVICES=0,2,3       Devices 0, 2, 3 will be visible; device 1 is masked
CUDA_VISIBLE_DEVICES=""          No GPU will be visible