资讯详情

实时监控GPU状态:nvidia-smi与显存/功耗/温度排查实战

📅 2026/9/20 7:33:21 | 华诺云谱 👁 阅读
实时监控GPU状态:nvidia-smi与显存/功耗/温度排查实战
1. 实时监控GPU状态先从一张图看懂这套体系做深度学习、跑大模型微调、维护GPU服务器的人几乎每天都在跟显存和功耗较劲。模型跑着跑着OOM了训练速度突然掉下来或者显卡风扇狂转但利用率只有个位数这些场景遇到一次就知道有多头疼。我最早的痛苦来自一次跑diffusion模型微调训练到一半直接报CUDA out of memory排查了半天才发现是上一个进程的显存没释放干净。那时候我就意识到实时查看GPU显存占用、功耗、进程状态不是“锦上添花”的运维技巧而是每个用GPU干活的人的基本功。这篇内容主要讲清楚三件事第一怎么用最常用的工具实时看到GPU的显存、功耗、利用率、温度、进程这些核心指标第二怎么判断这些数字背后的健康状态比如是算力瓶颈、显存瓶颈还是供电限制第三遇到常见异常状况时怎么通过这些监控数据快速定位到具体进程、具体原因。内容覆盖从单卡桌面级玩家到多卡服务器运维的场景如果你是刚入门PyTorch、PaddleOCR这类深度学习框架的GPU版本配置或者在做GPU集群、GPU驱动开发相关的调试工作这套方法同样适用。我默认你用的是Linux环境因为现实中跑GPU训练、部署推理的基本都是Linux服务器。Windows桌面端我也会提一句毕竟很多人在本地调试的时候还要面对这个问题。文中所有命令和技巧都是我实际用过、验证过的不是那种抄文档抄来的“纸上谈兵”。2. nvidia-smi最核心的命令行工具先把它用透2.1 一条命令看懂所有核心指标NVIDIA显卡的监控绕不开的工具就是nvidia-smi。它是NVIDIA驱动自带的系统管理接口装好驱动之后直接能在终端里跑不用额外装任何东西。直白点说nvidia-smi就是一张“体检表”把GPU的健康状况一条条列在你面前。终端里输入这条命令nvidia-smi输出大概长这样----------------------------------------------------------------------------- | NVIDIA-SMI 535.129.03 Driver Version: 535.129.03 CUDA Version: 12.2 | |--------------------------------------------------------------------------- | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | || | 0 NVIDIA A100-PCIE-40GB On | 00000000:3B:00.0 Off | 0 | | 30% 38C P0 78W / 250W | 1234MiB / 40960MiB | 0% Default | | | | Disabled | ------------------------------------------------------------------------- ----------------------------------------------------------------------------- | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | || | 0 N/A N/A 12345 C python3 1024MiB | -----------------------------------------------------------------------------这里的每一行都不是摆设。上面那行Driver Version告诉你的驱动版本CUDA Version是当前驱动支持的最高CUDA版本不是说你系统里已经装了哪个CUDA别搞混。中间表格里每块GPU一行的信息Fan是风扇转速百分比Temp是温度Perf是当前性能状态P0到P12P0是最高的性能状态Pwr:Usage/Cap是当前功耗和最大功耗上限Memory-Usage是显存使用量和总显存GPU-Util是GPU计算单元利用率Compute M.是计算模式。最下面是当前占用显存的进程列表包括进程PID、类型、进程名和占用的显存。一个很常见的误解是只看显存占用不看GPU-Util。如果你的程序显存占满了但GPU-Util才百分之几说明程序只是把数据放进了显存根本没让GPU跑起来这时候要怀疑是不是代码里的张量操作根本没放到GPU上执行或者模型在CPU和GPU之间来回拷贝数据。反过来GPU-Util跑满了但显存占用很低说明模型很小但计算量很大这是正常的不用慌。2.2 让数据动起来watch持续刷新单次执行nvidia-smi只能看到一刹那的状态而训练和推理是持续跑很久的隔几分钟去执行一次太费劲了。watch命令就是干这个的它每隔指定秒数自动刷新一次命令结果效果有点像任务管理器里的实时图表。watch -n 1 nvidia-smi-n 1表示每1秒刷新一次。按CtrlC退出。我一般习惯用2秒刷新间隔因为1秒刷新时如果GPU比较多整个屏幕跳得很快数字反而看不清楚。如果你想顺便看看时间戳可以这样watch -n 2 -d nvidia-smi-d参数会让两次刷新之间有变化的地方高亮出来这样一眼就能瞅见哪个数值变了。比如训练过程中显存不断增长那个数字会一直高亮跳动非常直观。还有一个更轻量的刷新方式用nvidia-smi自带的循环模式nvidia-smi --loop2这个命令和watch的效果类似但它是nvidia-smi自己实现的循环刷新。实测下来watch用起来更方便一些毕竟可以随时中途退出而--loop需要等它跑完或者CtrlC体验差不多看个人习惯。2.3 只看想要的字段全量输出太占屏服务器上显卡多了以后nvidia-smi的完整输出会非常长屏幕根本装不下。而且有些字段你根本不关心比如风扇转速、PCIe总线ID更关心的是显存和功耗。这时候用--query-gpu参数可以只挑你关心的字段出来nvidia-smi --query-gpuindex,name,temperature.gpu,utilization.gpu,utilization.memory,memory.used,memory.total,power.draw,power.limit --formatcsv输出的效果index, name, temperature.gpu, utilization.gpu, utilization.memory, memory.used, memory.total, power.draw, power.limit 0, NVIDIA A100-PCIE-40GB, 38, 0, 0, 1234, 40960, 78.45, 250.00--formatcsv是按逗号分隔的纯文本容易看也容易存成日志。如果你不想看表头可以加-n参数变成--formatcsv -n输出的就是纯数字方便做监控脚本的数据解析。这个查询模式最能派上用场的地方是写自动化监控脚本。比如我要定期记录GPU的功耗曲线就可以写一个小循环往文件里追加数据while true; do nvidia-smi --query-gpuindex,power.draw,memory.used,utilization.gpu --formatcsv -n gpu_monitor.csv; sleep 5; done然后训练结束后用Python或者Excel打开这个CSV文件就能画出显存占用曲线和功耗曲线分析训练过程中GPU是否真正吃饱了这是最靠谱的调优依据。2.4 查看某块特定显卡的信息多卡机器上nvidia-smi默认显示所有卡。有时候只想看第2块卡索引从0开始所以第2块是index1可以加-i参数nvidia-smi -i 1和--query-gpu配合更好用nvidia-smi -i 1 --query-gpuutilization.gpu,memory.used,power.draw --formatcsv这个操作在多卡并行训练时很有意义。有时候某个进程绑定了某块卡或者某块卡的散热位置不好导致温度偏高单独拎出来看就能及时发现问题。3. 显存占用、功耗和温度这三个指标怎么解读才算看懂3.1 显存占用的正常与异常显存占用是大家最常盯的指标因为OOMOut Of Memory是深度学习训练最经典的翻车现场。但“占用高”不一定是坏事也不是“占用低”就一定好。训练场景中显存占用高通常意味着模型参数、梯度、优化器状态、中间激活值都放进显存了这本身就是大部分深度学习训练的正常状态。比如ViT-Large这种大模型Batch Size批大小调大一点、序列长度长一点显存占用直接往上冲这种时候如果显存占用接近上限但不报错训练正常那就没事。但有一个情况要注意显存占用持续增长而且增长速度稳定每个step涨一点从来没降下来过那就要警惕显存泄漏了。典型的原因就是一个循环里不断往Python列表里存中间张量或者定义了loss之后没有正确释放计算图导致每一轮迭代都残留一点显存。这种情况用watch -n 1 nvidia-smi可以非常清楚地看到显存随着迭代次数一步步上涨到某个临界点就OOM了。推理场景就不一样了。推理的时候显存占用应该是一个平稳的值模型加载完成之后基本不再变化。如果你部署一个推理服务显存占用还在不断跳动那可能是服务端缓存了一些中间结果或者在跑批次请求时动态申请了显存这个要看具体实现。但通常来说推理场景显存占用曲线应该是平缓的波动大说明有隐患。还有一个基于经验的判断方式nvidia-smi显示的Memory-Usage并不等于进程实际使用的真实显存。驱动程序会预留一部分而且CUDA的显存管理有自己的缓存机制比如PyTorch会缓存已释放的显存块以便下次复用所以你杀掉一个Python进程后nvidia-smi里显存占用不会立刻归零可能要过几秒才释放干净。这不是显存泄漏是CUDA缓存释放的滞后效应遇到这种问题别急着下结论。3.2 功耗一个经常被忽略的关键指标相比显存占用很多人在看到功耗时不以为然觉得功耗不就代表耗电吗其实功耗是最能反映GPU“实际干活强度”的指标之一。GPU的功耗大致跟芯片内部晶体管翻转频率相关计算越密集、频率越高功耗就越大。Pwr:Usage/Cap里斜杠前是当前功耗斜杠后是功耗上限Power Limit。如果当前功耗长期撞在上限上说明GPU可能因为供电限制降频了性能被卡住了。反过来如果GPU-Util很高但功耗明显低于上限说明这个计算任务并没有把所有计算单元都用满可能是一个内存带宽敏感型任务或者是小规模算子密集但是并行度不高的负载。这里有个经典案例。我之前调一个NLP模型的训练GPU-Util一直是96%以上但功耗只有最大功耗的60%训练速度也一直提不上去。后来排查发现模型里有大量的小矩阵乘法单个算子无法把GPU上千个计算核心全部喂饱导致GPU一直在以低利用率的状态高频运转功耗自然上不去。这个判断如果没有功耗数据光看利用率是完全看不出来的。功耗还有一个重要作用——判断异常。正常运行中GPU功耗是稳定波动的但如果突然飙升到上限附近同时温度也在快速上涨那可能是显存或核心出了硬件问题比如显存ECC错误导致的重试机制。如果在没跑任何程序的情况下功耗依然很高那要怀疑是不是某个隐藏的进程或者驱动异常在偷偷占资源。这些情况配合温度一起观察能更早发现硬件隐患。另外提一个实操经验GPU功耗上限是可以调的不一定非要默认值。某些型号的显卡可以通过nvidia-smi -pl 200把功耗上限从默认的250W降到200W这种做法在机房散热条件不足或者电源余量不够的时候很实用。降低功耗上限会让性能损失一点但能换来稳定性和更低的温度。反之像一些顶级卡出厂时留了余量可以把功耗上限提高以获得更多性能但前提是供电和散热都跟得上。这个谨慎操作毕竟涉及硬件安全。3.3 温度与降频的连锁反应温度是GPU状态里和功耗相伴相生的关键指标。NVIDIA GPU有个比较严格的热管理机制核心温度达到一定阈值后会主动降低核心频率以保护芯片这叫“降频”Thermal Throttling。一般情况下降到约83℃到85℃时触发降频不同型号阈值略有差异。降频最明显的表现就是功耗没变但GPU-Util依然很高训练速度却突然变慢。这时候看温度才能发现原来是过热了。很多服务器机房夏天空调不给力或者机箱风道设计不合理GPU温度天天顶着84℃跑性能打了折扣不说还容易造成电子迁移加速影响显卡寿命。散热排查的几个切入点风扇转速如果Fan一直是30%但温度已经80℃了说明风扇策略有问题可以用nvidia-smi -q -d SUPPORTED_CLOCKS查看显卡支持的风扇档位再用nvidia-smi --lock-gpu-clocks锁定频率间接控制发热但这会影响性能慎用。环境温度机房空调温度设太高或者机柜位置通风差会导致GPU进风温度高再好的散热系统也压不住。灰尘服务器用久了散热鳍片被灰尘堵死风扇再转也没用。这种问题不能靠软件解决得开箱清灰。3.4 “GPU-Util这么高为什么还卡”这个问题怎么排查热搜词里有一个很典型的困惑“CPU / GPU / 内存占用都不高但卡”。这个现象我遇到太多次了尤其在本地调试深度学习代码的时候。先说结论nvidia-smi里看到的GPU-Util指的是GPU计算核心CUDA Core / Tensor Core的利用率它不包含显存、PCIe传输、CPU数据预处理这些环节。如果你的数据读取和预处理都在CPU上做而且CPU也不够快那整个流程就像一条流水线GPU这个工位虽然满负荷但上下游供应不上最终表现就是训练很慢但各项指标都不算饱满。典型瓶颈有几种CPU数据管道瓶颈torch.utils.data.DataLoader的num_workers设太小或者数据增强逻辑太复杂CPU来不及把数据送到GPU。这种情况CPU占用率很高但GPU利用率出现周期性抖动一会儿冲高一会儿掉零。频繁的CPU和GPU数据传输比如在每次迭代里都用.cpu()把张量拷回来做Numpy操作再拷回GPUPCIe传输成为瓶颈。这时候GPU-Util往往不高但训练很慢。锁竞争和进程切换多线程读写同一个文件或者Python的GIL限制了数据预取的速度。内存交换系统内存不够时数据被换到Swap分区读写速度直线下降。排查这类问题nvidia-smi只能告诉你GPU的宏观状态真正定位瓶颈需要配合top看CPU线程、htop看进程状态、iostat看磁盘IO、甚至用nvidia-smi --query-gpuutilization.gpu --formatcsv -lms 100把采样间隔缩到100毫秒抓取利用率的波动模式。慢不要紧关键是要知道慢在哪个环节。4. 深入进程级排查谁在抢显存怎么处理4.1 找出具体占用显存的进程nvidia-smi的下半部分列出了进程列表包括进程PID、进程名和显存占用。这个表非常实在它能直接告诉你谁是“显存大户”。但一个限制是nvidia-smi默认只显示根用户能看到的进程。如果你是非root用户可能看不到其他用户的进程这时候要么加sudo执行要么用nvidia-smi --query-compute-appspid,used_memory --formatcsv查询计算进程的详细信息。nvidia-smi --query-compute-appspid,process_name,used_memory --formatcsv输出长这样pid, process_name, used_memory 12345, python3, 1024MiB另一个好用的组合是nvidia-smips通过PID反查进程的完整命令行nvidia-smi | grep python | awk {print $5} | xargs -I {} ps -fp {}这条命令会把nvidia-smi输出里涉及python的PID取出来再用ps查看具体是哪个脚本。多卡服务器上这个命令非常实用——别人跑了个任务占了卡你总得知道它是什么任务、是不是你该处理的残留进程。4.2 显存泄漏与残留进程的识别与清理显存泄漏的逻辑我前面提过现在说说具体怎么判断和清理。如果显存占用在训练过程中一直涨说明代码里可能有对象没释放。但更常见的情况是你跑的脚本崩了但进程没退出显存被残留进程占着。比如训练到一半直接kill -9杀了进程但PyTorch申请到的显存并没有被系统立刻回收。再启动新训练时nvidia-smi里明明显示有显存被占用但当前又没有在运行的python脚本或者只有一个僵尸状态的进程。处理方式很简单找到PID然后杀掉kill -9 PID杀完再用nvidia-smi确认显存是否已经释放。如果显存还没释放那就得检查是不是有其他子进程比如DataLoader的worker进程还在运行。用ps -ef | grep python找一下所有相关进程确认没有遗漏后再杀。这里有个比较容易被忽略的坑PyTorch的DataLoader如果设置了num_workers0主进程被杀掉后worker子进程可能不会被自动清理。这些子进程的PID和主进程不一样如果不加留意你会看到显存被占着但ps里没有一个python主进程。这时候要全量搜一遍ps -ef | grep python把和你的项目相关的进程都找出来杀掉。还有一类特殊情况进程已经变成Zombie僵尸进程kill -9也杀不掉但僵尸进程本身不占显存显存已经被内核回收了所以nvidia-smi里看到的应该已经释放。如果僵尸进程真的占着显存不放那是驱动和内核之间的问题最简单的办法就是重启机器。4.3 指定GPU运行你的程序避免和别人的任务抢卡多卡服务器上CUDA_VISIBLE_DEVICES是每个人都应该记住的环境变量。你的程序默认会使用所有可见的GPU如果机器上有好几块卡而你没做限制程序会把显存平均分配到所有卡上结果别人用卡时被你挤爆了。指定只用第0块卡CUDA_VISIBLE_DEVICES0 python train.py指定用第2块和第3块卡CUDA_VISIBLE_DEVICES2,3 python train.py这个环境变量不仅影响PyTorch对TensorFlow、PaddlePaddle同样有效。它做的事情是让CUDA运行时“看不到”你没有指定的GPU程序自然就不会去占用。配合PyTorch内部的设置还可以进一步控制显存分配策略。PyTorch默认会把显存几乎全部占满为了给后续计算预留空间如果你想多留一些显存给其他进程可以用torch.cuda.set_per_process_memory_fraction设置使用比例import torch torch.cuda.set_per_process_memory_fraction(0.5) # 只允许使用50%的显存这个功能在多人共享一张卡时非常有用。比如你有张24G的卡另一个同事只需要8G你把自己限制在16G以内两个任务就能共存。不过设置之后如果进程实际需要的显存超过限制就会报OOM所以这个比例要按需设定别拍脑袋设太小。4.4 查看GPU计算模式和MIG配置nvidia-smi输出里有一列Compute M.显示的是当前GPU计算模式。默认是Default意味着任意进程都可能使用这张卡。如果你想把卡锁定成单用户模式防止别人抢占可以用nvidia-smi -c EXCLUSIVE_PROCESS设置之后同时只能有一个上下文使用该GPU。还有一个PROHIBITED模式这个模式下GPU不允许任何计算任务通常用于维护。设置计算模式需要root权限谨慎使用别把自己也锁在外面了。MIGMulti-Instance GPU是A100、H100这些新卡上支持的功能可以把一块物理GPU分割成多个独立的GPU实例每个实例有自己独立的显存和计算单元。对于做GPU集群的人来说MIG配置好了可以通过nvidia-smi看到切片后的多个GPU实例。这个功能在硬件虚拟化和多租户场景下很实用但需要底层驱动和CUDA版本都支持是个比较进阶的话题简单了解即可。5. 功耗相关的高级玩法功耗上限调整与压力测试5.1 为什么有人要调功耗上限Pwr:Usage/Cap里的Cap就是当前功耗上限。默认情况下显卡的功耗上限是按出厂配置来的但很多场景下需要调整这个值。例如一个大机箱里装了8张显卡电源额定功率只有3000W每张卡默认上限250W的话8张卡满载就要2000W再加上CPU、主板、硬盘的功耗电源压力非常大。如果不调整功耗上限整机可能因为瞬时功耗过高触发电源保护直接断电重启这在训练任务跑到一半的时候发生的话非常恶心。调整功耗上限的命令格式nvidia-smi -pl 200-pl后面跟的是目标功耗上限值单位是瓦特。这个命令会一次性地影响所有GPU想指定某块卡就加-i参数nvidia-smi -i 0 -pl 200不同型号的显卡支持的范围不一样。可以用nvidia-smi -q -d POWER查看当前支持的最小和最大功耗限值。有些入门卡不允许修改服务器级别的计算卡一般都可以改。需要特别注意的是-pl设置是临时的重启驱动或重启机器后就会恢复默认值。如果想持久化需要写到一个开机启动脚本里。另外把功耗上限拉得太高会对供电和散热提出额外要求整机电源余量不足时强行拉高上限反而容易引发掉驱动甚至硬件损坏这个只能量力而行。5.2 用gpu-burn做压力测试验证功耗和散热是否正常热搜词里有一条“gpu压力测试gpu-burn工具”这里顺便展开讲一下。gpu-burn是网上流传很久的GPU压力测试工具它通过让GPU执行大量计算任务把功耗和温度拉满用来验证GPU在满载状态下是否稳定。对于刚装好驱动、新卡到手、或者排查显卡稳定性问题的时候跑一轮gpu-burn非常有必要。简单来说它就是一个持续运行CUDA计算的内核程序用nvidia-smi观察这段时间的功耗和温度曲线就能确认卡是否正常。如果压力测试时显存报错、驱动崩溃、系统重启基本可以断定是硬件或散热问题。使用方式通常是下载源码后执行make ./gpu-burn 60最后的参数60表示持续跑60秒。跑的过程同时开另一个终端执行watch -n 1 nvidia-smi观察每块卡的功耗、温度和风扇转速是否稳定在一个合理区间。我自己的经验新到的服务器先跑一轮gpu-burn每块卡10分钟。如果某块卡的温度明显比其他卡高10度以上基本可以确定那块卡的风扇有问题或者散热硅脂没涂好趁在保修期内赶紧报修。这种问题用常规任务很难发现因为平时负载不一定能拉满功耗和温度压力测试一跑就原形毕露。6. 常见问题与排查技巧实录6.1 驱动崩溃或D3D设备已移除Windows场景热搜词里有一条“GPU发生崩溃或D3D设备已移除”这主要发生在Windows桌面端我确实也踩过不少坑。这类错误经常出现在游戏、视频渲染或者本地跑GPU加速应用的时候本质上就是Windows检测到GPU驱动停止响应或者被复位。出现这个问题的常见原因和排查思路驱动版本不稳定。NVIDIA的Game Ready驱动和Studio驱动之间的差异可能导致某些硬件的兼容性问题。换一个已经验证过的稳定版驱动往往能解决大部分问题。供电不足。电源功率不够或者用了劣质转接线高负载时显卡电压不稳就会触发驱动自我保护。这时候高频黑屏或崩溃去事件查看器能看到nvlddmkm相关的错误记录。温度过高触发保护。Windows桌面机箱风道差显卡满载后温度迅速冲到90℃以上驱动一检测到过热就直接断开设备。排查这类问题的时候同样需要先看nvidia-smiWindows版本也能跑确认温度和功耗状态然后根据现象判断是驱动问题还是硬件问题。6.2 nvidia-smi显示“Unable to determine GPU memory usage”这个报错在containers环境里比较常见尤其是用Docker跑GPU任务时容器里的nvidia-smi可能因为权限或驱动的挂载问题无法读取显存信息。热搜词里就有“trt-warn unable to determine gpu memory usage”这样一个具体场景应该是TensorRT执行时给出的警告。排查方向确认容器是否通过--gpus all启动或者运行时是否挂载了NVIDIA容器工具包nvidia-container-toolkit。在容器内执行nvidia-smi看能否正常输出如果不能说明驱动或调用链有问题。如果只是TensorRT的警告而程序还能跑那可能是TensorRT在查询显存时用了老的NVIDIA驱动接口而新驱动已经改名或移除。这种情况下可以忽略警告但要注意确认显存分配是否真的符合预期。6.3 查看GPU历史状态与日志有时候问题不是当下发生的而是昨天半夜训练崩了第二天早上你才发现。这时候没法用watch回头去追历史数据所以要提前配置监控日志。最简单的方案还是借助nvidia-smi --query-gpu和cron定时采集*/5 * * * * nvidia-smi --query-gpuindex,temperature.gpu,utilization.gpu,memory.used,power.draw --formatcsv- /var/log/gpu_monitor.log每5分钟记录一条日志里积累了足够多数据后训练崩溃时就能翻到崩溃前GPU处于什么状态是温度太高还是显存爆了全部有据可查。更高级一点的方案是用Prometheus node-exporter nvidia-dcgm-exporter或者直接上Grafana可视化面板。对于GPU集群运维这套监控栈几乎是标配。不过单机或者小规模场景直接用日志文件就够了没必要为了监控本身引入一堆依赖。6.4 排查“显存占用高但GPU利用率低”的常见原因我把这个单独列出来因为这是群里被问得最多的问题之一。现象nvidia-smi里显存占用80%以上但GPU-Util只有个位数或者30%以下模型跑得很慢但不报错。常见原因和处理方式整理成速查表可能原因判断方法处理方式数据加载太慢观察GPU利用率周期性掉零CPU占用率高增加num_workers打开pin_memory检查磁盘IO频繁CPU-GPU拷贝代码里有大量.cpu()和.cuda()互转批量操作替代逐元素拷贝尽量保留在GPU上模型推理Batch Size太小每个Batch耗时短但开销占比高增大Batch Size减少调度开销比例显存碎片化训练不同尺寸张量导致显存分配不连续重启进程使用torch.cuda.empty_cache()临时清理缓存进程间显存抢占多个进程同时抢占显存导致内存分配等待检查所有GPU进程杀掉残留进程这个表是排查的基本功遇到问题先对照一遍能省下大量无头绪的试错时间。6.5 微调大模型时的显存优化经验热搜词里有“GPU微调大模型”这个话题和实时监控直接相关。微调大模型比如7B、13B参数规模的LLM时显存是最大的瓶颈很多人第一反应就是换更大的卡其实很多时候是显存利用不充分。监控显存时你会发现微调大模型的显存占用大头其实是优化器状态和中间激活值。比如用AdamW优化器每个参数要保存两份动量值显存开销直接翻倍。用LoRA这类参数高效微调方法冻结大部分权重只训练一小部分低秩矩阵显存占用能大幅下降。所以如果你在做大模型微调nvidia-smi还可以帮你回答一个问题当前方案的显存主要耗在哪个环节如果显存占用已经顶到90%那就该考虑是不是该用LoRA、QLoRA或者减小序列长度、梯度累积替代大Batch Size。另外分布式训练时多卡监控的思路也要跟上。每张卡的显存占用和功耗应该大致均衡如果某张卡明显偏低说明切分策略有问题比如数据并行时Batch Size分配不均或者流水线并行时某段负载过重。用nvidia-smi多卡视图扫一遍均衡性一目了然。7. 结合AI开发场景的实战经验7.1 PyTorch环境配置GPU版本时怎么验证是否真的用上了GPU热搜词里有“pytorch安装教程gpu”、“安装paddleocr gpu版本”这里也补充一下运维视角的验证方法。装了GPU版框架之后很多人第一步就是跑torch.cuda.is_available()返回True就以为万事大吉其实不一定。更靠谱的验证方法是跑一个简单的矩阵运算然后再对比nvidia-smi里的变化。执行python -c import torch; x torch.rand(1000,1000).cuda(); y torch.matmul(x, x); print(y.sum())跑这条命令的同时另一个终端执行watch -n 0.5 nvidia-smi如果能看到GPU利用率和功耗瞬间跳动一下那就说明CUDA确实在工作。还有一个很常见的坑PyTorch的CUDA版本和驱动支持的CUDA版本不对应。nvidia-smi里显示的CUDA Version是驱动支持的最高版本不代表PyTorch能直接用。比如驱动显示CUDA 12.2但PyTorch可能编译时用的是CUDA 11.8的运行时只要驱动版本不低于PyTorch要求的最低版本一般是兼容的。如果版本差太多会遇到CUDA initialization error或者找不到libcudart一类的报错。看到这种报错先查驱动版本比反复重装PyTorch效率高得多。7.2 用nvtop做交互式监控nvidia-smi是字符输出表面上没有图形界面看起来不够直观。其实还有一个神器叫nvtop它提供类htop的交互式界面把GPU状态以柱状图方式展示支持多卡并列显示视觉上舒服很多。安装方式各系统有差异Ubuntu上apt install nvtopmacOS上brew install nvtop装好之后直接运行nvtop就可以看到这个交互界面。它会用不同颜色的柱条显示利用率、显存、功耗还支持按进程排序。用惯了nvtop之后再回到纯字符的nvidia-smi会感觉还是交互界面对人更友好——尤其当你同时管理4张卡以上时柱状图的“一眼扫过去”效率是纯文本不可比的。7.3 Ollama或其他本地推理服务的GPU监控要点ollama这类本地推理工具现在很流行很多人用来跑LLM。热搜词里也有“ollama gpu”。本地推理有个特点显存占用跟模型大小强相关模型和KV Cache都得放进显存。如果你本地的显卡显存不够大Ollama会把部分层卸载到CPU上跑这时候表现就是nvidia-smi里的显存占用不高但推理速度很慢功耗也上不去因为真正的计算在CPU上。用nvidia-smi判断Ollama是否充分利用GPU的方法是加载模型后看显存占用是否接近模型文件大小KV Cache预估大小推理时看GPU-Util和power.draw是否明显上升。如果显存占用只有一小半且推理时GPU-Util只有20%左右很可能是模型部分层在CPU上跑或者上下文长度太小导致KV Cache分配不足。这个场景下nvidia-smi还有一个实用价值判断模型在加载时占了多少显存卸载时是否释放干净。有些推理框架在切换模型时内存清理不彻底残留的显存占用会逐渐积累多次切换后直接OOM。每次切换后用nvidia-smi确认一次显存占用是否回到基线是最简单的自检手段。7.4 K8s与GPU集群运维时的监控思路热搜词里还有“k8s与gpu安装教程”。K8s环境下GPU监控不能直接在宿主机上执行nvidia-smi就算完事因为Pod里看到的是被隔离后的设备状态。常规做法是在节点上部署dcgm-exporterNVIDIA的DCGM监控导出器再通过Prometheus采集指标然后在Grafana里做可视化同时配置告警规则。这个体系虽然搭建成本比单机高一部分但带来的收益非常大。多个节点同时被使用你不需要挨个登录执行nvidia-smiDashboards上就能看到每张卡的显存、温度、功耗、利用率还能设定告警。比如显存占用超过90%时告警温度超过85℃时告警为调度器优化和故障处理提供数据支撑。这里就不展开搭建细节了但记住核心逻辑DCGM采集指标→Prometheus存储→Grafana展示和告警。单机场景则直接用nvidia-smi就够了成本最低、上手最快。8. 避坑经验与个人心得最后再分享一些我自己的实际经验这些东西不是文档里能看到的都是踩过坑之后才真正记住的。第一个经验多看“趋势”而不是只看某一时刻的值。GPU状态是动态的单看一次nvidia-smi的输出很可能误判。比如一次采样时GPU-Util只有5%你以为GPU没在工作但下一秒可能就冲到了95%。真正要判断系统是否健康要像看心电图一样观察连续的时间和曲线变化。训练最好开着watch -n 2挂一段时间或者用日志记录趋势然后再下结论。第二个经验优先检查“别人留下的进程”。多卡服务器上最让人头疼的永远是显存被某些残留进程占着。遇到OOM第一反应不是调自己的代码而是先跑一遍nvidia-smi看有没有不属于当前任务的进程占用显存。先杀掉残留进程再检查自己的代码这个顺序能省掉一大半无谓的自我怀疑。第三个经验监控工具是辅助不是目的。nvidia-smi看到指标异常只能告诉你“哪里出了问题”不能告诉你“为什么出问题”。最后的排查还是要回到代码层面、驱动层面、甚至硬件层面。别把nvidia-smi当成万能诊断仪它是你的第一双眼睛但永远不是唯一的一双手。第四个经验养成记录基线的习惯。新机器到手或者新环境配置好之后先跑一轮压力测试记录每块卡的默认功耗、正常待机温度、满载温度、满载功耗然后把这个数据存下来。以后某个时间点觉得机器水平不对劲翻出当时的基线数据对比出问题的判断会非常快。没有基线的监控等于没有参照物的测量很难说是可靠的。第五个经验nvidia-smi不是万能的但会用它的人很高效。从最初我只会用nvidia-smi看一眼显存到后来会写脚本、会用--query-gpu、会调整功耗上限、会通过DCGM接入集群监控这个能力是一点点积累的。学会实时查看GPU显存占用、功耗、进程状态不光是解决眼前问题更是建立对整套GPU计算系统“手感”的第一步。那些经常说“GPU莫名其妙卡了”的人多数不是运气不好而是监控方法和排查思路还差一步。把这篇文章里的命令和思路都跑一遍遇到问题的时候你就能比大多数人更快定位根因。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。