一、需求背景和目标
要将nvidia-smi信息记录下来保存在log文件中,后续通过log文件中的内容生成显存使用量折线图,便于进行GPU用量监控。
本文章记录需求实现第一部分:将nvidia-smi信息记录下来保存在log文件中
二、实现思路
1、每天自动生成一个log文件,命名格式为:gpu_usage_yyyy_mm_dd.log。
2、确定log文件中需要记录的内容:日期、时间、GPU编号、UUID、GPU名字/类型、显存使用率、GPU使用率、GPU最大值。用echo写入表头。
其中GPU编号、UUID、GPU名字/类型是在多卡场景下使用的。
3、利用nvidia-smi --query-gpu获取所需信息。
4、把数据写入log文件
三、代码实现
1、每日自动生成log文件
date = $(date +"%Y-%m-%d") #获取当日日期
log = "./gpu_usage_$date.log" #log文件存放的位置
# 查找log文件是否存在,若不存在,则创建文件,并将表头写入
if [ ! -f "$log" ]; then
echo "use_date,use_time,gpu_index,gpu_uuid,gpu_name,gpu_util,mem_use_snap_mib,mem_mib_max" >> "$log"
fi
2、利用nvidia-smi --query-gpu获取所需信息
use_time = $(date +"%Y-%m-%d,%H:%M:%S") # 获取日期和时间,此处是需求方要求。
# 也可以直接通过nvidia-smi --query-gpu=timestamp获取时间戳
gpu = $(nvidia-smi --query-gpu=index,uuid,name,utilization.gpu,memory.used,memory.total --format=csv,noheader,nounits)
# 循环遍历每一张显卡信息
while IFS=',' read -ra gpu_i;do
gpu_index=${gpu_i[0]}
gpu_uuid=${gpu_i[1]}
gpu_name=${gpu_i[2]}
gpu_util=${gpu_i[3]}
mem_use_snap_mib=${gpu_i[4]}
mem_mib_max=${gpu_i[5]}
echo "$use_time,$gpu_index,$gpu_uuid,$gpu_name,$gpu_util,$mem_use_snap_mib,$mem_mib_max" >> "$log"
done <<<"$gpu"
3、最后记得crontab -e加入到定时任务中,不断执行此脚本实现监控功能。也可以nvidia-smi后面加 l1 ,即每秒执行一次。
四、实现效果
nvidia-smi信息:
log文件记录的内容: