1. 设置训练模型的GPU设备的方式
device = torch.device("cuda:1" )
model = model.to(device)
2. CPU和GPU上Tensor的比较
该部分参考自来自达摩院大神的讲解
PyTorch中的数据类型为Tensor,Tensor与Numpy中的ndarray类似,同样可以用于标量,向量,矩阵乃至更高维度上面的计算。PyTorch中的tensor又包括CPU上的数据类型和GPU上的数据类型,一般GPU上的Tensor是CPU上的Tensor加cuda()函数得到。系统默认的torch.Tensor是torch.FloatTensor类型。例如data = torch.Tensor(2,3)是一个2*3的张量,类型为FloatTensor; data.cuda()就将其转换为GPU的张量类型,torch.cuda.FloatTensor类型。
(1) Tensor和numpy.ndarray之间可以相互转换:
- Numpy转Tensor: torch.from_numpy(numpy矩阵)
- Tensor转Numpy: Torch矩阵.numpy()
举例如下:
import numpy as np
import torch
a_tensor = torch.randint(0, 10, (2,3)) # Tensor声明
print(type(a_tensor))
a_numpy = a_tensor.numpy() # Tensor转Numpy
print(type(a_numpy))
b_numpy = np.array([[1,2,3], [4,5,6]]) # Numpy声明
print(type(b_numpy))
b_tensor = torch.from_numpy(b_numpy) # Numpy转Tensor
print(type(b_tensor))
# 结果打印如下:
<class 'torch.Tensor'>
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
<class 'torch.Tensor'>
numpy与Tensor最大的区别就是在对GPU的支持上。Tensor只需要调用cuda()函数就可以将其转化为能在GPU上运行的类型。
(2) CPU和GPU的Tensor之间的转换
- CPU转GPU: data.cuda()
- GPU转CPU: data.cpu()
3. Pytorch中.cuda(non_blocking=True)的作用
.cuda()是为了将模型放在GPU上进行训练。
- 为何要设置参数non_blocking=True呢?
non_blocking默认值为False, 通常我们会在加载数据时,将DataLoader的参数pin_memory设置为True, DataLoader中参数pin_memory的作用是:将生成的Tensor数据存放在哪里,值为True时,意味着生成的Tensor数据存放在锁页内存中,这样内存中的Tensor转义到GPU的显存会更快。
主机中的内存,有两种存在方式,一是锁页,二是不锁页,锁页内存存放的内容在任何情况下都不会与主机的虚拟内存进行交换(注:虚拟内存就是硬盘),而不锁页内存在主机内存不足时,数据会存放在虚拟内存中。显卡中的显存全部是锁页内存,当计算机的内存充足的时候,可以设置pin_memory=True。当系统卡住,或者交换内存使用过多的时候,设置pin_memory=False。(参考:链接)
如果pin_memory=True的话,将数据放入GPU的时候,也应该把non_blocking打开,这样就只把数据放入GPU而不取出,访问时间会大大减少。