0%

Keras在多GPU时指定单GPU执行以及显存控制,以及任务挂起的命令。

问题描述

实验室有一台服务器,其中有两块GPU,现在有几个人可能会去同时使用它,如果不进行GPU选择的话, 就一次只能执行一个任务,下一个任务去执行的时候就会提示错误,也就是资源不足。

所以这里需要指定任务使用哪一个GPU。

另外,如果不进行显存控制,只要任务跑起来,不管有多少个GPU,不管现在任务实际需要多少的显存, 不管现在任务实际是在哪一块GPU上面跑,所有的GPU的显存都会被占满,所以需要进行一下控制, 以便多人同时一起使用。

注意:这里针对的Backend是TensorFlow


解决方法

在代码的头部加入一下代码即可:

1
2
3
4
5
6
import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.5
config.gpu_options.visible_device_list = "1"
set_session(tf.Session(config=config))

这里的visible_device_list就指定了可见的GPU,也就是所使用的GPU。这里指定了1号GPU, 前面还有一张0号GPU。

这里的per_process_gpu_memory_fraction就指定了使用的GPU内存比例,这里设置了0.5。

运行任务时效果使用nvidia-smi命令查看:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 375.26 Driver Version: 375.26 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla K40m On | 0000:04:00.0 Off | 0 |
| N/A 28C P8 20W / 235W | 2MiB / 11439MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
| 1 Tesla K40m On | 0000:82:00.0 Off | 0 |
| N/A 50C P0 129W / 235W | 5860MiB / 11439MiB | 88% Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 1 19055 C python 5858MiB |
+-----------------------------------------------------------------------------+

可以看到只使用了1号GPU,同时只用了它的50%的显存。


一些小坑

1. 关于Keras版本2.0.9

对于这个版本,上面的代码并起不到效果,这是这个版本的BUG,在后续版本中就没有问题了。

我这直接升级了Keras到版本2.1.2,上面的代码就起了效果。


任务挂起

因为一般都是在linux环境下面跑,ssh建立起一个连接之后,在这个连接下面启动任务。 但是有时任务一下子执行不完,所以当然想把任务挂起来,即使这个ssh连接关闭,也不影响任务的执行。

很简单,使用nohup命令即可,它的使用方法为:

1
2
3
$ nohup 命令 > logs.file 2>&1 &

[1] 18864

这里的命令就是要挂起执行的命令,在跑python脚本的时候一般就是python xxx.py。 另外其中的logs.file就是中间打印文件进行重定向的文件,使用它来存下中间的打印结果。

执行命名完毕之后,就会有一个[1] 18864,表示这个进程的进程id。