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

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

有办法吗?

参考资料:
Stack Overflow
收藏
评论
共 9 个回答
高赞 时间 活跃

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

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

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

收藏
评论

只需从命令提示符或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')
收藏
评论

因为这里没有提出,所以我要添加一个使用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) 

这使得在CPUGPU之间切换变得舒适而无需更改实际代码。


编辑:

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


您可以按照上面在帖子中进一步指定的方式直接移交device ,也可以将其保留为None ,它将使用current_device()

收藏
评论

要检查是否有可用的GPU:

torch.cuda.is_available()

如果以上函数返回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

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

收藏
评论

这将起作用:

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

这说明PyTorch正在使用GPU GeForce GTX 950M

收藏
评论

这里几乎所有答案都参考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
收藏
评论

FWIW:如果您在这里是因为pytorch始终为torch.cuda.is_available()提供falsetorch.cuda.is_available()可能是因为您安装了不支持GPU的pytorch版本。 (例如:您在笔记本电脑中进行了编码,然后在服务器上进行了测试)。解决方案是使用pytorch 下载页面中的正确命令再次卸载并安装pytorch。另请参阅 pytorch问题。

收藏
评论

开始运行训练循环后,如果要从终端手动查看它,则您的程序是否在使用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/

收藏
评论

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

import torch
torch.cuda.is_available()

参考: PyTorch |开始

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号