【编程BUG】Pytorch 使用DataParallel时报告数据和模型不在同一个设备上的错误

问题描述

类型1:RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu !
类型2:RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cuda:1!

解决方案

问题1

可能是模型中有的模块没有正确的写成模型的一部分,比如 self.attr1=xx, 而xx不是Parameter或者Module类。
解决:根据具体问题解决,可能用到的代码:

self.register_buffer() 
self.register_parameter()
self.register_module()
self.xx=nn.ModuleList()

问题2

常见原因:模型中的不同模块分离开了。比如:

out1=self.module1(input)
out2=self.module2(out1)

而module1和module2在不同的GPU上(比如应用CLIP时,image encoder和text encoder可能是分离的)。
这时可以新建一个nn.Module类,把组件写到一起, 如:

class CustomCLIP(nn.Module):
    def __init__(self, cfg, train_dataset, clip_model):
        super().__init__()
        self.text_encoder = TextEncoder(cfg,clip_model)
        self.video_encoder = VideoEncoder(cfg,clip_model)

    def forward(self, video, pairs):
        xx

新原因::还有一种情况是刚刚遇到的,我的代码是这样的:

class MyModule(nn.Module):

    def __init__(self, dset, cfg):
        super(MyModule, self).__init__()
        xxx
        self.train_forward = self.my_forward_1
    def my_forward_1(self, x):
        xxx
    def forward(self, x):
        if self.training:
        	pred = self.train_forward(x)
        else:
            pred=xxx
        return pred

此时模型只在0号GPU上,导致多GPU运行时报告数据和模型不在统一设备上的错误。改正方案是:

class MyModule(nn.Module):

    def __init__(self, dset, cfg):
        super(MyModule, self).__init__()
        xxx
       
    def my_forward_1(self, x):
        xxx
    def forward(self, x):
        if self.training:
        	pred = self.my_forward_1(x)
        else:
            pred=xxx
        return pred

这个原理尚不清楚。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用PyTorch实现经典模型AlexNet并在至少一个数据集上进行试验分析如下: AlexNet是由Hinton的学生Alex Krizhevsky等人在2012年提出的,是第一个成功应用深度学习模型于ImageNet大规模视觉识别挑战赛(ILSVRC)的模型。它深度、宽度较大,有8个卷积层和3个全连接层。下面描述了使用PyTorch框架实现AlexNet的步骤: 1. 首先,导入所需的PyTorch库,并加载数据集。可以使用CIFAR-10数据集进行试验,该数据集包含10个不同类别的60000个32x32彩色图像。 2. 接下来,构建AlexNet模型的网络结构。使用PyTorch中的nn.Module来定义模型类。程序可以定义一个继承自nn.Module的类,并在其中定义模型的网络结构,如卷积层、池化层和全连接层等。在AlexNet的网络结构中,可以使用nn.Conv2d代表卷积层,nn.ReLU代表激活函数,nn.MaxPool2d代表池化层,nn.Linear代表全连接层。 3. 实现前向传播函数。在模型类中实现forward函数,定义了从输入到输出的数据流动过程。在AlexNet中,全连接层之前通常会使用nn.Dropout来防止过拟合。 4. 执行反向传播和优化。定义损失函数,可以使用nn.CrossEntropyLoss来计算分类损失。然后定义优化器,如Adam或SGD等,并使用反向传播法更新模型参数。 5. 开始训练和验证模型。此,可以将数据集分为训练集和验证集。在每个训练循环中,分批次加载训练集数据,并对模型进行训练。在验证循环中,分批次加载验证集,并计算模型在验证集上的准确率等指标。 6. 可以进行模型的微调和超参数调整,以提高模型性能。 进行试验分析,可以计算模型在验证集或测试集上的准确率、精确率、召回率以及F1值等指标,评估模型的性能。还可以通过绘制损失曲线和准确率曲线等图表,进行可视化分析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值