Answers:
这将起作用:
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
这告诉我GPU GeForce GTX 950M
正在被使用PyTorch
。
torch.cuda.current_device()
对我有帮助。它显示出我的GPU太旧了:“找到了具有cuda功能3.0的GPU0 GeForce GTX760。PyTorch不再支持该GPU,因为它太旧了。”
torch.cuda.is_available()
$ watch -n 2 nvidia-smi
做这项工作。有关更多详细信息,请参阅下面的答案。
因为这里没有提出,所以我添加了一个使用的方法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()
。
## neural network in pytorch
,然后在最后添加您的代码。它仍然显示正在使用设备:cuda;。0Gb用于分配和缓存。还尝试了for i in range(epoch):
反向传播后仍将其插入for循环的末尾,仍为
my_tensor_on_gpu * my_tensor_on_cpu
都会失败。
Found GPU0 GeForce GT 750M which is of cuda capability 3.0. PyTorch no longer supports this GPU because it is too old. The minimum cuda capability that we support is 3.5.
在开始运行训练循环之后,如果要从终端手动查看它,则您的程序是否正在使用GPU资源以及使用程度如何,则可以像下面这样简单地使用watch
:
$ watch -n 2 nvidia-smi
这将持续每2秒更新一次使用情况统计信息,直到您按ctrl+c
如果您需要对可能需要的更多GPU统计信息进行更多控制,则可以使用with的更复杂的版本nvidia-smi
--query-gpu=...
。以下是对此的简单说明:
$ watch -n 3 nvidia-smi --query-gpu=index,gpu_name,memory.total,memory.used,memory.free,temperature.gpu,pstate,utilization.gpu,utilization.memory --format=csv
这将输出统计信息,例如:
注意:中的逗号分隔查询名称之间不应有任何空格--query-gpu=...
。否则,这些值将被忽略,并且不返回任何统计信息。
另外,您可以通过执行以下操作来检查您的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/
watch
很有用
从实际的角度来看,只有一个小题外话:
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
class M(nn.Module):
def __init__(self):
super().__init__()
self.l1 = nn.Linear(1,2)
def forward(self, x):
x = self.l1(x)
return x
model = M() # not on cuda
model.to(dev) # is on cuda (all parameters)
print(next(model.parameters()).is_cuda) #True
这一切都是棘手的,一旦理解就可以帮助您以更少的调试快速处理。
M()
啊 在哪里M
定义?
要检查是否有可用的GPU:
torch.cuda.is_available()
如果以上函数返回False
,
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
几乎所有答案都在这里参考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
如果您在这里是因为您的pytorch总是False
为此付出代价torch.cuda.is_available()
,则可能是因为您安装的pytorch版本没有GPU支持。(例如:您先在笔记本电脑中编码,然后在服务器上进行测试)。
在GPU上创建张量,如下所示:
$ python
>>> import torch
>>> print(torch.rand(3,3).cuda())
不要退出,打开另一个终端,并使用以下命令检查python进程是否正在使用GPU:
$ nvidia-smi
nvidia-smi
命令行的解决方案
nvidia-smi
。