python怎么看设备有几个可用gpu
直接答案:在 Python 里查看设备有几个可用 GPU,最常用的是 PyTorch 的 torch.cuda.device_count();如果项目用 TensorFlow,则用 len(tf.config.list_physical_devices('GPU'));如果不依赖深度学习框架,可以在 NVIDIA 显卡环境下调用 nvidia-smi -L 并统计输出行数。判断结果时要区分“机器上有几张 GPU”“当前 Python 进程能看到几张 GPU”和“框架能正常调用几张 GPU”,这三者不一定相同。
一、用 PyTorch 查看可用 GPU 数量
如果你的代码本来就使用 PyTorch,优先用 torch.cuda.device_count()。它返回当前 PyTorch 进程可见的 CUDA GPU 数量,适合训练脚本、推理服务、Jupyter Notebook 和服务器环境。

import torch
print("CUDA 是否可用:", torch.cuda.is_available())
print("当前进程可用 GPU 数量:", torch.cuda.device_count())
for i in range(torch.cuda.device_count()):
print(i, torch.cuda.get_device_name(i))
判断标准:如果 torch.cuda.is_available() 是 True,且 torch.cuda.device_count() 大于 0,说明 PyTorch 可以使用至少一张 NVIDIA CUDA GPU。如果返回 0,不一定代表机器没有显卡,也可能是 PyTorch 版本、CUDA 驱动、容器参数或环境变量限制导致 Python 看不到 GPU。
场景差异:在普通 Linux 服务器上,这个数量通常等于 nvidia-smi 能看到的 GPU 数量;在 Docker 容器中,它只等于容器被分配到的 GPU 数量;在设置了 CUDA_VISIBLE_DEVICES 的进程里,它只统计该变量允许访问的 GPU。
CUDA_VISIBLE_DEVICES=0,2 python train.py
上面这个命令会让当前 Python 程序只看到两张 GPU,且在程序内部编号会重新映射为 cuda:0 和 cuda:1,并不再是物理机器上的 0 和 2。
注意事项:PyTorch 的 GPU 数量是“当前进程可用数量”,不是硬件资产清单。多用户服务器、Kubernetes、Docker、Slurm 调度环境中,管理员可能只给你的任务分配了部分 GPU,此时返回值小于机器实际 GPU 数量是正常现象。
二、用 TensorFlow 查看可用 GPU 数量
如果你的项目使用 TensorFlow 或 Keras,推荐使用 tf.config.list_physical_devices('GPU')。它会返回当前 TensorFlow 运行时可见的物理 GPU 设备列表。
import tensorflow as tf
gpus = tf.config.list_physical_devices("GPU")
print("TensorFlow 可见 GPU 数量:", len(gpus))
for gpu in gpus:
print(gpu)
判断标准:len(gpus) 大于 0,说明 TensorFlow 在当前环境中发现了 GPU。若返回空列表,常见原因包括安装的是 CPU 版本、CUDA/cuDNN 版本不匹配、驱动不可用、容器未暴露 GPU,或者系统没有 NVIDIA CUDA 设备。
场景差异:TensorFlow 里还要区分物理设备和逻辑设备。物理设备是硬件层面的 GPU,逻辑设备可能是经过内存限制、虚拟设备配置或运行时初始化后得到的设备。只想检查“有几张卡”时,用 list_physical_devices('GPU');想确认运行时实际可调度的设备时,再看 tf.config.list_logical_devices('GPU')。
import tensorflow as tf
physical_gpus = tf.config.list_physical_devices("GPU")
logical_gpus = tf.config.list_logical_devices("GPU")
print("物理 GPU:", len(physical_gpus))
print("逻辑 GPU:", len(logical_gpus))
注意事项:TensorFlow 的设备配置通常要在运行时初始化前完成。例如设置显存按需增长、隐藏某些 GPU、创建虚拟 GPU,都应尽量在模型和张量创建前执行。否则可能出现“设备已经初始化,无法再修改可见设备”的错误。
三、不依赖框架:用 nvidia-smi 统计 NVIDIA GPU
如果你只是想在 Python 脚本里检查服务器有几张 NVIDIA GPU,但不想安装 PyTorch 或 TensorFlow,可以调用 nvidia-smi -L。NVIDIA 官方文档中 -L 或 --list-gpus 的作用是列出系统中的每张 NVIDIA GPU 及其 UUID。
import subprocess
def count_nvidia_gpus():
try:
result = subprocess.run(
["nvidia-smi", "-L"],
capture_output=True,
text=True,
check=True
)
except (FileNotFoundError, subprocess.CalledProcessError):
return 0
lines = [line for line in result.stdout.splitlines() if line.strip().startswith("GPU ")]
return len(lines)
print("nvidia-smi 检测到的 GPU 数量:", count_nvidia_gpus())
判断标准:如果输出类似 GPU 0: NVIDIA A100...、GPU 1: NVIDIA A100...,统计行数即可得到 NVIDIA GPU 数量。如果命令不存在,说明系统可能没有安装 NVIDIA 驱动,或当前环境没有把 nvidia-smi 暴露给 Python 进程。
场景差异:这种方法更接近系统层面的检测,适合运维脚本、环境自检脚本和部署前检查。但它依赖 NVIDIA 驱动工具,不适用于 AMD GPU、Apple Silicon 的 MPS 后端,也不能直接证明 PyTorch 或 TensorFlow 一定能成功使用 GPU。
注意事项:不建议用 os.popen() 写新代码,虽然能工作,但错误处理较弱。生产脚本更适合使用 subprocess.run(),并处理命令不存在、权限不足、驱动异常等情况。
四、psutil 能不能直接看 GPU 数量
很多文章会写 psutil.get_gpus(),但标准 psutil 文档并没有这个通用 API。psutil 主要用于 CPU、内存、磁盘、网络、进程和部分传感器信息监控,不应把它当成跨平台 GPU 枚举工具。
判断标准:如果运行下面代码报 AttributeError: module 'psutil' has no attribute 'get_gpus',不是你的环境坏了,而是 psutil 本身通常就没有这个函数。
import psutil
print(hasattr(psutil, "get_gpus"))
场景差异:如果你的目标是监控系统资源,psutil 很合适;如果目标是统计 NVIDIA GPU,优先用 nvidia-smi、NVML Python 绑定或深度学习框架自带接口。若使用第三方包 GPUtil、pynvml 或 nvidia-ml-py,也要明确它们不是 psutil 的标准能力。
注意事项:生产环境中不要盲目复制 psutil.get_gpus() 这类代码。更可靠的写法是根据项目依赖选择检测方式:PyTorch 项目用 PyTorch,TensorFlow 项目用 TensorFlow,纯系统检测用 NVIDIA 官方工具或 NVML。
五、不同系统和环境下的推荐写法
| 使用场景 | 推荐方法 | 判断标准 | 注意事项 |
|---|---|---|---|
| PyTorch 训练 | torch.cuda.device_count() |
返回值大于 0 | 受 CUDA_VISIBLE_DEVICES 和容器分配影响 |
| TensorFlow/Keras 训练 | tf.config.list_physical_devices('GPU') |
列表长度大于 0 | 设备配置要尽量在运行时初始化前完成 |
| 服务器环境自检 | nvidia-smi -L |
能列出 GPU 行 | 只适合 NVIDIA 驱动环境 |
| Docker 容器 | 框架接口 + nvidia-smi |
两边都能看到 GPU | 需要正确传入 --gpus 参数 |
| Mac Apple Silicon | 检查 MPS 后端 | torch.backends.mps.is_available() |
MPS 不是 CUDA GPU,不能用 torch.cuda.device_count() 判断 |
如果你在 Docker 里运行深度学习代码,启动容器时通常需要显式分配 GPU:
docker run --gpus all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi
判断标准:容器内执行 nvidia-smi 能看到 GPU,只说明驱动设备暴露成功;Python 框架里还要再执行 torch.cuda.device_count() 或 TensorFlow 检测代码,确认框架能调用。
注意事项:在云服务器、Notebook 平台和集群调度系统中,看到 0 张 GPU 的常见原因不是代码写错,而是运行实例本身没有分配 GPU、镜像缺少 CUDA 运行库、驱动版本不匹配,或者任务被限制在 CPU 队列。
六、推荐的通用检测函数
如果你希望写一个尽量稳妥的 Python 检测函数,可以优先使用当前项目已有框架,最后再回退到 nvidia-smi。这样既能判断训练框架是否可用,又能在没有框架时做基本系统检测。
def get_available_gpu_count():
# 1. 优先使用 PyTorch
try:
import torch
if torch.cuda.is_available():
return torch.cuda.device_count()
except ImportError:
pass
# 2. 再尝试 TensorFlow
try:
import tensorflow as tf
return len(tf.config.list_physical_devices("GPU"))
except ImportError:
pass
# 3. 最后回退到 nvidia-smi
try:
import subprocess
result = subprocess.run(
["nvidia-smi", "-L"],
capture_output=True,
text=True,
check=True
)
return len([line for line in result.stdout.splitlines() if line.startswith("GPU ")])
except Exception:
return 0
print(get_available_gpu_count())
判断标准:这个函数返回 0,表示当前 Python 环境没有检测到可用 GPU;返回 1 或更大,表示当前环境至少能看到对应数量的 GPU。它适合脚本启动前的环境检查,但不应替代一次真实的小张量计算测试。
场景差异:如果你的项目只使用 PyTorch,不需要引入 TensorFlow 检测;如果你的项目部署在生产服务里,也不建议为了检测 GPU 额外安装大型深度学习框架。检测逻辑应该服务于实际运行栈,而不是越多越好。
注意事项:检测到 GPU 不代表训练一定快。还要检查显存容量、驱动版本、CUDA 版本、模型是否真的放到了 GPU、数据加载是否成为瓶颈。最简单的验证方式是创建一个张量并把它移动到 GPU 上执行一次计算。
import torch
x = torch.randn(1024, 1024, device="cuda")
y = x @ x
print(y.device)
七、常见异常和排查顺序
情况一:nvidia-smi 能看到 GPU,但 PyTorch 返回 0。优先检查 PyTorch 是否安装了 CUDA 版本,而不是 CPU-only 版本。可以打印 torch.version.cuda 和 torch.cuda.is_available()。如果 CUDA 版本为空或不可用,通常需要重新安装匹配的 PyTorch 包。
情况二:服务器有多张 GPU,但 Python 只看到一张。检查 CUDA_VISIBLE_DEVICES、Docker --gpus 参数、Kubernetes 资源限制、Slurm 分配参数。当前进程只能看到被允许访问的设备,这是正常隔离行为。
情况三:Windows 上看不到 GPU。先在命令行运行 nvidia-smi。如果命令不可用,通常是驱动或 PATH 问题;如果命令可用但框架不可用,再检查框架版本和 CUDA 支持情况。
情况四:Mac 上 torch.cuda.device_count() 永远是 0。Apple Silicon 使用的是 MPS 后端,不是 CUDA。应检查 torch.backends.mps.is_available(),并用 device = "mps" 运行支持的模型代码。
常见 QA
Q1:python怎么看设备有几个可用gpu,最简单一行代码是什么?
如果用 PyTorch,最简单是 import torch; print(torch.cuda.device_count())。如果用 TensorFlow,则是 import tensorflow as tf; print(len(tf.config.list_physical_devices('GPU')))。
Q2:为什么我电脑有显卡,但 Python 显示 GPU 数量是 0?
常见原因是显卡不是 NVIDIA CUDA 设备、驱动没装好、深度学习框架是 CPU 版本、CUDA/cuDNN 不匹配,或者当前进程被 CUDA_VISIBLE_DEVICES、Docker、集群调度系统限制了 GPU 可见性。
Q3:Jupyter Notebook 里怎么查看可用 GPU?
可以在代码单元里运行 PyTorch 或 TensorFlow 检测代码,也可以运行 !nvidia-smi 查看系统层面的 NVIDIA GPU 状态。更可靠的做法是两者都看:!nvidia-smi 确认系统可见,框架代码确认 Python 可用。
Q4:多张 GPU 训练时,数量检测到了就会自动并行吗?
不会。检测到多张 GPU 只说明环境可见。PyTorch 需要使用 DataParallel、DistributedDataParallel 或相关训练框架;TensorFlow 需要使用 tf.distribute.MirroredStrategy 等分布式策略,模型才会按预期使用多卡。
Q5:能不能用 psutil 查看 GPU 数量?
标准 psutil 不提供通用的 get_gpus() 接口。查看 GPU 数量应优先使用 PyTorch、TensorFlow、nvidia-smi 或 NVML 相关 Python 绑定。
结论
回答“python怎么看设备有几个可用gpu”时,最稳妥的选择取决于你的运行场景:PyTorch 项目用 torch.cuda.device_count(),TensorFlow 项目用 len(tf.config.list_physical_devices('GPU')),系统自检用 nvidia-smi -L。不要只看机器硬件数量,还要确认当前 Python 进程、容器、调度任务和深度学习框架实际能看到并使用这些 GPU。
参考文献
原创文章,作者:常远雨,如若转载,请注明出处:https://www.wanglitou.cn/article_59289.html
微信扫一扫