2. 环境准备与工具
好,咱们进入第二章。这一章说白了就是“磨刀不误砍柴工”。
你想想看,排查GPU调度问题,手里没几把趁手的工具,那跟盲人摸象有什么区别?我个人习惯,在接手一套新的GPU集群时,第一件事就是把监控工具链搭起来。这章我就带你把这几个核心工具装好、配好。
2.1 nvidia-smi:最基础的“听诊器”
nvidia-smi 是NVIDIA官方自带的命令行工具。只要装了驱动,它就存在。我见过不少新手,一上来就搞复杂监控,结果连 nvidia-smi 的输出都读不全。这其实是最核心的起点。
安装
它不需要单独安装。你只要确认驱动装好了就行:
nvidia-smi
如果输出类似下面这样,说明环境OK:
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.86 Driver Version: 470.86 CUDA Version: 11.4 |
|-------------------------------+----------------------+----------------------+
| 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 T4 Off | 00000000:00:1E.0 Off | 0 |
| N/A 45C P0 29W / 70W | 0MiB / 15109MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
常用参数
我个人最常用的几个参数:
nvidia-smi -q:显示所有GPU的详细信息,包括温度、功耗、时钟频率等。nvidia-smi dmon:实时监控模式,每秒刷新一次。我在定位性能抖动时,经常开着这个窗口。nvidia-smi pmon:查看每个进程的GPU使用情况。嗯,这里要注意,它只能看到进程级别的显存和计算利用率,看不到线程级别的。
nvidia-smi dmon -d 1 配合 watch 命令,发现是某个进程在频繁申请和释放显存。这种“锯齿状”的显存变化,光看平均利用率是看不出来的。
2.2 DCGM:数据中心级别的“体检仪”
如果你管理的是几十上百张卡,光靠 nvidia-smi 一个个看,那得累死。DCGM(Data Center GPU Manager)就是干这个的。它不仅能采集指标,还能做健康检查和策略管理。
安装
我建议用官方仓库安装,干净利落:
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y datacenter-gpu-manager
# 启动服务
sudo systemctl start nvidia-dcgm
sudo systemctl enable nvidia-dcgm
验证安装
dcgmi discovery --list
# 应该能看到所有GPU的列表
核心功能
DCGM 提供了非常丰富的指标,我挑几个在调度排查中特别有用的:
| 指标名称 | 说明 | 我为什么关注它 |
|---|---|---|
sm_occupancy |
SM(流式多处理器)占用率 | 这个指标能告诉你GPU的计算单元到底“忙不忙”。有时候GPU-Util显示100%,但SM Occupancy很低,说明可能是内存带宽瓶颈,而不是计算瓶颈。 |
pcie_tx/rx_bytes |
PCIe传输速率 | 我在项目中遇到过,数据加载慢导致GPU空转,就是靠这个指标定位到PCIe链路降速的问题。 |
power_usage |
实时功耗 | 如果功耗远低于TDP(热设计功耗),但任务跑得慢,那大概率是任务本身没喂饱GPU。 |
dcgmi config --set -v 1。但要注意,这会增加一点CPU开销。
2.3 nvtop:GPU版的“htop”
说实话,我特别喜欢 nvtop。它把GPU信息可视化成了类似 htop 的界面,一眼就能看出每张卡、每个进程的状态。对于日常巡检,它比 nvidia-smi 直观得多。
安装
从源码编译是最稳妥的,因为有些发行版的包比较旧:
# 安装依赖
sudo apt-get install -y cmake libncurses5-dev libncursesw5-dev git
# 克隆并编译
git clone https://github.com/Syllo/nvtop.git
mkdir -p nvtop/build && cd nvtop/build
cmake ..
make
sudo make install
使用
直接运行 nvtop 就行。界面里,上半部分是GPU的整体状态(温度、频率、显存、利用率),下半部分是进程列表。你可以按 p 键按进程排序,按 c 键按GPU排序。
避坑指南: 我曾经在某个CentOS 7的机器上编译 nvtop,结果报错找不到 ncurses。后来发现是64位库没装全。解决办法:sudo yum install ncurses-devel.x86_64。嗯,这种小坑,遇到了就记住了。
2.4 GPU Exporter:Prometheus生态的“数据桥”
如果你在用Prometheus+Grafana做统一监控,那 nvidia_gpu_exporter 就是必选项。它把DCGM的指标暴露成Prometheus格式,方便你集成到现有监控体系里。
安装与配置
我一般用Docker部署,省心:
docker run -d \
--name nvidia-gpu-exporter \
--restart always \
--gpus all \
--pid host \
--network host \
-v /var/run/nvidia-dcgm:/var/run/nvidia-dcgm \
nvidia/dcgm-exporter:latest
验证
访问 http://localhost:9400/metrics,你应该能看到类似这样的输出:
# HELP DCGM_FI_DEV_GPU_UTIL GPU utilization (in %)
# TYPE DCGM_FI_DEV_GPU_UTIL gauge
DCGM_FI_DEV_GPU_UTIL{gpu="0",UUID="GPU-xxxxxxxx"} 45.0
集成到Prometheus
在 prometheus.yml 里加上这个job:
scrape_configs:
- job_name: 'nvidia_gpu'
static_configs:
- targets: ['localhost:9400']
file_sd_configs 或者Consul做服务发现,这样新增机器时不用改配置文件。我曾经手动维护过50台机器的target列表,那滋味,谁改谁知道。
知识体系总览
为了让你更直观地理解这几个工具的关系,我画了张图:
这张图想表达的是:所有工具都建立在NVIDIA驱动和DCGM引擎之上。nvidia-smi适合快速看一眼,nvtop适合交互式排查,而DCGM Exporter则是为大规模监控系统提供数据源。三者各有侧重,互相补充。