nvidia-smi 是最直接的实时 GPU 监控方式,每秒刷新 GPU 利用率、显存占用等;tf.profiler 适用于训练阶段细粒度性能分析;tf.config.experimental.get_memory_info() 仅提供 TensorFlow 显存快照,不反映实时负载。

用 nvidia-smi 命令行是最直接的实时监控方式
TensorFlow 本身不提供内置的 GPU 使用率(如显存占用、GPU 利用率百分比)实时流式接口。想看到“每秒刷新”的 GPU 状态,nvidia-smi 是最轻量、最可靠的选择,它直接读取 NVIDIA 驱动暴露的指标,和 TensorFlow 是否运行无关。
常见错误是试图用 tf.config.list_physical_devices('GPU') 或 tf.test.is_gpu_available()(已弃用)来判断使用率——它们只返回设备存在性或简单能力信息,完全不反映当前负载。
- 终端执行
nvidia-smi -l 1:每秒刷新一次,显示 GPU-Util(计算利用率)、Memory-Usage(显存占用)、Processes(占用进程) - 若需在 Python 脚本中捕获,可用
subprocess.run(['nvidia-smi', '--query-gpu=utilization.gpu,memory.used,memory.total', '--format=csv,noheader,nounits'], capture_output=True, text=True)解析 CSV 输出 - 注意权限:某些容器或受限环境可能无法执行
nvidia-smi,此时需确认容器是否以--gpus all启动且驱动已正确挂载
TensorFlow 的 tf.profiler 适合分析训练阶段的 GPU 时间分布
如果你关心的不是“此刻 GPU 占了多少%”,而是“训练时哪些 OP 消耗最多 GPU 时间、是否存在 CPU-GPU 同步瓶颈”,tf.profiler 才是正解。它不提供实时仪表盘,但能生成带时间轴的详细 trace。
容易踩的坑是开启 profiler 后没控制采样范围,导致日志爆炸或性能严重下降。
立即学习“Python免费学习笔记(深入)”;
- 仅对单步(step)采样:
tf.profiler.experimental.start('logdir')→ 运行 1–5 步 →tf.profiler.experimental.stop() - 必须指定
host_tracer_level=2和python_tracer_level=1才能同时捕获 GPU kernel 和 host-side 开销 - 生成的
plugins/profile/下文件需用 TensorBoard 加载:tensorboard --logdir=logdir --bind_all,然后打开 Profile 标签页
通过 tf.config.experimental.get_memory_info() 获取显存快照
这是 TensorFlow 唯一能从 Python 层直接拿到的 GPU 显存数据,但它只返回“当前已分配”和“峰值已分配”两个值,**没有实时变化率,也不包含 GPU 计算单元利用率**。
典型误用是把它当 nvidia-smi 替代品,结果发现数值不变或远低于预期。
- 调用前确保已初始化设备:
tf.config.set_visible_devices(tf.config.list_physical_devices('GPU'), 'GPU') - 获取当前显存(单位字节):
tf.config.experimental.get_memory_info('GPU:0')['current'] - 该值反映的是 TensorFlow 内存池(bfc allocator)的分配量,不等于
nvidia-smi中的memory.used(后者含 CUDA 上下文、临时 buffer 等) - 频繁调用无意义——它不自动刷新,需手动重取
不要依赖 tf.test.gpu_device_name() 或 device_lib.list_local_devices() 查使用率
这两个 API 完全不返回任何动态指标。前者只返回第一个可用 GPU 的名称字符串(如 /device:GPU:0),后者返回静态设备描述(型号、内存大小、计算能力),连“是否正在被占用”都无法判断。
试图用它们做监控逻辑,最终只会得到固定不变的输出,和真实 GPU 负载毫无关系。
-
tf.test.gpu_device_name()在无 GPU 时返回空字符串,但不会报错,容易掩盖环境配置问题 -
device_lib.list_local_devices()中的memory_limit是用户设置的软上限(如set_memory_limit),不是当前使用量 - 真正需要“感知 GPU 是否忙”,唯一靠谱路径仍是轮询
nvidia-smi或集成py3nvml库


















