python 如何确定当前使用的是 cpu 还是 gpu

python 如何确定当前使用的是 cpu 还是 gpu

Python 中确定当前使用的是 CPU 还是 GPU,不能只看电脑有没有显卡,而要看“当前计算任务”被哪个库分配到了哪个设备上。最可靠的判断顺序是:先确认系统是否识别 GPU,再确认 Python 库是否能看到 GPU,最后检查张量、模型、算子或进程是否真的运行在 GPU 上。对于 PyTorch 看 tensor.devicemodel.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。

python 如何确定当前使用的是 cpu 还是 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.arrayDataFrame 也不会自动跑到 GPU。
  • PyTorch:torch.cuda.is_available()tensor.device。只有模型参数和输入张量都在 cudamps 上,相关算子才会走对应加速设备。
  • 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()).devicebatch_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-smitorch.cuda.is_available() 通常不适用。

5. 在 Jupyter Notebook 或 Colab 里怎么确认?

Colab 先执行 !nvidia-smi 查看是否分配到 GPU,再用当前框架的设备检查代码。Jupyter 本地环境则同样看 nvidia-smitensor.devicetf.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

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 2024-07-15 23:48
下一篇 2024-07-16 01:43

相关推荐

公众号