硬件资源监控基础:CPU、GPU、内存、磁盘IO
做AI训练,说白了就是跟硬件资源打交道。我见过太多同学,模型写得很漂亮,一跑起来就卡死,连问题出在哪都不知道。嗯,今天我们就来聊聊硬件监控这件事。
我个人习惯,在开始任何训练任务之前,先看一眼资源全景图。就像开车前要检查油表、水温一样。你想想看,如果GPU显存都爆了,你还傻傻地等loss下降,那不是白费电吗?
CPU监控:别让大脑闲着
CPU在AI训练里,主要负责数据预处理、模型加载、控制逻辑这些活。虽然主力是GPU,但CPU要是拖后腿,GPU就得干等着。
关键指标:
- 使用率(%): 别只看总使用率,要看每个核心。我遇到过单核跑满100%,其他核心空闲的情况,那是数据加载线程卡住了。
- 负载(Load Average): 1分钟、5分钟、15分钟的平均值。如果负载远高于CPU核心数,说明任务排队了。
- 上下文切换(context switches): 这个值太高,说明CPU在频繁切换任务,效率很低。
我的经验: 有一次训练BERT,发现GPU利用率只有30%。查了半天,原来是CPU在解码TFRecord时卡住了。用htop一看,8个核心全在忙,但GPU就是吃不饱。后来改用多进程预处理,GPU利用率直接拉到95%。
常用工具:
top/htop:实时查看进程和资源mpstat:看每个CPU核心的详细情况pidstat:盯住某个进程的CPU行为
# 每2秒刷新一次,看所有CPU核心
mpstat -P ALL 2
# 盯住python进程
pidstat -p $(pgrep -f train.py) 1
GPU监控:训练的心脏
GPU是AI训练的发动机。我见过最惨的情况,是显存泄露导致训练到一半直接OOM,白跑了三天。
关键指标:
- 显存使用(Memory Usage): 看已用/总量。如果接近100%,小心OOM。
- GPU利用率(GPU-Util): 这个值低,说明GPU在摸鱼。要么是CPU喂不饱,要么是模型太小。
- 温度(Temperature): 超过85°C就要注意了。我曾经有一块卡长期在90°C跑,半年后性能就下降了。
- 功率(Power Draw): 如果远低于TDP,说明GPU没全力工作。
避坑指南: 我曾经用nvidia-smi看GPU利用率是100%,以为没问题。后来才发现,那是显存控制器利用率,不是计算单元利用率。真正的计算利用率要用nvidia-smi dmon或者Nsight Systems来看。
常用工具:
nvidia-smi:最基础,必会nvidia-smi dmon:实时监控,比smi更详细gpustat:更友好的输出格式
# 每1秒刷新一次,显示所有GPU
watch -n 1 nvidia-smi
# 更详细的监控
nvidia-smi dmon -s pucvmet -d 1
内存监控:别让系统崩了
系统内存不够,轻则swap导致训练变慢,重则直接被OOM Killer杀掉进程。我有个同事,训练到第99个epoch被杀了,欲哭无泪。
关键指标:
- 总内存 / 已用内存: 注意看可用内存,不是已用内存。因为Linux会把空闲内存拿来做缓存。
- Swap使用: 如果swap开始被大量使用,说明物理内存不够了。训练速度会断崖式下跌。
- OOM Killer日志: 用
dmesg | grep -i oom查看。如果看到这个,说明内存真的爆了。
注意: 很多人以为内存还剩很多,其实是被Page Cache占用了。用free -h看第二行-/+ buffers/cache才是真实可用内存。
# 看内存详情
free -h
# 看哪个进程在吃内存
top -o %MEM
磁盘IO:被忽视的瓶颈
磁盘IO是AI训练里最容易被忽视的瓶颈。你想想看,如果数据读取速度跟不上GPU计算速度,那GPU就得干等着。
关键指标:
- IOPS(每秒读写次数): 小文件多的话,IOPS容易成为瓶颈。
- 吞吐量(Throughput): 大文件读取看这个,比如加载预训练模型。
- IO等待时间(iowait): CPU花在等待IO上的时间。如果这个值高,说明磁盘太慢了。
- 队列长度(avgqu-sz): 等待处理的IO请求数。队列越长,延迟越高。
我的经验: 有一次训练图像模型,发现每个epoch都要等很久。用iostat一看,磁盘利用率才30%,但iowait高达40%。后来发现是文件系统碎片化严重,整理之后速度快了3倍。
常用工具:
iostat:看磁盘IO的详细情况iotop:看哪个进程在读写磁盘dstat:综合监控,CPU、内存、磁盘一起看
# 每2秒看一次磁盘IO
iostat -x 2
# 看哪个进程在疯狂读写
iotop -o
知识体系:一张图看懂
下面这张图,是我自己总结的硬件监控知识体系。你把它存下来,遇到问题对着查就行。
实战排查思路
遇到训练慢,别慌。按这个顺序查:
- 先看GPU利用率: 如果低于80%,说明GPU在等数据。
- 再看CPU iowait: 如果高,说明磁盘IO是瓶颈。
- 看内存和Swap: 如果Swap用了很多,说明内存不够。
- 最后看CPU负载: 如果负载高但GPU利用率低,说明CPU在忙别的事。
一个小技巧: 我习惯把监控命令写成一个脚本,训练开始就后台跑着。出问题时,直接看日志就能定位。别等到卡死了再查,那时候很多信息都丢了。
好了,硬件监控这块就聊到这。记住一句话:没有监控,就没有优化。先把这些工具用熟,后面讲瓶颈诊断的时候,你就能快速定位问题了。
想要更多资料,联系可可