这一次,我要拿回属于我的GPU!(pytorch版)
大模型开发/技术交流
- LLM
9月11日280看过
引言
大家有没有试过在找到别人复现的人工智能论文代码后,迫不及待地在自己数据集上跑一下试试效果,但是为什么找到的总是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 = dataif 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 256nn.BatchNorm2d(64, momentum=0.9, eps=1e-5),nn.ELU(),nn.AvgPool2d(2, 2, 0), # 64 x 128 x 128conv2d(64, 128, 16, 1, 1, bias=False),# 64 x 128 x 128nn.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 64conv2d(128, 2, 16, 1, 1), # 2 x 7 x 7nn.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.DataParallel
或 torch.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
如有侵权,请联系千帆社区进行删除
评论