服务器查看GPU内存:核心方法与专业方案
核心结论: 高效精确地监控服务器GPU内存状态是运维与开发的关键,首选nvidia-smi命令行工具,复杂场景推荐结合gpustat、NVIDIA DCGM或Kubernetes监控方案,实现从基础查询到自动化告警的全覆盖。

基础利器:nvidia-smi 命令详解
作为NVIDIA官方工具,nvidia-smi是查看GPU信息的黄金标准:
nvidia-smi
关键输出解读:
Memory-Usage:Used / Total格式直观显示显存使用量(如15476MiB / 24576MiB)。Processes表格: 精确列出占用显存的进程ID(PID)、进程名及显存用量。
进阶参数组合:
- 实时监控:
watch -n 1 nvidia-smi(每秒刷新一次) - 精简输出:
nvidia-smi --query-gpu=memory.used,memory.total --format=csv - 指定GPU:
nvidia-smi -i 0(仅查看GPU 0)
专业提示: nvidia-smi显示的显存占用可能高于进程实际申请量,因CUDA上下文、内核模块等系统开销也会占用显存。
增强视图:gpustat 工具
gpustat提供更简洁、色彩化的实时监控:

pip install gpustat # 安装 gpustat -cp --color # 带色彩和进程信息,每秒刷新
核心优势:
- 单行概览: 所有GPU状态(利用率、温度、显存)一目了然。
- 进程归属清晰: 直接显示占用显存的用户名和进程名。
- 容器友好: 在Docker容器内安装后,可直接监控宿主机的GPU状态(需映射设备)。
企业级监控:NVIDIA DCGM
NVIDIA Data Center GPU Manager (DCGM) 是数据中心级监控、管理解决方案:
- 安装:
# Ubuntu/Debian apt-get install -y datacenter-gpu-manager # RHEL/CentOS yum install -y datacenter-gpu-manager
- 启动服务:
systemctl start nvidia-dcgm systemctl enable nvidia-dcgm
- 使用工具:
- 命令行:
dcgmi dmon -e 1009(监控显存使用FB Used字段,代码1009) - API/可视化: 集成Prometheus+Grafana或NVIDIA DCGM Exporter实现Dashboard、历史记录、阈值告警。
- 命令行:
核心价值: DCGM提供低开销、高精度的细粒度监控,支持主动健康检查、策略驱动管理,是大型集群和AI平台的基石。
云原生方案:Kubernetes GPU监控
在K8s集群中管理GPU资源:
- 设备插件: 部署
nvidia/k8s-device-plugin,使K8s能感知GPU资源。 - 监控方案:
- DCGM Exporter + Prometheus + Grafana: 标准方案,提供Pod/容器级GPU显存指标。
- Kubernetes Metrics Server + kubectl top:
kubectl top pod --containers | grep -i gpu # 查找GPU容器资源消耗
- 厂商方案: 如阿里云ACK的GPU监控、AWS CloudWatch Container Insights。
关键指标: DCGM_FI_DEV_FB_USED (显存使用量)、DCGM_FI_DEV_FB_FREE (显存空闲量)。

显存优化与疑难处理
- 释放缓存: PyTorch使用
torch.cuda.empty_cache();TensorFlow 可尝试配置config.gpu_options.allow_growth = True或重启进程。 nvidia-smi无输出? 检查驱动安装(nvidia-smi能否运行)、K8s Device Plugin状态、容器设备映射(--gpus all)。- 显存占用高但无活跃进程? 常见于未彻底释放资源的已终止进程(尤其容器环境),尝试重启相关服务或容器。
常见问题解答 (Q&A)
Q1:在Kubernetes Pod里执行nvidia-smi报错Failed to initialize NVML: Unknown Error,如何解决?
- 原因排查:
- Pod未正确声明GPU资源: 检查Pod YAML是否包含
resources.limits.nvidia.com/gpu: 1。 - 节点GPU驱动或组件异常: 在宿主机运行
nvidia-smi验证驱动状态。 - K8s Device Plugin未运行/异常: 执行
kubectl get pods -n kube-system | grep nvidia-device-plugin检查插件Pod状态。 - 容器缺少设备或权限: 确保容器运行时(如Docker)配置了
--gpus选项或等效能力。
- Pod未正确声明GPU资源: 检查Pod YAML是否包含
- 解决步骤: 优先确认宿主机驱动正常,再检查Device Plugin日志,最后核对Pod的资源请求配置。
Q2:训练结束后,nvidia-smi显示显存未被完全释放,如何彻底清理?
- 标准流程:
- 终止占用进程: 使用
kill -9 <PID>结束相关训练进程(通过nvidia-smi或gpustat查询PID)。 - 框架级清理: 对于PyTorch,确认代码中调用了
torch.cuda.empty_cache();TensorFlow用户可尝试设置allow_growth。 - 重启终极方案: 若上述无效,重启宿主机的NVIDIA驱动模块是最可靠方式:
sudo rmmod nvidia_uvm nvidia_drm nvidia_modeset nvidia && sudo modprobe nvidia
- 终止占用进程: 使用
- 深入分析: 此问题常由CUDA上下文残留引起,使用
fuser -v /dev/nvidia可辅助查找异常持有GPU设备文件的进程,容器环境下,重启容器通常即可解决。
掌握这些方法,是否已解决您当前的GPU监控需求?欢迎分享您在服务器GPU管理中的实战经验或遇到的独特挑战!
原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/35107.html