logo

这一次,我要拿回属于我的GPU!(pytorch版)

引言

大家有没有试过在找到别人复现的人工智能论文代码后,迫不及待地在自己数据集上跑一下试试效果,但是为什么找到的总是cpu版本的代码,偏偏这份代码还很合自己的缝合意向(🤯🤯🤯)。所以,为了拿回属于自己的GPU资源,一起挑战一下cpu代码巨怪吧!!

修改步骤:

step1:
想把数据移动到gpu上,先要了解可以修改什么,下面一起了解一下吧:
  • 张量(Tensor):任何在cpu上的pytorch张量都可以使用.cuda()转换到GPU上
  • 模型(Model):写好的pytorch模型也可以使用.cuda()转到GPU上,这将转化模型中的参数和缓冲区。是不是很方便,一下子就把模型中的计算速度提高了呢。
  • 优化器(Optimizer):把模型转化到GPU上通常需要把优化器转移到GPU上,以确保在训练过程中梯度的计算和更新在GPU上进行
  • 序列或元组中的张量:如果一个序列(如列表或元组)包含多个张量,你可以将整个序列转换到 GPU 上。例如,[tensor1, tensor2].cuda()
  • 字典中的张量:如果字典的值是张量,你可以将整个字典转换到 GPU 上。例如,{'key1': tensor1, 'key2': tensor2}.cuda()
  • 嵌套结构:张量可以嵌套在列表、元组或字典中,.cuda() 可以递归地将所有嵌套的张量转换到 GPU 上。
step2:
将网络移动到GPU的基本步骤:
1)把输入的图像及标签数据移动到GPU上,可以在获取DataLoader对象后取出图像及标签的Tensor进行数据转移
  
  
  
  
  
  
for data in train_dataloader:
imgs, labels = data
if torch.cuda.is_available():
# 将训练图像转换成GPU版本
imgs = imgs.cuda()
# 将训练标签转换成GPU版本
labels = labels.cuda()
有的模型会把所有输入图像及标签堆叠起来形成大的Tensor,这时你只需要把大的Tensor进行数据转移就可以了。
2)把模型转移到GPU上
通常会有这么一段定义你的网络
  
  
  
  
  
  
class CNN(nn.Module):#此时CNN就是你的网络名
def __init__(self):
super().__init__()
self.enc_x = nn.Sequential(
conv2d(2, 64, 16, 1, 1, bias=False), # 64 x 256 x 256
nn.BatchNorm2d(64, momentum=0.9, eps=1e-5),
nn.ELU(),
nn.AvgPool2d(2, 2, 0), # 64 x 128 x 128
conv2d(64, 128, 16, 1, 1, bias=False),# 64 x 128 x 128
nn.BatchNorm2d(128, momentum=0.9, eps=1e-5),
nn.ELU(),
conv2d(128, 128, 16, 1, 1, bias=False),
nn.BatchNorm2d(128, momentum=0.9, eps=1e-5),
nn.ELU(),
nn.AvgPool2d(2, 2, 0), # 128 x 64 x 64
conv2d(128, 2, 16, 1, 1), # 2 x 7 x 7
nn.Tanh()
)
然后你需要把网络转移
  
  
  
  
  
  
self.vCNN = CNN()
#网络结构转化成gpu运行
if torch.cuda.is_available():
self.vCNN = self.vCNN.cuda()
到此,你的数据基本上就转移到GPU上啦
step3:
使用 .cuda() 时,你应该指定目标 GPU 的索引,例如 .cuda(0).cuda(1),这取决于你想要使用哪一块 GPU。如果你有多个 GPU 并且想要同时使用它们,可以使用 torch.nn.DataParalleltorch.nn.parallel.DistributedDataParallel 来并行化你的模型。
遇到的问题:
  
  
  
  
  
  
Type Error: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.
这段表示的是无法将一个Tensor转化为numpy,你需要在调用 .numpy()`方法之前,使用 .cpu()方法将张量从 GPU 移动到 cpu
For example: .cpu().numpy()
  
  
  
  
  
  
RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!
这段表示的是你进行计算的tensorts不在同一设备,它们分别在GPU和cpu上,你需要把它们放到同一设备上,我的做法是把数据都放在GPU上。
附:图像增强及指标运算是在cpu上计算的,我之前是只把模型及数据移动到gpu上便完成,但是cpu占用率还是很高,对此有大佬的解释是网络太小或GPU性能太强劲,这样就会感觉cpu是闲置的
注意:这份笔记只适合英伟达显卡,AMD玩家不要模仿!!!
最后,Good luck for you!
————————————————
版权声明:本文为稀土掘金博主「指尖_流年」的原创文章
原文链接:https://juejin.cn/post/7391704618181459968
如有侵权,请联系千帆社区进行删除
评论
用户头像