问题描述
实验室有一台服务器,其中有两块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。