我想知道pytorch
是否正在使用我的GPU。如果在此过程中GPU存在任何活动,则可以使用nvidia-smi
进行检测,但我想要用python
脚本编写的内容。
有办法吗?
答案 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之间轻松切换而无需更改实际代码。
由于对缓存和已分配内存存在一些疑问和困惑,因此我添加了一些有关它的其他信息:
torch.cuda.max_memory_cached(device=None)
返回由缓存分配器管理的最大GPU内存,以字节为单位 给定的设备。
torch.cuda.memory_allocated(device=None)
以张量为单位返回给定设备的当前GPU内存使用情况。
您可以直接按照帖子中上方的说明直接移交 device
,也可以将其保留为 None (无),它将用于current_device()
。
答案 3 :(得分:10)
答案 4 :(得分:7)
其他答案详细说明了如何检查 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
这一切都是棘手的,一旦理解就可以帮助您以更少的调试速度快速处理。