pytorch 踩坑笔记

本文记录了使用PyTorch进行深度学习时遇到的常见问题,包括数据在CPU和GPU间转换错误、多GPU训练模型的保存与加载、DataLoader多线程Debug模式错误、数据加载内存管理以及OSError内存不足问题,并提供了详细的解决方案。
摘要由CSDN通过智能技术生成

本来应该很早就写一个的,现在也不晚,慢慢记录吧

1、数据同时存在于CPU和GPU上

报错:RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!

代码片段

class Linear(nn.Module):
    def __init__(self,in_features=1024,out_features=100):
        super().__init__()
        self.weights = nn.Parameter(torch.Tensor(in_features,out_features))
        self.bias = torch.Tensor(out_features)
        self.bias_ = torch.Tensor(out_features)
        self.register_buffer('bias_0', bias_)
        
    def forward(self,x:torch.Tensor):
        return torch.matmul(x, self.weights,)+self.bias_
        
if __name__ == "__main__":
    img = torch.randn([2,1024]).cuda()
    net = Linear().cuda()
    preds = net(img)

原因分析:Linear.cuda()的过程中,self.bias_self.bias并没有传递到GPU中,他们虽然在计算图里,但是.cuda()只转移self._parametersself._buffers中的参数,而self.bais只是普通的Tensor对象,所以在这个网络中被转移的参数是self.weightsself.bias_0nn.Module的初始化如下:

    def __init__(self):
        """
        Initializes internal Module state, shared by both nn.Module and ScriptModule.
        """
        torch._C._log_api_usage_once("python.nn_module")

        self.training = True
        self._parameters = OrderedDict()
        self._buffers = OrderedDict()
        self._non_persistent_buffers_set = set()
        self._backward_hooks = OrderedDict()
        self._is_full_backward_hook = None
        self._forward_hooks = OrderedDict()
        self._forward_pre_hooks = OrderedDict()
        self._state_dict_hooks = OrderedDict()
        self._load_state_dict_pre_hooks = OrderedDict()
        self._modules = OrderedDict()

NOTE:torch.cuda()Module.cuda()是不一样的,在nn.Module中,self.register_buffer()是将数据赋值到nn.Module._buffers这个变量中,它是一个OrderDict类,nn.Module._buffers中的变量也可以通过self.XXX直接调用,所以注册的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值