使用GPU之前我需要安装PyTorch的GPU版本,建议使用conda安装,官方教程地址,需要NVIDIA显卡的电脑。(官网找到对应的版本进行安装)
conda install pytorch torchvision cudatoolkit=10.2 -c pytorch
检测是否可以使用GPU,使用一个全局变量use_gpu,便于后面操作使用
use_gpu = torch.cuda.is_available()
可以使用GPU,use_gpu的值为True,否则为False。当可以使用GPU,我们不想使用,可以直接赋值use_gpu = False
# 第一种方式是定义 cuda 数据类型
dtype = torch.cuda.FloatTensor # 定义默认 GPU 的 数据类型
gpu_tensor = torch.randn(10, 20).type(dtype)
# 第二种方式更简单,推荐使用
gpu_tensor = torch.randn(10, 20).cuda(0) # 将 tensor 放到第一个 GPU 上
gpu_tensor = torch.randn(10, 20).cuda(1) # 将 tensor 放到第二个 GPU 上
使用第一种方式将 tensor 放到 GPU 上的时候会将数据类型转换成定义的类型,而是用第二种方式能够直接将 tensor 放到 GPU 上,类型跟之前保持一致
推荐在定义 tensor 的时候就明确数据类型,然后直接使用第二种方法.cuda()
将 tensor 放到 GPU 上
而将 tensor 放回 CPU 的操作非常简单:
cpu_tensor = gpu_tensor.cpu()
model = get_model()
loss_f = t.nn.CrossEntropyLoss()
if(use_gpu):
model = model.cuda()
loss_f = loss_f.cuda()
# GPU可用,把数据放入GPU
if (use_gpu):
x,y = x.cuda(),y.cuda()
if(use_gpu):
loss = loss.cpu()
acc = acc.cpu()
总结:
cpu_tensor.cuda()
把数据放入GPUgpu_tensor.cpu()
把数据转到CPU用data.to(divice)
来实现数据在GPU和CPU之间转换,如下
# torch.device object used throughout this script
device = torch.device("cuda" if use_cuda else "cpu")
model = MyRNN().to(device)
# train
total_loss = 0
for input, target in train_loader:
input, target = input.to(device), target.to(device)
hidden = input.new_zeros(*h_shape) # has the same device & dtype as `input`
... # get loss and optimize
total_loss += loss.item() # get Python number from 1-element Tensor
# evaluate 评估不在需要跟踪梯度
with torch.no_grad(): # operations inside don't track history
for input, target in test_loader:
...
其他新的更新:[见PyTorch更新]
参考:
1.深度学习入门之 PyTorch
2.Variable和Tensor合并后,PyTorch的代码要怎么改?