怎么用脚本获取显卡状态?从入门到实战的完整指南
目录导读
- 为什么要用脚本监控显卡状态? – 核心需求与场景分析
- 主流显卡状态获取工具对比 – NVIDIA、AMD、Intel 三大阵营
- Python脚本实战:获取NVIDIA显卡实时数据 – 基于nvidia-ml-py库
- Shell脚本进阶:批量监控与日志记录 – 适合服务器运维
- 常见问题与排错指南 – 权限、库缺失、远程监控
- Q&A问答精华 – 用户最关心的10个问题
为什么要用脚本监控显卡状态?
在日常开发、AI训练、挖矿或游戏服务器运维中,显卡状态是核心指标,手动打开任务管理器或NVIDIA控制面板效率低下,尤其当你有数十台机器时,通过脚本自动化获取显卡温度、使用率、显存占用、风扇转速等关键数据,可以实现:

- 实时告警:温度超过85°C自动发送邮件或微信通知
- 负载均衡:监控多卡使用率,动态分配任务
- 性能调优:记录长时间运行数据,分析显存泄漏或降频问题
- 远程诊断:无需登录每台机器,通过API或SSH获取状态
主流显卡状态获取工具对比
| 厂商 | 官方工具 | 脚本兼容性 | 关键命令 | 适用场景 |
|---|---|---|---|---|
| NVIDIA | nvidia-smi | Windows/Linux/macOS | nvidia-smi --query-gpu=... |
最广泛,支持GPU及进程监控 |
| AMD | rocm-smi / amd-smi | Linux (ROCm) | amd-smi -t |
深度学习与计算卡 |
| Intel | intel_gpu_top | Linux | intel_gpu_top -l |
集成显卡及Arc独显 |
| 通用 | OpenHardwareMonitor | Windows (C#/Python) | WMI查询 | 多品牌混用环境 |
选择建议:80%用户使用NVIDIA显卡,优先采用nvidia-smi命令行配合解析脚本,AMD用户需安装ROCm工具包,Intel用户则依赖intel-gpu-tools包。
Python脚本实战:获取NVIDIA显卡实时数据(含代码详解)
步骤1:安装依赖库
pip install nvidia-ml-py3 # 官方推荐库,支持Python3 # 或 pip install pynvml # 轻量级替代方案
步骤2:基础脚本 – 获取单卡温度与使用率
import pynvml
# 初始化NVML
pynvml.nvmlInit()
# 获取设备数量
device_count = pynvml.nvmlDeviceGetCount()
print(f"检测到 {device_count} 张显卡")
for i in range(device_count):
handle = pynvml.nvmlDeviceGetHandleByIndex(i)
name = pynvml.nvmlDeviceGetName(handle)
temp = pynvml.nvmlDeviceGetTemperature(handle, pynvml.NVML_TEMPERATURE_GPU)
util = pynvml.nvmlDeviceGetUtilizationRates(handle)
mem_info = pynvml.nvmlDeviceGetMemoryInfo(handle)
print(f"GPU {i}: {name}")
print(f" 温度: {temp}°C")
print(f" 使用率: {util.gpu}%")
print(f" 显存使用: {mem_info.used / 1024**2:.0f} MB / {mem_info.total / 1024**2:.0f} MB")
pynvml.nvmlShutdown()
步骤3:扩展脚本 – 持续监控并写入CSV
import time
import csv
from datetime import datetime
def monitor_gpu_log(duration=3600, interval=5):
with open('gpu_log.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['时间', 'GPU编号', '温度(°C)', '使用率(%)', '显存占用(MB)'])
start_time = time.time()
pynvml.nvmlInit()
while time.time() - start_time < duration:
for i in range(pynvml.nvmlDeviceGetCount()):
handle = pynvml.nvmlDeviceGetHandleByIndex(i)
temp = pynvml.nvmlDeviceGetTemperature(handle, pynvml.NVML_TEMPERATURE_GPU)
util = pynvml.nvmlDeviceGetUtilizationRates(handle)
mem = pynvml.nvmlDeviceGetMemoryInfo(handle)
writer.writerow([
datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
i, temp, util.gpu, mem.used / 1024**2
])
time.sleep(interval)
pynvml.nvmlShutdown()
# 运行1小时,每5秒记录一次
monitor_gpu_log(duration=3600, interval=5)
注意事项:
- 需要在管理员权限下运行(Linux用
sudo,Windows以管理员身份运行CMD) - 若报错
NVML_ERROR_DRIVER_NOT_LOADED,请检查显卡驱动是否安装正确
Shell脚本进阶:批量监控与日志记录
对于服务器运维,Shell脚本更轻量且无需安装Python库。
NVIDIA专用监控脚本
#!/bin/bash
# 文件名: gpu_monitor.sh
# 使用方法: bash gpu_monitor.sh
OUTFILE="gpu_status_$(date +%Y%m%d).log"
while true; do
echo "=== $(date) ===" >> $OUTFILE
nvidia-smi --query-gpu=index,name,temperature.gpu,utilization.gpu,memory.used,memory.total --format=csv,noheader >> $OUTFILE
echo "" >> $OUTFILE
sleep 10
done
AMD显卡监控(ROCm环境)
#!/bin/bash
while true; do
rocm-smi --showtemp --showuse --showmeminfo vram --json | jq '.' >> amd_monitor.log
sleep 5
done
进阶功能:结合curl和telegram-send实现告警推送:
TEMP=$(nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader)
if [ "$TEMP" -gt 85 ]; then
curl -s -X POST "https://api.telegram.org/bot<TOKEN>/sendMessage" -d "chat_id=<CHAT_ID>&text=警告:GPU温度超过85°C!当前温度:$TEMP°C"
fi
常见问题与排错指南
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
nvidia-smi: command not found |
驱动未安装或PATH未包含 | 检查驱动:which nvidia-smi;重新安装驱动或添加PATH |
Python报 no module named pynvml |
未安装库 | 执行pip install pynvml,注意使用python3环境 |
| 返回结果全部为0 | 显卡空闲或无权限 | 检查显卡是否被其他进程占用;Linux下用sudo运行 |
| 温度读取为负值 | 传感器故障或驱动bug | 更新驱动到最新版本;尝试重启系统 |
| 远程获取失败(SSH) | 防火墙阻止或X11转发 | 使用nvidia-smi -l本地运行,或通过SSH管道数据 |
推荐方案:使用nvidia-smi的XML输出格式(添加--format=xml)便于解析,兼容性最好。
Q&A问答精华
Q1:脚本能同时监控NVIDIA和AMD显卡吗?
A:可以,但需分开处理,建议使用nvidia-smi和amd-smi分别获取,再通过脚本合并输出。
Q2:如何获取显卡的功耗(瓦特)?
A:NVIDIA用nvidia-smi --query-gpu=power.draw --format=csv;AMD用amd-smi --showpower,注意部分旧卡不支持功耗读取。
Q3:脚本长时间运行会占用大量资源吗?
A:不会。nvidia-smi查询本身消耗极小(<2MB内存),建议设置间隔大于2秒,避免频繁调用。
Q4:如何将数据发送到远程服务器?
A:使用curl POST到REST API,或通过influxdb直接写入时序数据库,推荐方案:nvidia-smi --query-gpu=... --format=csv | curl -X POST -d @- http://server:8080/gpu_data
Q5:macOS用户如何获取外接显卡状态?
A:macOS不支持原生nvidia-smi,需通过system_profiler SPDisplaysDataType或安装第三方工具如gfxCardStatus。
Q6:脚本中如何区分多卡并指定某张卡?
A:使用--id=参数,如nvidia-smi --id=0,Python中通过nvmlDeviceGetHandleByIndex(0)索引0代表第一张卡。
Q7:遇到NVML_ERROR_DRIVER_NOT_LOADED如何解决?
A:1) 执行nvidia-smi确认驱动是否加载;2) 重启NVIDIA驱动:sudo modprobe -r nvidia_drm && sudo modprobe nvidia_drm;3) 更新内核模块。
Q8:脚本支持WSL2(Windows子系统)吗?
A:WSL2不支持直接的硬件访问,无法使用nvidia-smi,解决办法:在Windows宿主中运行脚本,或使用WSL1(不推荐)。
Q9:如何在脚本中获取显卡的显存带宽?
A:nvidia-smi无直接输出,需通过nvidia-settings -q GPUCurrentClockFreqs或使用nvmlDeviceGetMaxClockInfo(仅部分新卡支持)。
Q10:脚本监控结果如何可视化?
A:推荐方案:1) Python + Matplotlib生成实时折线图;2) 存入InfluxDB后用Grafana创建仪表盘;3) 输出为Prometheus metrics格式,通过Grafana监控。