硬件资源监控基础: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

知识体系:一张图看懂

下面这张图,是我自己总结的硬件监控知识体系。你把它存下来,遇到问题对着查就行。

硬件资源监控知识体系 CPU • 使用率(单核/总) • 负载(Load Avg) • 上下文切换 • 工具:top, htop mpstat, pidstat 瓶颈:数据预处理慢 GPU • 显存使用 • GPU-Util(计算) • 温度 / 功率 • 工具:nvidia-smi gpustat, dmon 瓶颈:显存OOM 内存 • 可用内存(真实) • Swap使用情况 • OOM Killer日志 • 工具:free, top vmstat, dmesg 瓶颈:进程被杀死 磁盘IO • IOPS / 吞吐量 • iowait时间 • 队列长度 • 工具:iostat iotop, dstat 瓶颈:数据加载慢 核心思路:先看GPU是否吃饱 → 再看CPU是否喂饱 → 最后查磁盘和内存 哪个指标异常,就顺着对应模块的工具去排查 推荐组合拳 1. 全局概览:dstat -c -d -g -i -l -m -n -p -t 1 2. GPU专项:nvidia-smi dmon -s pucvmet -d 1 3. 进程级:pidstat -p $(pgrep -f train) 1 4. 磁盘级:iostat -x 1

实战排查思路

遇到训练慢,别慌。按这个顺序查:

  1. 先看GPU利用率: 如果低于80%,说明GPU在等数据。
  2. 再看CPU iowait: 如果高,说明磁盘IO是瓶颈。
  3. 看内存和Swap: 如果Swap用了很多,说明内存不够。
  4. 最后看CPU负载: 如果负载高但GPU利用率低,说明CPU在忙别的事。

一个小技巧: 我习惯把监控命令写成一个脚本,训练开始就后台跑着。出问题时,直接看日志就能定位。别等到卡死了再查,那时候很多信息都丢了。

好了,硬件监控这块就聊到这。记住一句话:没有监控,就没有优化。先把这些工具用熟,后面讲瓶颈诊断的时候,你就能快速定位问题了。

想要更多资料,联系可可