news 2026/4/23 18:00:20

如何监控GPU算力使用情况?NVIDIA-smi进阶用法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何监控GPU算力使用情况?NVIDIA-smi进阶用法

如何监控GPU算力使用情况?NVIDIA-smi进阶用法

在现代深度学习和大模型训练中,GPU早已不是“插上就能跑”的简单加速器。当你启动一个千亿参数的模型训练任务时,如果发现GPU利用率长期徘徊在10%以下,而CPU却满载运转——这种典型的“算力空转”现象,往往意味着资源的巨大浪费。问题出在哪?数据加载瓶颈?显存碎片?还是某个隐藏进程偷偷占用了显存?

这时候,最直接、最可靠的诊断工具就是nvidia-smi

作为NVIDIA官方提供的系统管理接口,nvidia-smi不仅是查看GPU状态的第一道窗口,更是深入性能调优的核心利器。它不像某些第三方工具那样依赖Python封装或存在兼容性问题,而是直接对接底层NVML(NVIDIA Management Library),具备极高的稳定性和权威性。掌握它的进阶用法,相当于给你的AI系统装上了“实时心电监护仪”。


从硬件到命令:nvidia-smi是如何工作的?

nvidia-smi的本质,是 NVML 库的一个命令行前端。NVML 是一个C语言级别的API集合,运行在内核态驱动之上,能够直接读取GPU硬件寄存器中的运行时信息。这意味着它获取的数据几乎是“零中间层”的原始指标。

当你执行一条nvidia-smi命令时,整个流程如下:

  1. 用户输入命令;
  2. nvidia-smi可执行程序调用 NVML API;
  3. NVML 通过 GPU 驱动与物理设备通信;
  4. 硬件返回当前状态(如SM利用率、显存占用、温度等);
  5. 数据被格式化后输出到终端。

这个过程不需要额外服务进程支持,只要安装了CUDA驱动即可使用,因此具有极强的通用性和低侵入性。

更重要的是,由于它是轮询机制,默认每秒刷新一次数据,非常适合用于长时间监控训练任务的状态变化趋势。


实战中的六种高阶用法

1. 快速体检:一眼看懂GPU健康状况

最基础也是最常用的命令:

nvidia-smi

这条命令会列出所有GPU设备的基本信息:型号、驱动版本、CUDA兼容性、温度、功耗、显存使用率以及正在运行的进程。对于刚登录服务器的工程师来说,这是第一道“安检门”。

但要注意,默认输出可能会隐藏一些关键细节。例如,某些后台服务(如编码器、推理守护进程)可能不会出现在主列表中。建议结合--query-gpu显式指定字段,确保无遗漏。


2. 动态追踪:让GPU负载“动起来”

如果你正在调试一个训练脚本,想观察其GPU利用率是否平稳上升,可以启用自动刷新模式:

nvidia-smi -l 2

这会让终端每2秒自动重绘一次GPU状态。相比手动重复敲命令,这种方式能更直观地捕捉到瞬时波动。

⚠️ 小贴士:不要设置过短的刷新间隔(如-l 0.1)。频繁调用虽然看起来更“实时”,但实际上会给系统带来不必要的I/O压力,尤其在多卡环境下可能导致显示延迟甚至卡顿。

推荐生产环境中设为2~5秒,既能满足监控需求,又不影响系统稳定性。


3. 进程溯源:谁在偷我的显存?

当PyTorch报出“CUDA out of memory”错误,但你发现nvidia-smi显示显存并未占满时,别急着调小batch size——很可能是因为显存碎片或僵尸进程作祟。

此时应该精准定位每个进程的显存消耗:

nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv

该命令只查询参与计算的进程(compute apps),排除视频解码等非计算类应用干扰,并以CSV格式输出,便于后续脚本处理。

举个真实案例:某次训练失败后排查发现,一个小时前结束的Jupyter内核并未完全退出,其残留进程仍持有近8GB显存。正是这条命令帮助我们快速锁定了“真凶”。


4. 日志归档:构建可回溯的性能轨迹

对于需要长期运行的大模型预训练任务,仅靠肉眼观察远远不够。我们需要结构化的日志记录,以便事后分析性能拐点。

这时就要用到dmon模式(daemon monitor):

nvidia-smi dmon -s u -o TD -f gpu_log.csv
  • -s u表示采集利用率相关数据(包括GPU、内存带宽等);
  • -o TD添加时间戳和设备ID;
  • -f指定输出文件。

生成的日志类似这样:

#Time gpu pwr gtemp mtemp sm mem enc dec 2025/04/05-10:00:01, 0, 250W, 67C, N/A, 98%, 75%, 0%, 0% 2025/04/05-10:00:02, 0, 250W, 67C, N/A, 97%, 74%, 0%, 0% ...

这类数据可以直接导入Python进行可视化分析,比如绘制训练过程中GPU利用率随epoch的变化曲线,识别是否存在周期性空闲,进而优化数据流水线设计。


5. 资源隔离:限制功耗防止“一人超载,全员断电”

在共享服务器或多租户环境中,经常出现某个用户启动超大规模训练任务,导致整机功耗超标、电源保护跳闸的情况。

解决方案之一是使用功耗墙(power limit)功能:

nvidia-smi -pl 250

将指定GPU的最大功耗锁定在250W(前提是硬件支持)。A100/H100通常默认为300W以上,适当下调可在牺牲少量性能的前提下大幅提升系统稳定性。

⚠️ 注意事项:
- 此操作需 root 权限;
- 修改后重启失效(除非写入持久化脚本);
- 过度限制可能导致SM频率降频,影响吞吐量。

建议先在测试环境验证性能衰减程度再上线使用。


6. 减少冷启动延迟:开启持久模式

在高频调用的推理服务中,频繁创建和销毁CUDA上下文会导致明显的初始化延迟。这是因为GPU默认处于“节能模式”,每次调用都需要重新唤醒。

解决办法是启用持久模式(Persistence Mode):

nvidia-smi -pm 1

开启后,GPU驱动始终保持激活状态,即使没有任务运行也不会休眠。虽然会略微增加待机功耗,但对于QPS较高的在线服务而言,响应延迟可降低数十毫秒级别。

特别适合部署在 Triton Inference Server 或自研推理框架中的场景。


在真实AI系统中的角色定位

在一个典型的AI训练架构中,nvidia-smi并不参与实际计算,而是作为“旁观者”存在于操作系统层,位于GPU驱动与上层框架之间:

+---------------------+ | 训练框架 (ms-swift) | +----------+----------+ | v +----------+----------+ | PyTorch / CUDA | +----------+----------+ | v +----------+----------+ | NVIDIA Driver | +----------+----------+ | v +----------+----------+ | nvidia-smi (NVML) | +----------+----------+ | v +----------+----------+ | GPU 硬件 | +---------------------+

它就像一位沉默的审计员,默默记录着每一颗GPU的心跳、呼吸与负荷。这些数据不仅可以用于人工排查,还能成为自动化运维系统的“燃料”。

例如,在Kubernetes集群中,可通过Device Plugin暴露GPU指标,并结合Prometheus抓取nvidia-smi输出,最终在Grafana中实现全集群GPU资源热力图展示。


典型问题诊断实战

问题一:GPU利用率低,但训练慢得离谱

现象描述
GPU compute utilization 长期低于30%,显存充足,但每个step耗时很长。

排查步骤
1. 执行nvidia-smi -l 1观察利用率是否呈锯齿状波动;
2. 同时打开htoptop查看CPU使用率;
3. 若发现CPU核心持续接近100%,基本可判定为数据加载瓶颈

根本原因
DataLoader 的num_workers设置过小,或磁盘IO性能不足,导致GPU经常“饿着等数据”。

优化建议
- 增加num_workers(一般设为CPU核心数的一半);
- 使用prefetch_factor提前加载下一批数据;
- 考虑将数据集缓存至SSD或内存中。


问题二:显存报错,但监控显示还有空余

典型错误信息
RuntimeError: CUDA out of memory. Tried to allocate 1.2 GiB.

nvidia-smi显示显存仅用了16/24GB。

可能原因
- PyTorch 的内存池机制导致碎片化;
- 已释放的张量未及时归还给操作系统;
- 存在隐式缓存(如autograd graph、kernel launch cache)。

应对策略
- 主动调用torch.cuda.empty_cache()清理缓存;
- 使用torch.utils.checkpoint减少中间激活存储;
- 检查是否有循环引用阻止GC回收;
- 最终手段:重启进程或容器。


问题三:多人共用服务器,资源争抢严重

典型场景
团队共享一台8卡A100服务器,不同成员同时训练模型,互相抢占显存和算力。

治理思路
1.透明化:编写定时脚本,每天汇总各用户的GPU使用时长、峰值显存、平均功耗,生成报表;
bash nvidia-smi --query-gpu=index,name,utilization.gpu,memory.used --format=csv -l 60 >> daily_usage.log
2.规范化:制定资源使用守则,鼓励使用Docker或Slurm进行资源隔离;
3.技术约束:通过sudo规则限制普通用户执行危险命令(如nvidia-smi -r重置GPU);
4.自动化报警:当某卡显存占用超过90%持续5分钟,自动发送邮件提醒负责人。


设计与工程实践建议

监控频率怎么选?

  • 交互式调试:1~2秒刷新一次足够;
  • 批量任务监控:可设为5秒,减少日志体积;
  • 短时任务(<1分钟):无需持续监控,任务前后各采样一次即可;
  • 长期训练:推荐使用dmon模式记录完整生命周期数据。

避免盲目追求“高精度”采样,否则会产生大量冗余数据,反而增加分析成本。


日志如何管理?

  • 输出格式优先选择CSV 或 JSON,便于程序解析;
  • 文件命名包含日期和任务ID,如gpu_log_train_llama3_20250405.csv
  • 自动归档脚本每日压缩并上传至对象存储;
  • 敏感信息(如PID)可在脱敏后再上传至中心化日志平台(如ELK);

权限控制不可忽视

nvidia-smi默认需要访问/dev/nvidiactl设备节点,通常属于video组。在多用户环境中应做好权限划分:

  • 普通用户允许查看状态;
  • 禁止修改功耗、重置GPU等高危操作;
  • 可通过sudoers配置细粒度命令白名单:
# /etc/sudoers.d/nvidia-smi %ai-team ALL=(ALL) NOPASSWD: /usr/bin/nvidia-smi --query-*, /usr/bin/nvidia-smi -l * !%ai-team ALL=(ALL) ALL: /usr/bin/nvidia-smi -r *, /usr/bin/nvidia-smi -pl *

与其他工具协同增效

虽然nvidia-smi功能强大,但在大规模集群中往往需要配合其他工具使用:

工具适用场景nvidia-smi关系
dcgmi数据中心级GPU监控基于同一NVML,提供更丰富的遥测
gpustat更友好的终端显示底层仍调用nvidia-smi
Prometheus + Node Exporter指标采集与告警可通过文本收集器抓取nvidia-smi输出
Kubernetes Device Plugin容器化资源调度向Pod暴露GPU状态

特别是在云原生AI平台中,nvidia-smi的结构化输出已成为构建可观测性的基石。


写在最后

nvidia-smi看似只是一个简单的命令行工具,但它承载的是对GPU资源的深刻理解与精细掌控。它不像高级框架那样炫目,却始终站在幕后,默默守护每一次训练的顺利进行。

真正优秀的AI工程师,不会等到OOM才去查显存,也不会在训练停滞时束手无策。他们会在任务开始前就建立监控基线,在运行中持续观察资源画像,在问题发生时迅速定位根源。

而这其中最关键的一步,往往就是打开终端,敲下那句熟悉的:

nvidia-smi

掌握它的进阶用法,不只是学会几条命令,更是建立起一种系统性的资源意识——知道算力从何而来,又因何流失。这种能力,才是支撑大规模模型工程落地的真正底气。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 13:35:53

【写作】如何写出高SEO排名的技术文章?关键词布局技巧

如何写出高SEO排名的技术文章&#xff1f;关键词布局实战解析 在AI技术日新月异的今天&#xff0c;一个开源项目的成败&#xff0c;早已不只取决于代码质量。即便你开发出功能强大、架构优雅的大模型训练框架&#xff0c;如果没人知道它的存在&#xff0c;再先进的技术也只能沉…

作者头像 李华
网站建设 2026/4/23 12:25:42

AI图像修复技术:让破损图像重获新生的智能解决方案

你是否曾为那些承载珍贵记忆的老照片上的划痕而叹息&#xff1f;是否因心仪图片上的水印和多余文字而烦恼&#xff1f;在传统图像修复需要专业技巧和大量时间的今天&#xff0c;AI技术正以前所未有的方式改变这一现状。 【免费下载链接】IOPaint 项目地址: https://gitcode.…

作者头像 李华
网站建设 2026/4/23 12:10:46

容器镜像瘦身革命:从487MB到192MB的Docker构建优化之道

容器镜像瘦身革命&#xff1a;从487MB到192MB的Docker构建优化之道 【免费下载链接】ingress-nginx Ingress-NGINX Controller for Kubernetes 项目地址: https://gitcode.com/GitHub_Trending/in/ingress-nginx &#x1f680; 想象一下&#xff0c;每次部署都要等待近5…

作者头像 李华
网站建设 2026/4/23 10:44:18

从Node.js到Golang:面向对象编程的5个关键思维转变

从Node.js到Golang&#xff1a;面向对象编程的5个关键思维转变 【免费下载链接】golang-for-nodejs-developers Examples of Golang compared to Node.js for learning &#x1f913; 项目地址: https://gitcode.com/gh_mirrors/go/golang-for-nodejs-developers 对于习…

作者头像 李华
网站建设 2026/4/22 21:20:59

突破传统:5种创新方式构建下一代AI应用

突破传统&#xff1a;5种创新方式构建下一代AI应用 【免费下载链接】Gemini-API ✨ An elegant async Python wrapper for Google Gemini web app 项目地址: https://gitcode.com/gh_mirrors/gem/Gemini-API 在当今快速发展的AI领域&#xff0c;寻找高效可靠的Gemini AP…

作者头像 李华
网站建设 2026/4/23 10:43:59

【Docker微服务负载均衡实战】:5步实现高可用服务架构

第一章&#xff1a;Docker微服务负载均衡实战概述在现代云原生架构中&#xff0c;Docker容器化技术已成为构建微服务系统的基石。随着服务实例的动态扩展与高可用需求的增长&#xff0c;负载均衡成为保障系统稳定性和性能的关键环节。本章将深入探讨如何在 Docker 环境中实现高…

作者头像 李华