怎么用脚本获取显卡状态

wen 实用脚本 2

怎么用脚本获取显卡状态?从入门到实战的完整指南

目录导读

  1. 为什么要用脚本监控显卡状态? – 核心需求与场景分析
  2. 主流显卡状态获取工具对比 – NVIDIA、AMD、Intel 三大阵营
  3. Python脚本实战:获取NVIDIA显卡实时数据 – 基于nvidia-ml-py库
  4. Shell脚本进阶:批量监控与日志记录 – 适合服务器运维
  5. 常见问题与排错指南 – 权限、库缺失、远程监控
  6. 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

进阶功能:结合curltelegram-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-smiamd-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监控。

抱歉,评论功能暂时关闭!