如何检查pytorch是否正在使用GPU?

vin*_*zee 95 python memory-management gpu nvidia pytorch

我想知道是否pytorch正在使用我的GPU.可以nvidia-smi在进程中检测GPU是否有任何活动,但我想要用python脚本编写的东西.

有办法吗?

vin*_*zee 164

这将是有效的:

In [1]: import torch

In [2]: torch.cuda.current_device()
Out[2]: 0

In [3]: torch.cuda.device(0)
Out[3]: <torch.cuda.device at 0x7efce0b03be0>

In [4]: torch.cuda.device_count()
Out[4]: 1

In [5]: torch.cuda.get_device_name(0)
Out[5]: 'GeForce GTX 950M'

In [6]: torch.cuda.is_available()
Out[6]: True
Run Code Online (Sandbox Code Playgroud)

这告诉我GeForce GTX 950M正在使用GPU PyTorch.

  • 我认为这只是表明这些设备可以在机器上使用,但是我不确定你是否可以从每个GPU中获得多少内存. (8认同)
  • 运行`torch.cuda.current_device()`对我有帮助。它显示出我的GPU太旧了:“找到了具有cuda功能3.0的GPU0 GeForce GTX760。PyTorch不再支持此GPU,因为它太旧了。” (3认同)
  • @frank 是的,只需这个命令:“$ watch -n 2 nvidia-smi”即可完成这项工作。有关更多详细信息,请参阅[下面我的回答](/sf/answers/3372520021/)。 (3认同)
  • `torch.cuda.is_available()` (2认同)

kma*_*o23 34

在您开始运行训练循环之后,如果您想从终端手动观察它是否您的程序正在使用GPU资源以及在何种程度上,那么您可以使用:

$ watch -n 2 nvidia-smi
Run Code Online (Sandbox Code Playgroud)

这将每2秒更新统计数据,直到您按ctrl+c


此外,您可以通过执行以下操作来检查PyTorch的安装是否正确检测到您的CUDA安装:

In [13]: import  torch

In [14]: torch.cuda.is_available()
Out[14]: True
Run Code Online (Sandbox Code Playgroud)

True状态意味着PyTorch已正确配置并且正在使用GPU,尽管您必须在代码中移动/放置具有必要语句的张量.


如果您想在Python代码中执行此操作,请查看此模块:

https://github.com/jonsafari/nvidia-ml-py或pypi:https://pypi.python.org/pypi/nvidia-ml-py/

  • nvidia-smi 有一个标志 -l 表示循环秒数,因此您不必使用 `watch`:`nvidia-smi -l 2` 或以毫秒为单位:`nvidia-smi -lms 2000` (5认同)
  • 只需记住,PyTorch使用了缓存的GPU内存分配器。您可能会发现nividia-smi的GPU-Utill低,即使已被完全使用。 (2认同)

blu*_*nox 32

由于这里没有提出,我正在添加一个方法torch.device,因为这非常方便,也可以在正确的初始化张量时使用device.

# setting device on GPU if available, else CPU
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print('Using device:', device)
print()

#Additional Info when using cuda
if device.type == 'cuda':
    print(torch.cuda.get_device_name(0))
    print('Memory Usage:')
    print('Allocated:', round(torch.cuda.memory_allocated(0)/1024**3,1), 'GB')
    print('Cached:   ', round(torch.cuda.memory_cached(0)/1024**3,1), 'GB')
Run Code Online (Sandbox Code Playgroud)

输出:

Using device: cuda

Tesla K80
Memory Usage:
Allocated: 0.3 GB
Cached:    0.6 GB
Run Code Online (Sandbox Code Playgroud)

如上所述,使用device它可以:

这使得CPU和GPU之间的切换更加舒适,而无需更改实际代码.

  • 你的回答很好,但对于第一个设备分配行,我想指出,仅仅因为有一个 cuda 设备可用,并不意味着我们可以使用它。例如,我在我值得信赖的旧计算机上有这个:“发现 GPU0 GeForce GT 750M,其 cuda 功能为 3.0。PyTorch 不再支持该 GPU,因为它太旧了。我们支持的最低 cuda 功能是 3.5。 (4认同)
  • 我尝试了你的代码,它识别显卡,但分配和缓存都是 0GB。这是正常的还是我需要配置它们? (2认同)
  • @KubiK888 你必须保持一致,你不能跨设备执行操作。任何像 `my_tensor_on_gpu * my_tensor_on_cpu` 这样的操作都会失败。 (2认同)

小智 11

在office站点和get start页面上,检查GPU的PyTorch如下:

import torch
torch.cuda.is_available()
Run Code Online (Sandbox Code Playgroud)

参考:PyTorch |开始


Jad*_*mas 11

要检查是否有可用的 GPU:

torch.cuda.is_available()
Run Code Online (Sandbox Code Playgroud)

如果上述函数返回False

  1. 你要么没有 GPU,
  2. 或者未安装 Nvidia 驱动程序,因此操作系统看不到 GPU,
  3. 或者 GPU 被环境变量隐藏CUDA_VISIBLE_DEVICES。当 的值为CUDA_VISIBLE_DEVICES-1 时,您的所有设备都将被隐藏。您可以使用以下行在代码中检查该值:os.environ['CUDA_VISIBLE_DEVICES']

如果上述函数返回True,并不一定意味着您正在使用 GPU。在 Pytorch 中,您可以在创建设备时将张量分配给它们。默认情况下,张量被分配给cpu. 要检查张量的分配位置,请执行以下操作:

# assuming that 'a' is a tensor created somewhere else
a.device  # returns the device where the tensor is allocated
Run Code Online (Sandbox Code Playgroud)

请注意,您不能对分配在不同设备中的张量进行操作。要查看如何为 GPU 分配张量,请参见此处:https : //pytorch.org/docs/stable/notes/cuda.html


pro*_*sti 7

从实际的角度来看,只有一个小题外话:

import torch
dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
Run Code Online (Sandbox Code Playgroud)

dev现在知道,如果CUDA或CPU。

当移到cuda时,如何处理模型和张量是有区别的。起初有点奇怪。

import torch
dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
t1 = torch.randn(1,2)
t2 = torch.randn(1,2).to(dev)
print(t1)  # tensor([[-0.2678,  1.9252]])
print(t2)  # tensor([[ 0.5117, -3.6247]], device='cuda:0')
t1.to(dev) 
print(t1)  # tensor([[-0.2678,  1.9252]]) 
print(t1.is_cuda) # False
t1=t1.to(dev)
print(t1)  # tensor([[-0.2678,  1.9252]], device='cuda:0') 
print(t1.is_cuda) # True


model = M()   # not on cuda
model.to(dev) # is on cuda (all parameters)
print(next(model.parameters()).is_cuda) #True
Run Code Online (Sandbox Code Playgroud)

这一切都是棘手的,一旦理解,就可以帮助您以更少的调试速度快速处理。

  • 你还需要在开始时 `import torch.nn as nn` (2认同)

uke*_*emi 7

检查张量是否在 GPU 上

其他答案详细介绍了如何检查,如果GPU是提供您的当前机器上。

要检查给定的张量是否GPU使用(即存储和操作),您可以访问deviceis_cuda属性:

>>> my_tensor.is_cuda
True
Run Code Online (Sandbox Code Playgroud)

对于模型,您需要检查其每个参数(例如权重张量):

>>> all(p.is_cuda for p in my_model.parameters())
True
Run Code Online (Sandbox Code Playgroud)


Sat*_*ash 7

对于 MacBook M1 系统:

import torch
print(torch.backends.mps.is_available(), torch.backends.mps.is_built())
Run Code Online (Sandbox Code Playgroud)

两者都应该是真的。

  • 请注意,这至少也适用于一些较旧的英特尔 Macbook。这适用于我的 2019 年配备 Radeon Pro 560X 4gb GPU 的 Intel MacBook。 (2认同)

Bra*_*roy 6

这里几乎所有的答案都参考了torch.cuda.is_available()。然而,这只是硬币的一部分。它告诉您 GPU(实际上是 CUDA)是否可用,而不是它是否正在实际使用。在典型的设置中,您将使用以下内容设置您的设备:

device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
Run Code Online (Sandbox Code Playgroud)

但是在更大的环境(例如研究)中,为用户提供更多选择也是很常见的,因此根据输入,他们可以禁用 CUDA,指定 CUDA ID,等等。在这种情况下,是否使用GPU不仅仅取决于它是否可用。设备设置为torch设备后,可以通过获取其type属性来验证是否为CUDA。

if device.type == 'cuda':
    # do something
Run Code Online (Sandbox Code Playgroud)


DSB*_*BLR 5

只需从命令提示符或 Linux 环境运行以下命令。

python -c 'import torch; print(torch.cuda.is_available())'
Run Code Online (Sandbox Code Playgroud)

以上应该打印 True

python -c 'import torch; print(torch.rand(2,3).cuda())'
Run Code Online (Sandbox Code Playgroud)

这个应该打印以下内容:

tensor([[0.7997, 0.6170, 0.7042], [0.4174, 0.1494, 0.0516]], device='cuda:0')
Run Code Online (Sandbox Code Playgroud)