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

时间:2018-01-08 14:50:13

标签: python memory-management gpu nvidia pytorch

我想知道pytorch是否正在使用我的GPU。如果在此过程中GPU存在任何活动,则可以使用nvidia-smi进行检测,但我想要用python脚本编写的内容。

有办法吗?

10 个答案:

答案 0 :(得分:91)

这将起作用:

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

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

答案 1 :(得分:28)

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

$ watch -n 2 nvidia-smi

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

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

In [13]: import  torch

In [14]: torch.cuda.is_available()
Out[14]: True

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

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

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

答案 2 :(得分:19)

由于这里没有提出,我要添加一个使用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')

输出:

Using device: cuda

Tesla K80
Memory Usage:
Allocated: 0.3 GB
Cached:    0.6 GB

如上所述,使用device可以:

  • 将张量移动到相应的device

    torch.rand(10).to(device)
    
  • 或直接在device上创建张量:

    torch.rand(10, device=device)
    

这使得在CPU和GPU之间轻松切换而无需更改实际代码。


编辑:

由于对缓存已分配内存存在一些疑问和困惑,因此我添加了一些有关它的其他信息:

  


您可以直接按照帖子中上方的说明直接移交 device ,也可以将其保留为 None (无),它将用于current_device()

答案 3 :(得分:10)

在办公网站和入门页面上,如下检查PyTorch的GPU:

import torch
torch.cuda.is_available()

参考:PyTorch|Get Start

答案 4 :(得分:7)

检查张量是否在 GPU 上

其他答案详细说明了如何检查 GPU 是否在您当前的机器上可用

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

is_cuda

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

>>> my_tensor.is_cuda
True

答案 5 :(得分:3)

要检查是否有可用的GPU:

torch.cuda.is_available()

如果以上函数返回False,则说明您没有GPU,或者尚未安装Nvidia驱动程序,因此操作系统看不到GPU,或者GPU被环境变量{{1 }}。当CUDA_VISIBLE_DEVICES的值为-1时,所有设备均被隐藏。您可以通过以下代码在代码中检查该值:`os.environ ['CUDA_VISIBLE_DEVICES']

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

cpu

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

答案 6 :(得分:2)

此处几乎所有答案均参考torch.cuda.is_available()。但是,那只是硬币的一部分。它告诉您GPU(实际上是CUDA)是否可用,而不是实际上是否在使用它。在典型的设置中,您可以使用以下方式设置设备:

device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

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

if device.type == 'cuda':
    # do something

答案 7 :(得分:1)

仅在命令提示符或Linux环境中运行以下命令。

python -c 'import torch; print(torch.cuda.is_available())'

上面应该打印True

python -c 'import torch; print(torch.rand(2,3).cuda())'

这应该打印以下内容:

tensor([[0.7997, 0.6170, 0.7042], [0.4174, 0.1494, 0.0516]], device='cuda:0')

答案 8 :(得分:0)

在GPU上创建一个张量,如下所示:

$ python
>>> import torch
>>> print(torch.rand(3,3).cuda()) 

不要退出,打开另一个终端并检查python进程是否正在使用GPU:

$ nvidia-smi

答案 9 :(得分:0)

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

import torch
dev = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

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

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