最直接的判断方式是运行tf.config.list_physical_devices('gpu')看是否返回非空列表,但需结合张量.device属性和nvidia-smi实时监控util%才能确认gpu是否真正参与计算。

运行 tf.config.list_physical_devices('GPU') 看是否返回非空列表
这是最直接的判断方式,但很多人误以为只要返回了设备就代表 GPU 正在被用——其实只是说明驱动和 CUDA 环境被 TensorFlow 识别到了。你需要确认的是:模型训练或推理时,计算是否真走 GPU。
- 执行前确保已启动 Python 解释器(推荐用
python -c "import tensorflow as tf; print(tf.__version__)"先验证安装无误) - 如果返回空列表
[],常见原因包括:nvidia-smi能看到卡但tf看不到,大概率是 CUDA/cuDNN 版本不匹配或未正确设置PATH和LD_LIBRARY_PATH - Windows 用户注意:
tf.config.list_physical_devices('GPU')在某些旧版 TF(如 2.10 之前)可能因 WSL 或驱动问题返回空,建议优先用 Linux 或 WSL2 测试
用 tf.device('/GPU:0') 强制指定并检查张量位置
光看设备列表不够,得让 Tensor 实际分配到 GPU 上,并验证其 .device 属性。
import tensorflow as tf
with tf.device('/GPU:0'):
a = tf.constant([[1.0, 2.0], [3.0, 4.0]])
b = tf.constant([[1.0, 1.0], [0.0, 1.0]])
c = tf.matmul(a, b)
print(c.device) # 应输出类似 '/job:localhost/replica:0/task:0/device:GPU:0'
- 如果输出含
GPU字样,说明张量创建和运算是 GPU 执行的;若输出CPU,说明没生效,即使list_physical_devices返回了 GPU - 不要省略
with tf.device(...)——TF 默认会自动 placement,但自动策略有时会 fallback 到 CPU(比如小矩阵乘法),手动指定才能排除干扰 -
/GPU:0中的0是索引,多卡时可试/GPU:1,但需先确认list_physical_devices返回了多个
监控 nvidia-smi 实时查看 GPU 显存和计算占用
这是最终验证手段:脚本运行时,GPU 是否真在干活?
- 新开终端,运行
nvidia-smi -l 1(每秒刷新),再运行你的 TF 脚本(尤其是含model.fit()或大 batch 推理的),观察Memory-Usage和Util%是否明显上升 - 常见陷阱:显存占用涨了但 Util% 始终为 0%,说明数据拷贝到了 GPU,但计算仍跑在 CPU —— 检查是否用了
@tf.function、是否模型里混用了 NumPy 或 CPU-only ops(如某些自定义 loss) - TF 2.10+ 默认启用
cudaMallocAsync,显存占用可能比预期低,但Util%不骗人;若 Util% 一直为 0,基本可断定没走 GPU 计算路径
训练时打印 tf.test.is_gpu_available() 已过时,别用
tf.test.is_gpu_available() 在 TF 2.1+ 中已被标记为 deprecated,且返回值不可靠(它只检测驱动加载,不反映实际可用性)。
- 替代方案就是前面三个步骤组合:设备列表 + 张量 device 属性 + nvidia-smi 实时监控
- 如果你在 Jupyter 里调试,注意 kernel 可能复用进程,改完环境变量后必须重启 kernel 才生效,否则
list_physical_devices还是旧结果 - conda 安装的 TF 有时会自带 CUDA,但版本常与系统 CUDA 冲突;建议统一用 pip + 官方预编译 wheel,按 TensorFlow 官网表格严格匹配 CUDA/cuDNN 版本
nvidia-smi 的 Util% 才最实在。Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











