查不到 nvidia-smi 说明未安装官方 nvidia 驱动,需检查 lsmod | grep nvidia 和 /proc/driver/nvidia/version;gpu-util 不代表整体负载,应重点关注显存占用、温度及进程显存分配;权限问题需确保用户在 video/render 组并验证 /dev/nvidia* 设备节点。

查不到 nvidia-smi 命令?先确认驱动是否装对
运行 nvidia-smi 报 command not found,大概率是 NVIDIA 驱动根本没装,或只装了开源的 nouveau 驱动。NVIDIA 官方闭源驱动自带 nvidia-smi,而 nouveau 不提供该工具。
验证方式:
- 先看内核模块:lsmod | grep nvidia —— 应有 nvidia、nvidia_uvm 等输出;若只有 nouveau,说明没用上官方驱动
- 再查驱动版本文件:cat /proc/driver/nvidia/version —— 存在即表示驱动已加载
- 若以上都为空,需卸载 nouveau(加 blacklist nouveau 到 /etc/modprobe.d/ 下),再安装对应内核版本的 nvidia-driver 包(如 Ubuntu 用 apt install nvidia-driver-535)
nvidia-smi 默认输出里哪些字段真正反映 GPU 占用
默认执行 nvidia-smi 显示的是“瞬时快照”,但很多人误把 GPU-Util 当成“GPU 使用率”,其实它只代表 SM(流式多处理器)的活跃周期占比,不包含显存带宽、Tensor Core 或 RT Core 的负载。真正影响训练/推理性能的往往是显存占用和温度。
重点关注这几列:
- GPU-Util:仅反映 CUDA 核心忙闲,0% 不代表没在跑任务(比如纯显存拷贝或等待 I/O)
- Memory-Usage:显存已用 / 总量,比利用率更关键;OOM 前兆常是这列接近 100%
- Totals 行下的 PID 和 Process Name:谁在占显存,不是 CPU 进程名,而是实际调用 CUDA 的进程(如 python、tensorboard)
- Temperature:持续 >85°C 可能触发降频,nvidia-smi -q -d TEMPERATURE 可查更细粒度
实时监控 GPU 状态:别用 watch nvidia-smi 直接刷屏
watch -n 1 nvidia-smi 看起来方便,但默认刷新会重绘整个表格,终端滚动快时容易漏掉瞬态峰值,且无法导出数据。更实用的方式是:
- 精简输出,只看关键字段:
nvidia-smi --query-gpu=utilization.gpu,memory.used,memory.total,temperature.gpu --format=csv,noheader,nounits - 加时间戳记录趋势:
while sleep 1; do echo "$(date +%s),$(nvidia-smi --query-gpu=utilization.gpu,memory.used --format=csv,noheader,nounits)"; done > gpu.log - 想图形化?配合
nvtop(类似 htop 的交互式工具),sudo apt install nvtop即可,支持按显存/CPU/GPU 排序,还能看到每个进程的显存分配路径
权限不足、设备不可见?检查 /dev/nvidia* 和用户组
普通用户执行 nvidia-smi 报 NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver,常见于两种情况:
一是驱动加载失败(见第一个副标题);
二是设备节点权限不对:ls -l /dev/nvidia* 应显示 c 195,* root root,且当前用户必须在 video 或 render 组(不同发行版策略不同):
- 检查组成员:groups
- 加入组:sudo usermod -aG video $USER(Ubuntu/Debian)或 sudo usermod -aG render $USER(Fedora/RHEL)
- 重启登录或 newgrp video 生效
注意:Docker 容器内运行 nvidia-smi 需加 --gpus all 参数并确保 nvidia-container-toolkit 已配置,否则容器看不到 /dev/nvidia*
显卡驱动和 nvidia-smi 的耦合非常紧——驱动版本决定命令支持的参数、查询字段甚至返回格式。升级驱动后,旧脚本里用的 --id=0 可能要改成 --id=GPU-xxxx,这类细节最容易被忽略。











