python 如何确定当前使用的是 cpu 还是 gpu
在 Python 中确定当前使用的是 CPU 还是 GPU,不能只看电脑有没有显卡,而要看“当前计算任务”被哪个库分配到了哪个设备上。最可靠的判断顺序是:先确认系统是否识别 GPU,再确认 Python 库是否能看到 GPU,最后检查张量、模型、算子或进程是否真的运行在 GPU 上。对于 PyTorch 看 tensor.device 和 model.to(device),对于 TensorFlow 看 tf.config.list_physical_devices("GPU") 与算子日志,对于 Numba/CuPy 看 CUDA 是否可用和数组所在设备;如果只是 NumPy、普通 Python 循环或大多数 CPU 版库,默认就是 CPU。
一、先分清“有 GPU”和“正在用 GPU”
很多人搜索“python 如何确定当前使用的是 cpu 还是 gpu”时,真正想确认的是程序有没有把计算放到显卡上。这里要先区分三个层级:系统能否识别 GPU、Python 包能否调用 GPU、当前代码是否真的把数据和计算放到了 GPU。

- 可执行信息:在终端运行
nvidia-smi,或在 Python 中调用系统命令查看 NVIDIA GPU。 - 判断标准:能看到 GPU 型号只表示硬件和驱动可见;看到 Python 进程占用显存、GPU 利用率变化,才更接近“正在用 GPU”。
- 场景差异:NVIDIA 显卡通常看 CUDA;Apple Silicon 常看 MPS 或 Metal;AMD 显卡在深度学习场景通常涉及 ROCm;CPU 环境下 Python 依然能正常运行,只是不会走 GPU 加速。
- 注意事项:CPU 永远存在,只要 Python 能运行就说明 CPU 可用;GPU 可用不代表所有库都会自动使用 GPU。
import os
import platform
import shutil
import subprocess
print("Python:", platform.python_version())
print("CPU cores:", os.cpu_count())
if shutil.which("nvidia-smi"):
output = subprocess.check_output(
["nvidia-smi", "--query-gpu=name,memory.total,memory.used,utilization.gpu", "--format=csv,noheader"],
text=True
)
print("NVIDIA GPU:")
print(output)
else:
print("nvidia-smi not found: 当前环境未发现 NVIDIA GPU 命令行工具")
如果这段代码输出了 GPU 名称,说明系统层面能看到 NVIDIA GPU;如果输出 nvidia-smi not found,可能是没有 NVIDIA 显卡、驱动没装好、命令不在 PATH 中,或者你使用的是非 NVIDIA 平台。
二、用 PyTorch 判断当前张量和模型在哪个设备
PyTorch 中最直接的判断方式是查看 torch.cuda.is_available()、torch.backends.mps.is_available() 以及张量的 device。真正决定计算位置的是张量和模型所在设备,而不是机器是否有 GPU。
- 可执行信息:创建张量后打印
x.device;模型训练时同时检查next(model.parameters()).device和输入数据的device。 - 判断标准:输出
cuda:0表示当前张量在第 0 块 CUDA GPU;输出mps表示 Apple Silicon 的 MPS 后端;输出cpu表示仍在 CPU。 - 场景差异:NVIDIA 环境优先用
cuda;Mac M 系列可用mps;无 GPU 或未安装对应版本 PyTorch 时回退到cpu。 - 注意事项:只写
torch.cuda.is_available()不能证明训练正在用 GPU;模型和数据必须同时移动到同一设备。
import torch
if torch.cuda.is_available():
device = torch.device("cuda")
elif hasattr(torch.backends, "mps") and torch.backends.mps.is_available():
device = torch.device("mps")
else:
device = torch.device("cpu")
x = torch.randn(2048, 2048, device=device)
y = x @ x
print("selected device:", device)
print("tensor device:", y.device)
if device.type == "cuda":
print("GPU name:", torch.cuda.get_device_name(0))
训练模型时可以这样检查:
model = model.to(device)
batch_x = batch_x.to(device)
batch_y = batch_y.to(device)
print("model device:", next(model.parameters()).device)
print("input device:", batch_x.device)
如果模型在 cuda:0,但输入数据还在 cpu,通常会报设备不一致错误;如果没有报错但速度很慢,常见原因是代码中仍有 NumPy 操作、频繁 .cpu()、.numpy(),或每个 batch 都在 CPU 和 GPU 之间来回复制。
三、用 TensorFlow 判断是否使用 GPU
TensorFlow 会在可用时把许多支持 GPU 的算子自动放到 GPU 上,但仍然需要确认 TensorFlow 是否识别到 GPU,以及具体算子是否被放置到 GPU 设备。
- 可执行信息:使用
tf.config.list_physical_devices("GPU")查看 TensorFlow 可见 GPU,并通过tf.debugging.set_log_device_placement(True)打印算子放置日志。 - 判断标准:GPU 列表非空表示 TensorFlow 能看到 GPU;日志或张量设备名中出现
GPU:0,表示相关计算被放在 GPU 上。 - 场景差异:TensorFlow 在服务器 NVIDIA CUDA 环境中常见;Apple Silicon 需要对应的 Metal 支持;CPU 版本 TensorFlow 即使机器有 GPU,也可能只显示 CPU。
- 注意事项:
tf.config.set_visible_devices、显存增长等配置必须尽量在 TensorFlow 初始化 GPU 前设置,否则可能出现运行时错误。
import tensorflow as tf
gpus = tf.config.list_physical_devices("GPU")
cpus = tf.config.list_physical_devices("CPU")
print("CPUs:", cpus)
print("GPUs:", gpus)
print("GPU count:", len(gpus))
tf.debugging.set_log_device_placement(True)
target = "/GPU:0" if gpus else "/CPU:0"
with tf.device(target):
a = tf.random.normal([2048, 2048])
b = tf.random.normal([2048, 2048])
c = tf.matmul(a, b)
print("result device:", c.device)
如果 gpus 是空列表,说明 TensorFlow 当前进程看不到 GPU。常见原因包括安装了 CPU 版包、CUDA/cuDNN 与 TensorFlow 版本不匹配、驱动不可用、容器没有挂载 GPU、云服务器实例本身没有 GPU,或 Mac 环境没有安装对应后端。
四、用 Numba、CuPy 或 PyCUDA 判断 CUDA 是否可用
如果你写的是 CUDA 加速的数组计算或自定义内核,可以用 Numba、CuPy、PyCUDA 直接判断 CUDA 设备。它们更接近底层 GPU 编程场景,适合高性能计算、矩阵运算和自定义 kernel。
- 可执行信息:Numba 使用
cuda.is_available();CuPy 查看数组的device;PyCUDA 初始化驱动后查看设备数量。 - 判断标准:Numba 返回
True、CuPy 数组显示 CUDA 设备、PyCUDA 设备数量大于 0,都说明当前 Python 环境可以访问 CUDA GPU。 - 场景差异:Numba 适合 JIT 编译 CUDA kernel;CuPy 适合替代 NumPy 做 GPU 数组计算;PyCUDA 适合更底层的 CUDA 驱动调用。
- 注意事项:这些方法主要面向 NVIDIA CUDA;它们不能代表 PyTorch、TensorFlow 一定也配置正确。
from numba import cuda
if cuda.is_available():
print("CUDA GPU available")
cuda.detect()
else:
print("CUDA GPU not available, 当前会使用 CPU 或无法运行 CUDA kernel")
import cupy as cp
x = cp.arange(10)
print("CuPy array device:", x.device)
print("GPU count:", cp.cuda.runtime.getDeviceCount())
import pycuda.driver as cuda
cuda.init()
count = cuda.Device.count()
print("PyCUDA device count:", count)
if count > 0:
dev = cuda.Device(0)
print("first GPU:", dev.name())
注意,创建 CUDA context 或数组只能说明当前库已经连接到 GPU;要证明某段业务逻辑使用 GPU,还要检查数据是否是 GPU 数组,以及耗时计算是否使用 GPU API。
五、用 nvidia-smi 判断 Python 进程是否真的占用 GPU
框架内部判断之外,还可以从系统层面观察 Python 进程。对于 NVIDIA GPU,nvidia-smi 是最常用的方法,可以查看显存占用、GPU 利用率、进程 PID 和进程名称。
- 可执行信息:在运行 Python 程序时打开另一个终端,执行
nvidia-smi或查询 compute apps。 - 判断标准:如果看到对应 Python PID 出现在进程列表中,并且显存占用或 GPU 利用率随计算变化,说明程序正在使用 GPU。
- 场景差异:训练深度学习模型时显存通常会明显增加;短小矩阵计算可能一闪而过;数据预处理、读取文件、普通 for 循环仍主要占 CPU。
- 注意事项:GPU 利用率为 0% 不一定代表没有用 GPU,可能只是采样瞬间没有 kernel 在运行;显存占用也可能只是框架预分配,不代表 GPU 正在高速计算。
nvidia-smi
nvidia-smi --query-compute-apps=pid,process_name,used_memory --format=csv
Linux 上可以用 watch -n 1 nvidia-smi 持续观察;Windows 可以重复运行命令,或使用 NVIDIA 控制面板、任务管理器的 GPU 页面辅助确认。
六、用基准测试辅助判断,但不要只看耗时
基准测试可以辅助判断 CPU 和 GPU 的性能差异,但不能作为唯一证据。GPU 运算常常是异步的,如果不做同步,计时会偏小;如果把数据传输时间算进去,小任务反而可能比 CPU 慢。
- 可执行信息:分别用 NumPy 和 CuPy 做矩阵乘法,GPU 计时前后调用同步。
- 判断标准:大矩阵计算中 CuPy 版本通常明显快于 NumPy,并且
nvidia-smi能看到 Python 进程活动,才说明 GPU 路径有效。 - 场景差异:小数组、频繁数据搬运、分支很多的 Python 逻辑不适合 GPU;大规模矩阵乘法、卷积、批量张量计算更适合 GPU。
- 注意事项:不要把 CPU 的 NumPy 数组直接拿去判断 GPU;NumPy 默认运行在 CPU,CuPy/PyTorch/TensorFlow 张量才可能驻留 GPU。
import time
import numpy as np
n = 4096
a_np = np.random.rand(n, n).astype("float32")
b_np = np.random.rand(n, n).astype("float32")
start = time.perf_counter()
c_np = a_np @ b_np
cpu_time = time.perf_counter() - start
print("NumPy CPU time:", cpu_time)
try:
import cupy as cp
a_gpu = cp.asarray(a_np)
b_gpu = cp.asarray(b_np)
cp.cuda.Stream.null.synchronize()
start = time.perf_counter()
c_gpu = a_gpu @ b_gpu
cp.cuda.Stream.null.synchronize()
gpu_time = time.perf_counter() - start
print("CuPy GPU time:", gpu_time)
print("CuPy result device:", c_gpu.device)
except Exception as exc:
print("GPU benchmark skipped:", exc)
如果 GPU 版本没有更快,先检查任务规模、数据是否频繁从 CPU 复制到 GPU、是否安装了正确 CUDA 运行时,以及当前 GPU 是否被其他进程占满。
七、不同代码类型的判断方式
不同 Python 代码使用 CPU/GPU 的方式不同,判断标准也不同。下面这些结论可以快速定位问题。
- 普通 Python 代码:
for循环、列表推导、字符串处理、文件读写默认使用 CPU。判断标准是没有 GPU 张量、没有 CUDA 调用、nvidia-smi无相关进程活动。 - NumPy / pandas:默认使用 CPU。即使机器有 GPU,
np.array、DataFrame也不会自动跑到 GPU。 - PyTorch:看
torch.cuda.is_available()和tensor.device。只有模型参数和输入张量都在cuda或mps上,相关算子才会走对应加速设备。 - TensorFlow:看
tf.config.list_physical_devices("GPU")、张量设备名和算子日志。GPU 可见时,支持 GPU 的算子通常会被自动放置。 - CuPy / Numba / PyCUDA:看 CUDA 设备是否可用,以及数组或 kernel 是否创建在 GPU 上。
注意事项是:一个程序可以同时使用 CPU 和 GPU。深度学习训练中,数据加载、解码、增强、日志记录可能在 CPU,矩阵乘法和反向传播在 GPU。因此更准确的说法不是“Python 用 CPU 还是 GPU”,而是“这段计算是否被放到了 GPU”。
八、常见问题解答
1. 为什么 torch.cuda.is_available() 是 True,但训练还是像 CPU 一样慢?
最常见原因是模型或输入数据没有移动到 GPU。检查 next(model.parameters()).device 和 batch_x.device,二者都应是 cuda:0。如果其中一个是 cpu,训练就不会按预期走 GPU,或者会直接报设备不一致错误。
2. 有显卡,为什么 TensorFlow 找不到 GPU?
可能是安装了 CPU 版 TensorFlow、CUDA/cuDNN/驱动版本不匹配、容器没有暴露 GPU、云主机不是 GPU 实例,或 Apple Silicon 没有安装对应 Metal 后端。先运行 nvidia-smi,再运行 tf.config.list_physical_devices("GPU"),可以区分是系统问题还是 TensorFlow 环境问题。
3. psutil 能不能直接判断 Python 是否使用 GPU?
psutil适合查看 CPU 核心数、CPU 占用、内存和进程信息,但它不是通用 GPU 检测工具。要看 NVIDIA GPU,优先用 nvidia-smi、NVML、GPUtil 或框架自带 API;要看 PyTorch/TensorFlow 是否用 GPU,仍应检查张量和算子设备。
4. Mac M 系列芯片怎么判断 Python 在用 CPU 还是 GPU?
PyTorch 中可检查 torch.backends.mps.is_available(),并查看张量是否在 mps 设备上。Mac 不使用 CUDA,所以 nvidia-smi 和 torch.cuda.is_available() 通常不适用。
5. 在 Jupyter Notebook 或 Colab 里怎么确认?
Colab 先执行 !nvidia-smi 查看是否分配到 GPU,再用当前框架的设备检查代码。Jupyter 本地环境则同样看 nvidia-smi、tensor.device、tf.config.list_physical_devices("GPU")。如果 Notebook 内核和终端不是同一个虚拟环境,终端能看到 GPU 不代表 Notebook 里的包也配置正确。
结论
判断 Python 当前使用 CPU 还是 GPU,优先看具体计算对象的位置:PyTorch 看 tensor.device 和模型参数设备,TensorFlow 看 GPU 设备列表与算子放置日志,CuPy/Numba/PyCUDA 看 CUDA 数组或 kernel 是否在 GPU 上。系统层面的 nvidia-smi 可以验证 Python 进程是否占用 GPU,但它不能替代框架内部判断。只要代码使用的是普通 Python、NumPy、pandas 或未迁移到 GPU 的模型,默认就是 CPU;只有数据、模型和支持 GPU 的算子同时满足条件,Python 程序才真正使用 GPU。
参考文献
原创文章,作者:孔飞欣,如若转载,请注明出处:https://www.wanglitou.cn/article_112264.html
微信扫一扫