PyTorch 数据在CPU和GPU之间转换

PyTorch-GPU加速(数据在CPU与GPU上的相互转换)

文章目录

  • PyTorch-GPU加速(数据在CPU与GPU上的相互转换)
    • 1. 安装GPU
    • 2. Tensor放在GPU上
      • 2.1 可以使用以下两种方式将 Tensor 放到 GPU 上
      • 2.2 在实际训练时,一般需要把数据,网络,与损失函数转换到GPU上:
    • 3. 在更新了的版本中:

在进行深度学习开发时,GPU加速可以提升我们开发的效率。PyTorch要先指定数据位置,即是放在GPU上面还是CPU上面。

1. 安装GPU

使用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

2. Tensor放在GPU上

2.1 可以使用以下两种方式将 Tensor 放到 GPU 上

# 第一种方式是定义 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()

2.2 在实际训练时,一般需要把数据,网络,与损失函数转换到GPU上:

  • 构建网络时,把网络,与损失函数转换到GPU上
model = get_model()
loss_f = t.nn.CrossEntropyLoss()
if(use_gpu):
    model = model.cuda()
    loss_f = loss_f.cuda()
  • 训练网络时,把数据转换到GPU上
# GPU可用,把数据放入GPU
if (use_gpu):
    x,y = x.cuda(),y.cuda()
  • 取出数据时,需要从GPU准换到CPU上进行操作
if(use_gpu):
    loss = loss.cpu()
    acc = acc.cpu()

总结:

  • cpu_tensor.cuda()把数据放入GPU
  • gpu_tensor.cpu()把数据转到CPU

3. 在更新了的版本中:

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的代码要怎么改?

你可能感兴趣的:(PyTorch,python)