首页/新闻资讯/正文详情

Prometheus+DCGM Exporter打造GPU监控体系:智能告警与实战

发布时间:2026/9/26 18:34:52 来源:云帆数科 栏目:资讯中心
Prometheus+DCGM Exporter打造GPU监控体系:智能告警与实战
上个月我帮团队把一台8卡NVIDIA训练服务器的GPU监控完整重做了一遍从原来Zabbix加自定义脚本的土方案切换到Prometheus DCGM exporter Grafana Alertmanager这套体系。之所以动手是因为网上聊prometheus监控GPU使用率的教程不少但多数贴一段配置就完事真正关键的智能告警阈值怎么定、误报怎么压、指标到底怎么解读很少有人说透。这篇就把我自己实际跑通全链路的过程整理出来适合正在搭GPU集群监控、或者已经被GPU告警轰炸到麻木的人参考。先说结论GPU监控的难点从来不在采集而在两个地方——一是选对采集器和指标二是把告警阈值做成能适配训练场景的复杂节奏。这篇会按采集链路搭建、核心指标解读、可视化配置、智能阈值设计、踩坑记录的顺序展开每一段都有能直接抄走的配置和PromQL。1. 把GPU监控做成体系方案选型与整体链路1.1 先搞清楚监控什么GPU指标不是只有利用率我见过很多初学监控的人上来就在Grafana拖一个GPU Utilization面板看到数字80%就觉得完事。但真正跑过大模型训练和推理服务的人知道GPU指标是分层的。简单分成四类算力类指标SM占用率、GPU利用率、MIG设备利用率。这类指标反映芯片计算核心的忙碌程度但利用率高不代表效率高——比如数据加载慢GPU也能保持高占用率在等待显存类指标显存使用量、剩余量、带宽利用率、内存拷贝速率。训练场景里显存泄漏是最常见的故障源OOM前往往有规律性的显存爬坡物理类指标核心温度、显存温度、功耗、风扇转速、电压。这类指标直接影响硬件寿命A100/H100这些卡对温度极其敏感超过阈值会主动降频链路类指标PCIe收发速率、NVLink带宽、XID错误。多卡通信和分布式训练里这些指标比利用率更能反映瓶颈。所以方案设计的第一步不是装软件而是先列一个我要为哪类问题负责的清单。我们团队的核心诉求是两条一是训练任务出问题能及时发现二是别让GPU因为过热或显存耗尽而悄悄掉点。这个诉求决定了采集器选型、指标保留周期和告警规则的侧重点。1.2 三款主流采集器怎么选Prometheus生态里没有官方专门为NVIDIA GPU写的采集器但可选方案不少我实际对比过三款采集器指标丰富度部署难度适用场景DCGM exporter高SM、NVLink、XID、功耗全都有中NVIDIA官方推荐混合算力集群首选node_exporter nvidia-smi textfile低只有核心几个计数低快速验证、单卡测试、不想多装容器nvml-exporter中NVML库直接采集中需要轻量且不想依赖DCGM容器的场景我当时直接选了DCGM exporter。原因不复杂NVIDIA官方维护指标命名规范最基本的好处是DCGM_FI_DEV_XID_ERRORS这个字段能直接抓到GPU报错事件这是排查硬件故障的金钥匙。node_exporter的textfile方式胜在简单但采集脚本要自己写而且多卡节点的标签容易出岔子。部署方式上我选了Docker运行DCGM exporter因为不用在宿主机上装额外的Python依赖或者编译NVML绑定宿主机只需要有NVIDIA驱动和nvidia-container-toolkit。整条监控链路最终是这样的GPU服务器上的DCGM exporter采集指标暴露一个/metrics端口Prometheus定时抓取这个端口把指标存进TSDBGrafana连接Prometheus做可视化大屏Alertmanager接收Prometheus的告警规则推送负责去重、分组和通知到钉钉/企业微信。这个链路的好处是每个环节职责单一。出问题的时候先查exporter有没有数据再查Prometheus有没有抓取最后才查告警有没有被规则拦截——排查路径非常直。2. 一步步搭建采集链路从exporter到Prometheus2.1 环境准备与基础依赖先说环境。这套方案对GPU服务器有个硬性要求必须装好NVIDIA官方驱动然后装nvidia-container-toolkit否则DCGM exporter的容器起不来。我用的是Ubuntu 22.04 NVIDIA驱动535 CUDA 12.2的组合宿主机上还跑着PyTorch训练任务。验证环境就两条命令nvidia-smi # 能输出GPU列表就说明驱动OKdocker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi第二条命令如果报could not select device driver这类错误说明nvidia-container-toolkit没装好或者Docker配置有问题。这个前置不做干净后面exporter起不来很容易让人误判成Prometheus配置的锅。另外建议给exporter留一个独立端口不要和业务混用。我用的端口规划是9400DCGM exporter9100node_exporter系统基础指标CPU/内存/磁盘搭配GPU告警做联合判断9090Prometheus自己3000Grafana2.2 用DCGM exporter采集GPU指标DCGM exporter的启动参数比想象中简单。官方镜像名是nvidia/dcgm-exporter我使用的启动命令是docker run -d --gpus all \ --name dcgm-exporter \ --restartalways \ -p 9400:9400 \ nvidia/dcgm-exporter:3.3.5-ubuntu22.04启动后直接访问http://localhost:9400/metrics能看到类似这样的输出dcgm_gpu_utilization{gpu0,UUIDGPU-xxxxx,devicenvidia0,modelNameNVIDIA A100-SXM4-40GB} 95.0 dcgm_gpu_temp{gpu0,UUIDGPU-xxxxx,devicenvidia0,modelNameNVIDIA A100-SXM4-40GB} 65.0 dcgm_gpu_fb_used{gpu0,UUIDGPU-xxxxx,devicenvidia0,modelNameNVIDIA A100-SXM4-40GB} 37888.0 dcgm_gpu_fb_total{gpu0,UUIDGPU-xxxxx,devicenvidia0,modelNameNVIDIA A100-SXM4-40GB} 40960.0看到这些指标就意味着采集链路通了。我建议第一次先手动加几个sample进去确认标签结构没问题再上Prometheus。有一个容易忽略的点默认DCGM exporter会暴露一大批指标实际告警用得上的只有十几个。指标太多不是坏事但要留意Prometheus抓包大小和存储膨胀。我对DCGM默认启用的指标做了裁剪——通过-f /etc/dcgm-exporter/dcgm-metrics.csv指定要采集的字段集合保留利用率、温度、功耗、显存使用、SM时钟、PCIe收发、XID错误这些关键项就够了。这个文件里每一项的格式是# Prometheus metric name, help text, DCGM field ID照着官方文档抄就行。2.3 Prometheus抓取配置与验证Prometheus的scrape配置同样不算复杂。如果有多台GPU服务器可以给每个exporter的job打上一个机架和集群标签方便后面做分组聚合scrape_configs: - job_name: nvidia_gpu scrape_interval: 15s scrape_timeout: 10s static_configs: - targets: [192.168.1.10:9400, 192.168.1.11:9400] labels: cluster: train-prod rack: rack-a这里我要特意说一下scrape_interval的选择。GPU利用率这类指标是高频变化的30秒抓一次也能看个大概但做告警判断时窗口太粗容易漏掉瞬时尖峰。15秒是比较平衡的值即不会让TSDB膨胀太快也能捕捉到大多数训练任务的波动。配置好了之后在Prometheus的Targets页面看到UP状态再输入dcgm_gpu_utilization能拉出数据就说明采集链路已经OK。我自己会在这一步顺便验证一下status页面的TSDB Status确认样本摄入量没有异常飙升。3. 读懂指标才是关键可视化与核心指标解析3.1 黄金指标哪些GPU数据值得上大屏采集器装好之后一不留神就会陷入什么指标都往面板上堆的误区。一个大屏放二十个图最后每个图都没人看。我实际用下来GPU监控真正值得长期盯的只有这几个黄金指标GPU利用率dcgm_gpu_utilization反映计算单元忙碌程度用来快速判断任务是否在跑显存使用率dcgm_gpu_fb_used / dcgm_gpu_fb_total训练和推理场景的容量水位线显存爆了的后果是OOM杀进程温度dcgm_gpu_temp高温会触发降频影响训练速度还会损伤硬件功耗dcgm_gpu_power_usage判断任务负载是否接近TDP上限也能侧面反映供电是否异常SM时钟dcgm_gpu_sm_clock这是一个容易被忽略的真相指标。GPU利用率高但SM时钟掉到很低说明被Power Cap或温度限制压住了这是在虚假忙碌PCIe RX/TX速率dcgm_gpu_pcie_rx_bytes、dcgm_gpu_pcie_tx_bytes分布式训练里数据搬运如果打到PCIe瓶颈单卡利用率再高也没用。这六个指标组合起来用一个很朴素的判断逻辑就能定位90%的问题先看利用率是否异常再看显存是否逼近上限接着瞄温度功耗最后查SM时钟确认没有被降频。我是按这个逻辑来设计Grafana仪表盘的而不是按指标类型随手堆图。3.2 用PromQL算出真正想看的数据Grafana面板展示最多的量有两类瞬时值和窗口聚合值。瞬时值直接查指标名就行但窗口聚合才是告警和复盘时真正依赖的。我自己常用的PromQL有这么几条计算最近5分钟的GPU平均利用率按GPU实例分组avg_over_time(dcgm_gpu_utilization[5m])计算显存使用百分比100 * dcgm_gpu_fb_used / dcgm_gpu_fb_total找出所有显存使用超过90%的GPU并且带上节点名(100 * dcgm_gpu_fb_used / dcgm_gpu_fb_total) 90计算最近1小时内的显存增长趋势这个对显存泄漏检测特别有用deriv(dcgm_gpu_fb_used[1h])我在实际面板里还会用max by (instance)或者topk来做多卡节点的汇总。比如在一个8卡节点上我想看最忙的那张卡的利用率topk(1, dcgm_gpu_utilization)这种聚合在分布式训练某个节点掉队的排查场景里非常关键。因为很多时候不是整节点都慢而是某张卡被其他任务抢了算力或者网络排队卡住。3.3 Grafana仪表盘实测建议Grafana这边我直接推荐在官方面板库搜索NVIDIA DCGM排名靠前的成熟模板比自己从零拖图快得多。不过模板导入之后不要直接拿来做告警依赖一定要做一个动作把面板的变量改成自己的instance、gpu标签命名。很多模板把gpu0这种标签写死多卡节点的第二张卡就是不显示查了半天还以为是采集问题其实是面板变量写法没对上。另外一个Grafana使用经验把同一个指标分别做成当前值和过去24小时对比两个面板。当前值面板在前一天面板下方一上一下对照着看才能发现昨晚8点开始功耗突然低了30%这种跨天异常。这种时间维度的对比比单看一个绝对值有用得多。如果想把大屏做到一眼看出问题的程度试着把颜色阈值设成语义化的利用率低于20%设成黄色代表资源空转高于90%设成红色代表高负载中间用绿色。这里有个反直觉的点——GPU利用率高不一定是坏事所以不要一看到90%就署名为异常要结合业务时段来判断。4. 智能告警阈值别再用一拍脑袋的固定数值4.1 固定阈值为什么会误报漏报说到告警阈值团队里最常见的做法是GPU利用率低于10%就告警温度超过85度就告警显存超过95%就告警。这类固定阈值在只跑单一业务的小集群里勉强能用但在真实训练环境里问题非常大。举几个我踩过的例子。一次凌晨跑数据分布式数据加载因为数据读取卡IOGPU利用率掉到接近0告警狂响值班的人爬起来发现没有任何故障只是上游生成训练数据的任务还没准备好。还有一次多卡并行训练有张卡被另一个团队的任务占用了利用率被拉高但温度也随之升高两条告警同时弹出最后发现是资源分配冲突不是硬件问题。这背后的本质问题是GPU的工作状态天然是锯齿形的。训练任务有前处理、数据加载、梯度同步、模型保存阶段不同阶段利用率从0到100来回跳温度功耗也跟着波动。单点固定阈值对这类时序数据几乎必然产生误报。4.2 动态基线与预测告警的实际做法真正有效的智能阈值我理解不是上一套机器学习平台而是让告警规则具备时间上下文和趋势判断能力。具体做三层第一层用窗口均值代替point值。告警表达式里不用dcgm_gpu_utilization 10而是用avg_over_time(dcgm_gpu_utilization[10m]) 10。这一步就能滤掉大部分瞬时抖动。第二层加持续时长和波动范围约束。Prometheus规则里的for字段用来避免短暂波动触发告警设定为for: 10m表示连续10分钟满足条件才告警。再加一个波动约束比如要求利用率不仅低还要在窗口内保持稳定防止训练任务本身就有规律性的低利用率阶段被误报。第三层用预测函数做趋势告警。最常用的是predict_linear它用历史数据线性拟合未来趋势。针对显存泄漏问题可以这么写predict_linear(dcgm_gpu_fb_used[1h], 3600) dcgm_gpu_fb_total * 0.95这条表达式的含义是用过去1小时的显存趋势外推未来1小时如果预计会超过总显存的95%就提前告警。实际效果比等到显存真的到95%再告警要好很多——训练任务出现OOM之前这种预测往往能提前20到40分钟给出信号。4.3 多条件组合与Alertmanager告警路由第三层告警优化的思路是组合条件。单一指标告警容易误报两个指标联合就能准确得多。比如只有当温度85且SM时钟下降超过10%时才告警这能区分真过热和单纯功耗高只有当显存使用92%且还在持续增长时才告警这能识别显存泄漏而不是一次性加载大模型只有当GPU利用率10%且节点CPU负载8时才告警这能识别数据加载瓶颈而不是空闲。Prometheus告警规则文件里实际的一条长这样groups: - name: gpu_alerts rules: - alert: GPUMemoryLeakPredicted expr: predict_linear(dcgm_gpu_fb_used[1h], 3600) on(gpu, instance) dcgm_gpu_fb_total * 0.95 for: 5m labels: severity: critical annotations: summary: GPU {{ $labels.gpu }} 预测将发生显存耗尽Alertmanager这边的路由也建议好好设计。我的做法是把告警按集群和严重级别分组critical级别的直接通知到值班群并电话强提醒warning级别的按小时聚合发摘要。再用抑制规则避免雪崩——比如某台机器已经触发了节点宕机告警那么该节点上所有GPU相关告警在窗口内自动抑制不让同一件事刷屏。 这个组合式告警的效果是我这套方案里最值得复制的部分。以前一晚上可能收到30条GPU告警里面一半是误报调整完之后一周能数得过来的告警条数且每一条基本都能对应到真实故障或者风险信号。 ## 5. 实测踩坑记录与问题排查速查表 ### 5.1 部署阶段最常翻车的几个点 整个搭建过程不是一次就顺的踩过的坑里印象比较深的有四个 第一个坑是DCGM exporter容器起不来日志报Failed to initialize NVML: Could not find NVML library。排查到最后发现宿主机只装了NVIDIA驱动没有装nvidia-container-toolkitDocker无法把驱动透传到容器里。解决办法是按NVIDIA官方文档装好toolkit后重启Docker再重新起容器。 第二个坑是Prometheus的target页面显示connect refused。一开始以为exporter挂了curl一下9400端口发现是本机正常、外部不通最后定位是云安全组没放行9400端口。这种网络层问题在自建机房和云环境里表现不同自查顺序永远是先curl再查防火墙最后才看配置。 第三个坑是Alertmanager收不到webhook。Prometheus规则已经显示为Pending和Firing但钉钉机器人没有消息。检查之后发现Prometheus根本没配alertmanagers地址或者配了但--web.listen-address端口写错。这个属于基础配置遗漏但特别容易忽略。 第四个坑是多卡节点的gpu标签在Grafana面板里全部显示空白。问题出在DCGM exporter的tag mapping——不同版本对GPU编号字段的暴露方式有差异旧模板用了gpu_id新版本数据里只有gpu。Grafana变量改成实际存在的标签名就好了。 ### 5.2 告警骚扰和漏报的处理思路 告警骚扰是另一个长期问题。要减少骚扰最有效的不是调阈值而是把告警的时效性设计好。我有了几个经验 一条告警的for字段我建议至少10分钟。GPU利用率低这一类的瞬时波动在10分钟窗口内会被过滤很多。不过温度告警的for不应该这么长因为高温对硬件的损伤是持续的连续3到5分钟超过阈值就值得看一眼等10分钟可能已经因为降频影响了训练进度。 另一个想法是告警分级而不是一刀切。显存超过92%设为warning超过95%且还在增长设为critical。分级之后值班的人才有精力真正看critical不然每天都是狼来了。 漏报的情况恰恰相反常见原因是窗口聚合太狠。我曾经用avg_over_time(dcgm_gpu_utilization[30m]) 10来告警结果某个真的出现故障的节点因为故障前30分钟内利用率有高有低平均值被稀释到没有触发。调整成max_over_time(dcgm_gpu_utilization[10m]) 10之后才恢复敏感度。所以聚合窗口的选择要跟业务的故障表现对齐不能一个窗口打天下。 ### 5.3 排查问题速查表 把这段时间的经验整理成一张速查表比较常用的问题基本都能在上面对号入座 | 现象 | 可能原因 | 排查命令/方法 | | --- | --- | --- | | exporter起不来日志有NVML错误 | 缺nvidia-container-toolkit | docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi | | Prometheus target DOWN | 端口未放行/服务未监听 | curl http://node:9400/metrics再查防火墙 | | 指标有值但Grafana面板不显示 | 面板变量标签名对不上 | 在Explore里查dcgm_gpu_utilization确认可用标签 | | 告警规则Pending但不Firing | for字段还没满足 | 直接查规则状态观察for持续时间 | | Alertmanager收不到消息 | 没配置alertmanagers地址 | 检查prometheus.yml里的alertmanagers和默认端口9093 | | 温度高但SM时钟拉不满 | 降频保护触发 | 查dcgm_gpu_sm_clock再看dcgm_gpu_power_usage | 这套GPU监控体系我在生产环境跑了两周多最大的感受是工具链选型占两成剩下的功夫都在指标理解和告警语义设计上。DCGM exporter提供的原始指标只是原材料真正解决显卡挂了没人知道显存泄漏发现太晚这些问题靠的是把PromQL的窗口、预测、组合条件用对。如果你也正准备给自己的GPU集群搭监控我的建议很直接先动手把DCGM exporter和Prometheus跑通然后再花时间把你自己的业务步骤和GPU指标对应起来。阈值和规则永远应该长在你对业务的判断上而不是长在模板里。

相关推荐

Prometheus GPU监控实战:从nvidia-smi到智能告警阈值设计
Prometheus GPU监控实战:从nvidia-smi到智能告警阈值设计

搞 GPU 监控这事,我是被一个"显卡偷偷罢工"的案例逼上道的。当时线上有三台训练服务器,跑深度学习模型,白天还好好的,一到后半夜利用率就莫名跌到个位数,显存却还占着,日志里看不出任何报错&… · 2026/9/26 18:34:52

WorkBuddy实战:从AI助手到Agent操作系统的工程落地
WorkBuddy实战:从AI助手到Agent操作系统的工程落地

过去大半年我一直在折腾 WorkBuddy,也拿它跟 CodeBuddy、Cursor 这类工具来回对比过很多次。先说结论:如果你只是想要一个聊天窗口,市面上任何一个 AI 助手都能满足你;但如果你想拿 AI 去搭一套真正能跑业务的 Agent 体系——差不… · 2026/9/26 18:34:39

如何读懂Loss曲线与Perplexity?How to Train Your GPT教你5步诊断训练失败原因
如何读懂Loss曲线与Perplexity?How to Train Your GPT教你5步诊断训练失败原因

如何读懂Loss曲线与Perplexity?How to Train Your GPT教你5步诊断训练失败原因 【免费下载链接】how-to-train-your-gpt Build a modern LLM from scratch. Every line commented. Explained like we are five. 项目地址: https://gitcode.com/gh_mirrors/ho/how-… · 2026/9/26 18:34:39

Xberg C 多语言检测实战:用 DetectMultiple 识别混合语种文档并读取 ISO 639-3 置信度结果
Xberg C 多语言检测实战:用 DetectMultiple 识别混合语种文档并读取 ISO 639-3 置信度结果

后端AI 应用NLP 【免费下载链接】xberg Polyglot document intelligence with a Rust core: extract text, metadata, images, tables, and structured data from 106 formats across 140 file extensions, plus code intelligence for 371 languages. Fifteen bindings, with … · 2026/9/26 19:05:53

OpenCode 速通:19 万星,自主操控浏览器干活——TaoToken 统一 Key 接入配置实战
OpenCode 速通:19 万星,自主操控浏览器干活——TaoToken 统一 Key 接入配置实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 19:05:53

Atlas 300V 24G 推理卡上部署 YOLO 的完整实战指南
Atlas 300V 24G 推理卡上部署 YOLO 的完整实战指南

先聊点实在的:最近不少朋友都在问“Atlas 300V 24G是运算加速卡吗”,以及“Atlas上到底怎么部署YOLO”。这两个问题其实指向同一件事——AI模型训练完之后,真正的落地环节往往卡在推理侧。昇腾Atlas系列,本质就是华为针对AI推理场… · 2026/9/26 19:05:47

Atlas 300V 24G推理卡与YOLO模型部署实战解析
Atlas 300V 24G推理卡与YOLO模型部署实战解析

从"atlas"这个热词被反复搜出来,我基本可以断定,大家问的就是华为昇腾生态里的Atlas AI计算平台,尤其是那张在安防、视频分析、工业质检项目里出镜率极高的Atlas 300V 24G推理卡,再配一个"atlas部署yolo"的高… · 2026/9/26 19:05:47

昇腾 Atlas 300V 部署 YOLOv5 实战:从模型转换到推理调优
昇腾 Atlas 300V 部署 YOLOv5 实战:从模型转换到推理调优

最近被项目里的“atlas”折腾了一轮,把 YOLOv5 的检测模型从 GPU 端迁到 Atlas 300V 24G 这张昇腾推理卡上,从环境搭建、模型转换到推理调优完整走了一遍。如果你也在搜 Atlas 300V 24G 到底是什么卡、能不能跑 YOLO、怎么部署,那这篇实战记录… · 2026/9/26 19:05:47

Atlas 300V 24G推理加速卡部署YOLO实战:从定位到调优
Atlas 300V 24G推理加速卡部署YOLO实战:从定位到调优

"Atlas 300V 24G是运算加速卡吗"——这个热搜问题我太熟悉了。第一次拿到这块卡,我也有同样的困惑:Atlas这名字在数据库圈子里早就被用滥了,怎么AI硬件里又冒出来一个?后来才搞清楚,在AI推理领域&#xff0c… · 2026/9/26 19:05:47

数据库课后习题答案别硬背:当测试用例集刷,效率翻倍
数据库课后习题答案别硬背:当测试用例集刷,效率翻倍

简介:万常选版《数据库原理与设计》课后习题答案资源,覆盖第2至6章及第9章,适合正在学习关系模型、数据库建模、关系数据理论与模式求精的本科生、自学者作为复习与自测材料。压缩包共7个文件,含3个doc参考答案、2个sql示例脚本、… · 2026/9/26 0:00:21

OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置
OpenClaw 替代品?Hermes Agent 踩坑实录:macOS 飞书接入 TaoToken 配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/26 0:00:40

向下兼容与向上兼容:接口设计中的兼容性策略与工程实践
向下兼容与向上兼容:接口设计中的兼容性策略与工程实践

一次版本升级事故,是很多团队绕不过去的坎。线上环境里,服务端明明已经上线了新版接口,老的移动端还在照着旧文档传参数。请求一到网关,校验直接拒绝,用户操作失败,客服群炸了锅,开发群里开始互… · 2026/9/26 0:00:46

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码