从入门到精通:nvidia-smi命令全解析与实战指南

菩提流支

1. 认识nvidia-smi:GPU监控的瑞士军刀

第一次接触nvidia-smi是在调试深度学习模型的时候。当时模型训练突然卡住,导师让我"看看GPU状态",我一脸茫然地输入这个命令,屏幕上跳出的信息表格让我瞬间找到了问题——显存被占满了。这个黑底绿字的命令行工具,从此成了我每天打交道最多的伙伴。

nvidia-smi全称NVIDIA System Management Interface,是NVIDIA显卡驱动的标配工具。无论是Linux还是Windows系统,只要安装了官方驱动,这个工具就会自动装好。它的核心功能可以概括为三个方面:实时监控(查看GPU状态)、动态调整(修改运行参数)和数据记录(生成监控报告)。对于深度学习开发者、高性能计算工程师或者普通运维人员来说,掌握nvidia-smi就相当于拥有了GPU系统的听诊器。

与市面上各种图形化监控工具相比,nvidia-smi有几个不可替代的优势:首先是零成本集成,不需要额外安装;其次是低资源消耗,在服务器上运行几乎不占性能;最重要的是脚本友好,所有操作都能通过命令行完成,非常适合自动化运维。我见过很多资深的AI工程师,他们可能不记得PyTorch的API,但nvidia-smi的参数却用得炉火纯青。

2. 基础查询:读懂GPU的健康报告

2.1 最简命令与关键指标

在终端直接输入nvidia-smi,你会看到一个类似这样的表格:

bash复制+-----------------------------------------------------------------------------+
| NVIDIA-SMI 470.57.02    Driver Version: 470.57.02    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 V100-SXM2...  On   | 00000000:00:04.0 Off |                    0 |
| N/A   34C    P0    24W / 300W |      0MiB / 16160MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

这个表格包含了几十个关键参数,我们先来看最重要的几个:

  • GPU-Util:就像CPU使用率,这个数字显示GPU的计算核心有多忙。如果长期低于50%,可能你的代码没有充分利用GPU。
  • Memory-Usage:显存使用情况。深度学习模型经常会占满显存,这里能直观看到还剩多少"内存"。
  • Temp:温度指标。超过80℃就要警惕了,高温会触发降频保护。
  • Perf:性能状态,从P0(最高性能)到P12(最低功耗)。如果看到不是P0,说明GPU可能被限制了。

2.2 进程级监控:谁在占用我的GPU?

表格最下方通常会显示进程列表:

code复制+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|    0   N/A  N/A      1623      G   /usr/lib/xorg/Xorg                  4MiB |
|    0   N/A  N/A      2175      G   gnome-shell                         8MiB |
|    0   N/A  N/A    385987      C   python3                         16024MiB |
+-----------------------------------------------------------------------------+

这里的信息对排查问题特别有用:

  • PID:进程ID,可以直接用kill -9 PID结束异常进程
  • Type:C代表计算进程(如训练模型),G代表图形进程(如桌面环境)
  • GPU Memory:每个进程占用的显存大小

我经常用这个功能找出"显存泄漏"的元凶——有些程序结束后没有释放显存,这里会显示为"僵尸进程"。

3. 高级监控:让数据自己说话

3.1 定时刷新与自动化记录

基础命令只能看瞬时状态,要监控长时间运行的任务,需要加上-l参数:

bash复制nvidia-smi -l 2  # 每2秒刷新一次

但真正实用的还是记录到文件的功能。这个命令会把监控数据保存为CSV:

bash复制nvidia-smi -l 1 --format=csv --filename=gpu_log.csv \
--query-gpu=timestamp,name,utilization.gpu,memory.used,temperature.gpu

参数解析:

  • -l 1:每秒记录一次
  • --format=csv:保存为Excel可打开的格式
  • --query-gpu:自定义记录的字段(时间戳、GPU型号、使用率等)

我曾经用这个功能发现过一个有趣的现象:模型训练初期GPU使用率会周期性波动,原来是数据加载跟不上计算速度。后来增加了数据预读取线程,训练效率提升了30%。

3.2 定制化查询:只看你想看的

nvidia-smi支持近百种查询字段,通过这个命令查看全部选项:

bash复制nvidia-smi --help-query-gpu

比如想监控PCIe带宽利用率:

bash复制nvidia-smi -q -d pcie  # -q表示详细查询,-d指定查询维度

输出会包含这样的信息:

code复制PCIe
    Max Link Speed:8.0 GT/s
    Current Link Speed:8.0 GT/s
    Max Link Width:16x
    Current Link Width:16x

这对诊断数据传输瓶颈特别有帮助。有一次我发现GPU使用率很低但训练速度慢,查到这里显示Link Width只有4x,原来是主板插槽没接好。

4. 实战技巧:解决真实场景问题

4.1 多GPU环境下的精准控制

服务器上通常有多块GPU,-i参数可以指定某块卡:

bash复制nvidia-smi -i 1  # 只查看第二块GPU(编号从0开始)

要一次性查看所有GPU的概要:

bash复制nvidia-smi -L  # 列出所有GPU的UUID和型号

更复杂的场景比如设置计算模式(适合多用户共享服务器):

bash复制nvidia-smi -i 0 -c 1  # 将0号GPU设为独占进程模式

模式说明:

  • 0/DEFAULT:默认共享模式
  • 1/EXCLUSIVE_PROCESS:单进程独占整卡
  • 2/PROHIBITED:禁止计算任务

4.2 性能调优:解锁隐藏潜能

很多人不知道nvidia-smi还能直接调整GPU设置:

bash复制nvidia-smi -pm 1  # 启用持久模式(减少启动延迟)
nvidia-smi -pl 250  # 设置功率上限为250瓦
nvidia-smi -rgc  # 重置GPU时钟(解决降频问题)

最实用的要数风扇控制。服务器在机房噪音大没关系,但我的工作站风扇全速转起来像飞机起飞:

bash复制nvidia-smi -i 0 -fan 70  # 设置0号GPU风扇速度为70%

注意:修改功率和时钟等操作需要管理员权限,且可能影响稳定性

5. 自动化运维:脚本与定时任务

5.1 智能监控脚本

原始文章给的脚本有个小问题——超时控制不够优雅。这是我改进后的版本:

bash复制#!/bin/bash
# gpu_monitor.sh [duration_seconds] [output_file]

timeout=$1
log_file=${2:-"gpu_log_$(date +%Y%m%d).csv"}

nvidia-smi -l 1 --format=csv --filename=$log_file \
--query-gpu=timestamp,name,utilization.gpu,memory.used,power.draw &

pid=$!
sleep $timeout
kill -15 $pid  # 温和地终止进程

echo "监控数据已保存到 $log_file"

使用方式:

bash复制chmod +x gpu_monitor.sh
./gpu_monitor.sh 3600 training_log.csv  # 监控1小时

5.2 异常告警系统

结合crontab和邮件工具,可以打造GPU监控系统:

bash复制# 在crontab中添加(每小时检查一次)
0 * * * * nvidia-smi --query-gpu=utilization.gpu,temperature.gpu --format=csv | awk -F',' '{if($1>90||$2>80) print "警报: GPU过载!"}' | mail -s "GPU告警" admin@example.com

这个命令会在GPU使用率>90%或温度>80℃时发邮件告警。我曾经靠这个及时发现了一个失控的训练任务,避免了服务器宕机。

6. 常见问题排查指南

6.1 命令无响应的解决方案

有时候nvidia-smi会卡住,通常是因为:

  1. 驱动崩溃:尝试sudo systemctl restart nvidia-*
  2. GPU被锁定:用sudo lsof /dev/nvidia*查看占用进程
  3. 内核问题:可能需要sudo rmmod nvidia_uvm nvidia_drm nvidia_modeset nvidia后重新加载

6.2 数据不准的调试方法

如果发现GPU使用率显示为0%,但实际明显在计算:

  1. 检查驱动版本:nvidia-smi -a | grep "Driver Version"
  2. 尝试详细模式:nvidia-smi -q -d utilization
  3. 使用更精确的工具:nvtopdcgm

有次我遇到GPU-Util始终显示0%,后来发现是Docker容器内的驱动版本不匹配。升级容器镜像后问题解决。

7. 扩展应用:与其他工具的结合

7.1 在Python中调用nvidia-smi

通过subprocess模块可以轻松集成:

python复制import subprocess

def get_gpu_util():
    cmd = "nvidia-smi --query-gpu=utilization.gpu --format=csv,noheader,nounits"
    output = subprocess.check_output(cmd.split()).decode('utf-8')
    return float(output.strip())

while True:
    util = get_gpu_util()
    if util > 80:
        print(f"警告: GPU使用率 {util}%")
    time.sleep(5)

7.2 与Prometheus集成

通过nvidia_gpu_exporter可以将监控数据接入Prometheus:

bash复制docker run -d --name nvidia_exporter \
--runtime=nvidia \
-v /run/prometheus:/run/prometheus \
nvidia/gpu-monitoring-tools:2.0

然后在Grafana中就能看到漂亮的GPU监控面板了。

内容推荐

Win10 + CUDA 10.2 + ZED 2i SDK 环境搭建全攻略:从驱动检查到Python API部署
本文详细介绍了在Win10系统下搭建ZED 2i双目相机开发环境的完整流程,包括CUDA 10.2和ZED SDK的安装配置、Python API部署及常见问题解决方案。通过硬件兼容性检查、环境变量配置和实战代码示例,帮助开发者高效完成环境搭建并优化开发体验,特别适合计算机视觉和AI应用开发者参考。
CMake + Qt Linguist:自动化翻译工作流的构建与集成
本文详细介绍了如何在CMake项目中构建与集成Qt Linguist自动化翻译工作流,涵盖从基础配置到高级技巧的全流程实践。针对Qt6推荐使用CMake作为构建系统的现状,文章特别解决了翻译文件管理、源代码扫描和多语言支持等关键问题,并提供了Qt Creator集成方案和持续集成配置建议,帮助开发者高效实现国际化开发。
给CPT102数据结构新生的Java避坑指南:从Iterator到AVL树,这些Lab和Lecture的坑我都帮你踩过了
本文为CPT102数据结构课程的新生提供Java编程避坑指南,涵盖从Iterator使用到AVL树实现的关键技巧。通过解析迭代器陷阱、递归转迭代、链表操作细节和AVL树旋转等12个核心场景,帮助读者避免常见错误,提升编码效率。特别适合正在学习数据结构与算法的Java开发者参考。
嵌入式开发实战:解决交叉编译中 libstdc++.so.6 版本 `CXXABI_1.3.11` 缺失问题
本文详细解析了嵌入式开发中交叉编译时遇到的`libstdc++.so.6`版本`CXXABI_1.3.11`缺失问题,提供了两种实用解决方案:升级目标板库版本或调整编译环境匹配目标板。通过具体操作步骤和最佳实践指南,帮助开发者有效解决C++标准库版本兼容性问题,提升嵌入式开发效率。
保姆级教程:在阿里云RDS MySQL上跑通TPC-H基准测试(避坑指南)
本文提供在阿里云RDS MySQL上运行TPC-H基准测试的完整指南,涵盖实例选购、数据生成、导入优化及查询执行等关键步骤。针对OLAP场景,详细解析如何规避云环境特有陷阱,并通过参数调整和分批导入策略显著提升测试效率,帮助用户准确评估数据库分析性能。
服务器运维必看:手把手教你用ipmitool查看和修改FRU信息(附BMC Web对比)
本文详细介绍了如何使用ipmitool工具查看和修改服务器FRU信息,包括FRU的核心价值、IPMITool与BMC Web界面的信息差异、编辑FRU信息的实战操作指南以及自动化运维中的FRU信息采集方案。通过实际案例和高级故障排查技巧,帮助运维人员高效管理服务器硬件资产,提升运维效率。
Unity里用SkeletonAnimation控制Spine动画?别再只用Animator了,脚本切换皮肤和播放动画实战
本文深入探讨了在Unity中使用SkeletonAnimation控制Spine动画的高级技巧,包括动态切换皮肤和复杂动画播放逻辑。通过对比SkeletonMecanim的局限性,详细介绍了SkeletonAnimation的核心API、皮肤切换方案和动画事件系统,帮助开发者突破Animator的限制,实现更灵活的2D角色动画控制。
STM32停止模式下RS485串口唤醒的实战配置与功耗优化
本文详细介绍了STM32在停止模式下通过RS485串口唤醒的实战配置与功耗优化方法。通过分析低功耗模式选择、硬件设计要点、软件配置细节及功耗优化技巧,帮助开发者实现从mA级到uA级的功耗降低,特别适用于工业物联网等需要快速响应且低功耗的场景。
别再只叫它八木天线了!聊聊那个被遗忘的‘宇田’与业余无线电DIY的黄金搭档
本文深入探讨了八木-宇田天线的历史背景、科学原理及DIY制作方法,揭示了这一被简称为'八木天线'的技术背后宇田新太郎的贡献。文章详细解析了天线工作原理,并提供了144MHz频段的制作指南,帮助业余无线电爱好者打造高性能定向天线,同时介绍了现代优化工具与技巧。
Mujoco210与Python 3.8环境完美搭配:手把手教你搭建强化学习实验平台
本文详细指导如何在Ubuntu系统上搭建Mujoco210与Python 3.8的强化学习实验平台,涵盖环境配置、Mujoco210安装、Python环境适配及常见问题解决方案,帮助研究者高效构建精确的动力学模拟环境。
Control-模型预测控制(MPC):从理论推导到MATLAB代码实现
本文详细介绍了模型预测控制(MPC)从理论到MATLAB实现的完整流程,包括基础概念、离散化方法、预测方程构建、代价函数设计及约束处理。通过倒立摆控制案例,展示了MPC在实际应用中的MATLAB代码实现技巧和调试方法,帮助读者掌握这一先进控制策略的核心技术。
PyTorch实战:从零构建CIFAR-10图像分类器(含训练、测试与验证集全流程解析)
本文详细介绍了如何使用PyTorch从零构建CIFAR-10图像分类器,涵盖环境准备、数据加载、CNN网络构建、训练优化及测试验证全流程。通过实战案例解析,帮助开发者掌握图像分类核心技术,提升模型准确率。特别适合PyTorch初学者和CIFAR-10研究者参考。
Xshell自动执行命令的5个实用场景,提升远程工作效率
本文详细解析了Xshell自动执行命令在5个高效场景中的应用,包括环境初始化、批量服务器维护、实时日志监控、开发环境部署和安全审计。通过SSH登录脚本和自动化命令,显著提升远程工作效率,特别适合IT运维和开发人员使用。
告别生硬震动!用Nice Vibrations插件为你的Unity手游注入细腻触感(附iOS/Android兼容性指南)
本文介绍了如何使用Nice Vibrations插件为Unity手游设计细腻的触觉反馈,提升游戏沉浸感。该插件支持9种预设模式和自定义振动曲线,兼容iOS的Taptic Engine和Android设备。文章还提供了跨平台适配的实用指南和性能优化技巧,帮助开发者实现精准的触觉语言设计。
手把手教你用TMS320F28335的EQEP模块读取编码器(附完整CCS工程代码)
本文详细介绍了如何使用TMS320F28335的EQEP模块实现编码器数据采集,包括硬件连接、寄存器配置、抗干扰策略及完整CCS工程代码。通过正交解码技术,开发者可快速构建高精度的运动控制系统,适用于电机控制和工业自动化场景。
别再只用手动设定阈值了!用Stata的k近邻法(knn)构建空间权重矩阵更科学
本文介绍了在Stata中使用k近邻法(knn)构建空间权重矩阵的科学方法,替代传统固定距离阈值的不足。通过详细代码示例和实际应用案例,展示了knn方法在处理不均匀空间数据时的优势,包括自适应邻居选择和更稳定的空间分析结果。
保姆级教程:用MounRiver Studio和WCH-Link点亮你的第一个CH32V103C程序(附串口调试技巧)
本文提供了一份详细的保姆级教程,指导开发者使用MounRiver Studio和WCH-Link调试器点亮CH32V103C开发板的第一个程序。从开发环境搭建、硬件连接到代码编写和串口调试,全面覆盖了RISC-V架构MCU的入门实践,帮助初学者快速上手嵌入式开发。
从电子设计竞赛到创客项目:用OpenMV+舵机DIY一个桌面级平衡球装置
本文详细介绍了如何利用OpenMV和舵机从电子设计竞赛项目转型为创客DIY的桌面级平衡球装置。通过优化视觉核心选择、简化机械结构、调整PID控制算法,并增加互动模式,打造了一个兼具教学与娱乐性的装置。特别适合电子爱好者和创客实践。
STM32F429IGT6 TIM ETR外部脉冲计数实战:从标准库到HAL库的精度校准方案
本文详细解析了STM32F429IGT6的TIM ETR外部脉冲计数功能,从标准库到HAL库的实现方案,并提供了精度校准的实战技巧。通过具体的代码示例和配置步骤,帮助开发者解决脉冲计数中的精度问题,适用于步进电机控制等高精度场景。
别再只会做线性回归了!用SPSS搞定非线性拟合,手把手教你分析施肥量与产量的真实关系
本文详细介绍了如何利用SPSS进行非线性回归分析,解决施肥量与产量之间的复杂关系问题。通过渐近回归模型等非线性方法,突破线性思维的局限,准确描述产量增长的'天花板效应'。文章包含SPSS操作步骤、模型选型技巧和结果解读,帮助农业研究者做出更科学的决策。
已经到底了哦
精选内容
热门内容
最新内容
99元香橙派Zero3搭建家庭NAS:保姆级Samba配置教程(含小米摄像头兼容方案)
本文详细介绍了如何使用99元的香橙派Zero3搭建经济实用的家庭NAS系统,重点讲解了Samba服务器的配置方法,特别针对小米摄像头的存储需求提供了兼容方案。通过保姆级教程,用户可轻松实现文件共享和视频存储,相比传统NAS节省90%成本。
从PVT到MMMC:一次讲透芯片签核(Sign-off)中的那些‘角’(Corner)到底该怎么选
本文深入探讨了芯片签核(Sign-off)中工艺角(Corner)的选择策略,从PVT组合到MMMC分析的全流程实战指南。详细解析了不同工艺角(如TT、FF、SS、FS、SF)的物理意义及应用场景,并提供了时序签核、功耗分析和噪声可靠性分析的具体Corner选择建议。针对先进工艺节点,特别介绍了动态derate设置和机器学习辅助的Variation建模等创新方法,帮助工程师优化签核流程,提升芯片设计效率。
告别PyInstaller卡顿!用Nuitka打包Python程序,启动速度翻倍(附VS2022/MinGW配置教程)
本文详细介绍了如何使用Nuitka替代PyInstaller打包Python程序,显著提升启动速度。通过对比测试,Nuitka在含PyTorch等重型库的场景下可实现79%的启动时间优化,并提供VS2022/MinGW配置教程、依赖管理策略及高级打包技巧,帮助开发者突破Python打包性能瓶颈。
AT32F403A与STM32F103内部Flash模拟EEPROM:从原理到实践的可靠数据存储方案
本文详细解析了AT32F403A与STM32F103内部Flash模拟EEPROM的技术方案,从原理到实践提供可靠数据存储方法。通过对比Flash与EEPROM的核心差异,介绍擦除、写入等关键操作,并分享磨损均衡、数据备份等高级优化策略,帮助开发者实现稳定高效的嵌入式存储解决方案。
Burpsuite实战:OAuth2.0授权码流程中的CSRF与重定向劫持剖析
本文深入剖析OAuth2.0授权码流程中的CSRF与重定向劫持漏洞,通过Burpsuite实战演示攻击过程。文章详细讲解缺少state参数导致的CSRF攻击和未验证redirect_uri引发的重定向劫持,提供漏洞修复方案和渗透测试技巧,帮助开发者提升OAuth2.0实现的安全性。
深入解析MSBuild平台工具集:版本演进与项目构建核心路径
本文深入解析MSBuild平台工具集的版本演进与项目构建核心路径,详细介绍了从VS2005到VS2019的工具集变化及其与Visual Studio的映射关系。通过分析工具集目录结构、Windows SDK配合机制及属性表加载顺序,帮助开发者解决构建过程中的常见问题,提升项目迁移和编译效率。
Unity编辑器扩展:基于PreviewRenderUtility打造资产可视化预览面板
本文详细介绍了如何在Unity编辑器中利用PreviewRenderUtility创建自定义资产可视化预览面板。通过分步教程,开发者可以学习如何搭建交互式3D预览窗口,实现模型旋转、缩放、光源控制等高级功能,提升美术和策划的工作效率。文章还涵盖了性能优化和常见问题解决方案,是Unity编辑器扩展开发的实用指南。
别再直接用inv(A)*b解方程了!Matlab官方文档里这个反斜杠‘\’操作符才是真香
本文深入探讨了Matlab中反斜杠运算符‘\’在解线性方程组中的高效与精确性,对比了传统`inv(A)*b`方法的缺陷。通过数值计算实例和性能对比,揭示了‘\’运算符如何智能选择最优算法,显著提升计算速度和精度,特别适用于工业级应用如控制系统设计和有限元分析。
FOC进阶解析:从电流环到位置环的串级PID实战
本文深入解析FOC控制中串级PID的实现,从电流环到位置环的层级结构设计,探讨了频率配置、参数整定和工程实践中的关键技巧。通过实战案例和代码示例,帮助工程师避免常见误区,优化电机控制性能,特别适合需要精确控制速度环和位置环的应用场景。
别再迷信模拟IIC了!STM32CubeMX硬件IIC驱动AT24Cxx EEPROM保姆级教程(附避坑指南)
本文详细介绍了如何使用STM32CubeMX配置硬件IIC驱动AT24Cxx EEPROM,打破了对硬件IIC存在Bug的误解。通过对比硬件IIC与模拟IIC的性能差异,提供CubeMX配置详解、EEPROM驱动实现与优化技巧,以及常见问题排查指南,帮助开发者高效稳定地使用硬件IIC。