news 2026/5/2 23:06:54

从零搭建GPU监控看板:用Python脚本+nvidia-smi定时抓取数据并可视化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零搭建GPU监控看板:用Python脚本+nvidia-smi定时抓取数据并可视化

从零搭建GPU监控看板:用Python脚本+nvidia-smi定时抓取数据并可视化

在深度学习训练、科学计算或图形渲染场景中,GPU的实时状态监控如同汽车仪表盘——没有它,你永远不知道引擎是否过热或燃油是否耗尽。本文将手把手带您构建一个轻量级GPU监控系统,不仅能实时捕获温度、显存、利用率等关键指标,还能通过可视化图表揭示硬件性能的长期趋势。不同于简单的nvidia-smi命令展示,我们将实现从数据采集、存储到分析的全流程自动化,特别适合需要同时管理多台GPU服务器的团队。

1. 环境准备与工具链选择

1.1 硬件与驱动基础配置

确保所有目标机器已安装NVIDIA官方驱动(版本≥450),可通过以下命令验证环境就绪状态:

nvidia-smi --query-gpu=driver_version,name --format=csv

典型输出示例:

driver_version, name 470.57.02, NVIDIA Tesla V100S-PCIE-32GB

推荐配置清单

  • 操作系统:Ubuntu 20.04 LTS(对NVIDIA驱动兼容性最佳)
  • Python环境:≥3.8(需安装pandas,matplotlib等库)
  • 存储介质:SSD硬盘(高频写入场景下性能更稳定)

1.2 Python生态工具选型对比

工具适用场景优点缺点
subprocess基础命令调用无需额外依赖输出解析较复杂
gpustat快速获取GPU状态人性化输出格式功能扩展性有限
py3nvml直接访问NVML API无需解析命令行输出需处理C语言绑定兼容性

提示:生产环境推荐组合使用subprocess+pandas,兼顾灵活性与数据处理能力。

2. 数据采集模块开发

2.1 定时抓取GPU指标

通过crontab+Python脚本实现分钟级数据采集,核心代码如下:

import subprocess import time from datetime import datetime def fetch_gpu_metrics(): cmd = [ 'nvidia-smi', '--query-gpu=timestamp,utilization.gpu,memory.used,temperature.gpu', '--format=csv,noheader,nounits' ] result = subprocess.run(cmd, capture_output=True, text=True) return [ {k:v for k,v in zip( ['time','gpu_util','mem_used','temp'], line.split(', ') )} for line in result.stdout.strip().split('\n') ] while True: metrics = fetch_gpu_metrics() save_to_database(metrics) # 实现见2.2节 time.sleep(60) # 采集间隔可调

2.2 数据存储方案设计

SQLite作为轻量级数据库的典型配置:

import sqlite3 def init_db(): conn = sqlite3.connect('gpu_monitor.db') conn.execute('''CREATE TABLE IF NOT EXISTS gpu_stats (id INTEGER PRIMARY KEY AUTOINCREMENT, gpu_id INT, timestamp DATETIME, gpu_util INT, mem_used INT, temp INT)''') return conn

性能优化技巧

  • 启用WAL模式提升并发写入性能
  • 定期执行VACUUM命令压缩数据库
  • 按日期分表存储(适合长期监控)

3. 可视化呈现方案

3.1 Matplotlib动态仪表盘

构建可实时刷新的监控面板:

import matplotlib.pyplot as plt from matplotlib.animation import FuncAnimation def update_plot(frame): df = load_last_hour_data() # 自定义数据加载函数 ax.clear() ax.plot(df['timestamp'], df['gpu_util'], label='GPU利用率(%)') ax.plot(df['timestamp'], df['temp'], label='温度(℃)') ax.legend(loc='upper right') fig, ax = plt.subplots(figsize=(12,6)) ani = FuncAnimation(fig, update_plot, interval=60000) plt.show()

3.2 Grafana高级监控方案

配置步骤:

  1. 安装Grafana并添加SQLite数据源插件
  2. 创建Dashboard并添加Time Series面板
  3. 配置SQL查询语句:
SELECT datetime(timestamp) as time, avg(gpu_util) as "GPU利用率" FROM gpu_stats WHERE $__timeFilter(timestamp) GROUP BY strftime('%Y-%m-%d %H:%M', timestamp)

告警规则示例

  • 持续5分钟温度>85℃时触发邮件通知
  • 显存使用率>90%时触发Slack提醒

4. 生产环境部署建议

4.1 系统服务化管理

创建systemd服务实现开机自启:

# /etc/systemd/system/gpu_monitor.service [Unit] Description=GPU Monitoring Daemon [Service] ExecStart=/usr/bin/python3 /opt/gpu_monitor/main.py Restart=always User=root [Install] WantedBy=multi-user.target

4.2 性能与安全优化

  • 资源隔离:使用cgroups限制脚本CPU占用
  • 日志轮转:配置logrotate防止日志膨胀
  • 访问控制:通过iptables限制可视化端口访问

实际部署时发现,将采集间隔从60秒调整为30秒会使SQLite写入队列堆积,建议在8卡以上服务器采用Redis作为缓存层缓解写入压力。

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

Java+AI<AI的使用与Java的基础学习3>

继续学习,通过视频我学会了什么是键盘录入,在我c的基础中,键盘录入像输入函数scanf键盘录入需要使用scanner这个类,在你的main中打出scanner后,在上方会自动生成import java.util.Scanner; //是为了确定scanner的位置…

作者头像 李华
网站建设 2026/5/2 23:05:09

多孩家庭福音:一台KISSABC如何搞定两个孩子的英语启蒙?

二宝妈妈的算盘“我家大宝8岁,二宝3岁。给大宝报班一年两万,给二宝报早教一年一万五,加起来一年三万五。关键是接送累死人。”这是很多二胎家庭的真实写照。教育支出翻倍,时间精力却无法翻倍。行业洞察:多孩家庭的教育…

作者头像 李华
网站建设 2026/5/2 23:03:33

五一趣游福州 鼓山鼓岭双景齐出彩

5 月 1 日至 3 日,福州市鼓岭旅游度假区、鼓山旅游景区两大文旅地标同步推出特色主题活动,以生态疗愈与文化探秘双轮驱动,为市民游客献上兼具松弛感与文化味的假日盛宴,成为福州 “来福州 好好玩” 五一文旅主题活动的亮眼板块。鼓…

作者头像 李华
网站建设 2026/5/2 23:03:33

【android opencv学习笔记】Day 11: CIE L*a*b*色彩空间

深入理解 CIE L*a*b* 色彩空间:原理、特性与应用 CIE L*a*b*(简称 Lab)是国际照明委员会(CIE)于 1976 年发布的感知均匀、设备无关色彩空间,核心价值是让数值差异与人眼视觉差异高度匹配,是图像…

作者头像 李华