如题所示,介绍深度学习中的gpu 的使用。

  1. nvidia-smi

查看GPU 的信息: nvidia-smi 这个是查看NVIDIA 显卡的命令。今天详细解读一下 nvidia-smi 命令。

上面的表格中的红框中的信息与下面的四个框的信息是一一对应的:

GPU:GPU 编号; Name:GPU 型号; Persistence-M:持续模式的状态。持续模式虽然耗能大,但是在新的GPU应用启动时,花费的时间更少,这里显示的是off的状态; Fan:风扇转速,从0到100%之间变动; Temp:温度,单位是摄氏度; Perf:性能状态,从P0到P12,P0表示最大性能,P12表示状态最小性能(即 GPU 未工作时为P0,达到最大工作限度时为P12)。 Pwr:Usage/Cap:能耗; Memory Usage:显存使用率; Bus-Id:涉及GPU总线的东西,domain🚌device.function; Disp.A:Display Active,表示GPU的显示是否初始化; Volatile GPU-Util:浮动的GPU利用率; Uncorr. ECC:Error Correcting Code,错误检查与纠正; Compute M:compute mode,计算模式。

  1. 设置定时任务

crontab 默认是 nano 编辑器,不好用,将 crontab 改为 vim 编辑器

直接定义变量指定 crontab 为 vim 编辑器

1
export EDITOR="/usr/bin/vim" ; crontab -e

或使用更简单的方式,直接从重新指定 crontab 的默认编辑器,执行以下命令,选择对应编辑器的编号即可

1
select-editor
1
2
3
crontab -e # 编辑该用户下的所有任务
crontab -l  # 表示列出所有的定时任务
crontab -r  # 表示删除用户的定时任务,当执行此命令后,所有用户下面的定时任务会被删除,

注意在配置的时候,使用绝对路径。因为 crontab 默认没有环境变量,所以使用绝对路径执行命令

1
2
3
4
5
6
7
crontab文件中的行由6个字段组成,不同字段间用空格或者tab键分割。前5个字段指定命令要运行的时间
分钟(0-59)
小时(0-28)
日期(1-31)
月份(1-12)
星期几(0-6,其中0代表星期日)
第六个字段是一个要在适当时间执行的字符串

例子

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#MIN HOUR DAY MONTH DAYOFWEEK COMMAND

#每天早上6点10分
10 6 * * * date

#没两个小时
0 */2 * * * date

#晚上11点到早上8点之间每2个小时,早上8点
0 23-7/2,8 * * * date

#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * mon-wed date

#1月份一号早上4点
0 4 1 jan * date
  1. 监控GPU 的使用情况

watch 命令:可以将命令的输出结果输出到标准输出设备,多用于周期性执行命令/定时执行命令 命令的格式:watch[参数][命令]

GPU利用率:显存占用和GPU利用率是两个不一样的东西,显卡是由GPU计算单元和显存等组成的,显存和GPU的关系有点类似于内存和CPU的关系。

方法一:

1
watch -n 10 nvidia-smi

常使用的参数为

1
2
3
4
5
6
7
8
memory.total
memory.free
memory.used

index
name 
power.draw
power.limit
1
2
nvidia-smi --query-gpu=gpu_name,gpu_bus_id,vbios_version --format=csv
nvidia-smi --query-gpu=gpu_name,gpu_bus_id,vbios_version --format=csv

方法二:

这里推荐一个好用的小工具:gpustat,直接pip install gpustat即可安装,gpustat基于nvidia-smi,可以提供更美观简洁的展示,结合watch命令,可以动态实时监控GPU的使用情况。

1
watch --color -n1 gpustat -cpu 

显存可以看成是空间,类似于内存。显存用于存放模型,数据。显存越大,所能运行的网络也就越大。那么模型中哪里使用到显存呢?

  • 需要计算每一层的feature map的形状(多维数组的形状)
  • 需要保存输出对应的梯度用以反向传播(链式法则)
  • 显存占用与 batch size 成正比
  • 模型输出不需要存储相应的动量信息。 深度学习中神经网络的显存占用,我们可以得到如下公式:

显存占用 = 模型显存占用 + batch_size × 每个样本的显存占用

可以看出显存不是和batch-size简单的成正比,尤其是模型自身比较复杂的情况下:比如全连接很大,Embedding层很大

节省显存一般有如下方法:

  • 降低batch-size
  • 下采样(NCHW -> (1/4)*NCHW)
  • 减少全连接层(一般只留最后一层分类用的全连接层)

【解决抢卡争端】为Tensorflow和PyTorch自动选择空闲GPU

除了使用 nvidia-smi 命令查看 显存占用情况,想要得到更加详细的内容可以使用以下的命令。

1
ps -elf | grep python

然后结合 kill 命令处理

一般来说,double image resolution (2 *2), 然后对于 gpu memory 是之前的四倍。

获取 GPU 使用情况

  1. gpu-info

Script to get GPU usage on multiple GPU servers This is used to monitor which users are using how much memory overall, per host, and per GPU, on multiple GPU servers. NOTE: This only works with servers using NVIDIA’s GPUs. 这个脚本实现的功能比较全,好好使用学习一下

  1. gpustat

这个命令是初级的,适合简单看一下使用情况

1
pip install gpustat

针对某个程序优化GPU 的使用

GPUs are optimized to parallelize the feature generation process and hence will give better results when multiple images are passed instead of just one image. The opportunity to improve can be seen based on GPU Utilization. Low GPU Utilization indicates an opportunity to further improve the througput.

目的是为了最大程度的提高gpu 的使用效率,设置不同的

1
2
3
4
5
6
7
8
9
# GPU Utilization can be seen using the nvidia-smi command. To update it every half a second
watch -n .5 nvidia-smi
    
# To pool the GPU utilization every second and dump into a file
nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits -f gpu_utilization.csv -l 1
    
# To calculate median GPU Utilization from the file generated
sort -n gpu_utilization.csv | datamash median 1

安装 datamash 的教程: https://www.gnu.org/software/datamash/download/