博客主页瑕疵的CSDN主页 Gitee主页瑕疵的gitee主页⏩ 文章专栏《热点资讯》被PyTorch Lightning的梯度累积坑到怀疑人生一招搞定目录凌晨三点我还在改代码。PyTorch Lightning报了个错让我想摔键盘RuntimeError: Trying to backward through the graph a second time。()我试了删数据、换GPU、重装库结果还是报错。最后翻了三天文档发现是自己写法坑了自己。核心根源Lightning默认在训练循环里自动调用backward()。你如果在training_step里手动加loss.backward()它会反向传播两次——第一次是Lightning自己干的第二次是你手动触发的。系统直接炸了。我踩的坑调试时想打印梯度随手加了loss.backward()。结果报错还让我以为是库崩了。错误示范importtorchimporttorch.nn.functionalasFimportpytorch_lightningasplclassBadModel(pl.LightningModule):def__init__(self):super().__init__()self.lineartorch.nn.Linear(10,2)# 简单模型deftraining_step(self,batch,batch_idx):x,ybatch# 输入和标签y_hatself.linear(x)# 前向lossF.cross_entropy(y_hat,y)# 损失# 错误手动调用backwardloss.backward()# 两次反向传播系统直接报错returnloss正确姿势classGoodModel(pl.LightningModule):def__init__(self):super().__init__()self.lineartorch.nn.Linear(10,2)deftraining_step(self,batch,batch_idx):x,ybatchy_hatself.linear(x)lossF.cross_entropy(y_hat,y)# 正确只返回loss不调用backwardreturnloss# Lightning自动处理梯度关键点Lightning的training_step必须只返回loss。手动backward()是多余的还会触发重复计算。我测试过去掉那行代码秒跑通。避坑总结别碰backward()Lightning内部自动处理梯度手动调用找死。调试别乱加想看梯度用self.log(grad, grad)在training_step里别改核心逻辑。简单测试新写模型时先跑个空循环别加调试代码。我上次就是先跑通基础流程再加自定义操作。这坑真坑人。我被它坑了一整天最后发现是自己手贱。记住Lightning是帮你省事的不是让你手动搞梯度的。现在跑训练稳得一批。
PyTorch Lightning 报错怎么办?教你一招避坑
博客主页瑕疵的CSDN主页 Gitee主页瑕疵的gitee主页⏩ 文章专栏《热点资讯》被PyTorch Lightning的梯度累积坑到怀疑人生一招搞定目录凌晨三点我还在改代码。PyTorch Lightning报了个错让我想摔键盘RuntimeError: Trying to backward through the graph a second time。()我试了删数据、换GPU、重装库结果还是报错。最后翻了三天文档发现是自己写法坑了自己。核心根源Lightning默认在训练循环里自动调用backward()。你如果在training_step里手动加loss.backward()它会反向传播两次——第一次是Lightning自己干的第二次是你手动触发的。系统直接炸了。我踩的坑调试时想打印梯度随手加了loss.backward()。结果报错还让我以为是库崩了。错误示范importtorchimporttorch.nn.functionalasFimportpytorch_lightningasplclassBadModel(pl.LightningModule):def__init__(self):super().__init__()self.lineartorch.nn.Linear(10,2)# 简单模型deftraining_step(self,batch,batch_idx):x,ybatch# 输入和标签y_hatself.linear(x)# 前向lossF.cross_entropy(y_hat,y)# 损失# 错误手动调用backwardloss.backward()# 两次反向传播系统直接报错returnloss正确姿势classGoodModel(pl.LightningModule):def__init__(self):super().__init__()self.lineartorch.nn.Linear(10,2)deftraining_step(self,batch,batch_idx):x,ybatchy_hatself.linear(x)lossF.cross_entropy(y_hat,y)# 正确只返回loss不调用backwardreturnloss# Lightning自动处理梯度关键点Lightning的training_step必须只返回loss。手动backward()是多余的还会触发重复计算。我测试过去掉那行代码秒跑通。避坑总结别碰backward()Lightning内部自动处理梯度手动调用找死。调试别乱加想看梯度用self.log(grad, grad)在training_step里别改核心逻辑。简单测试新写模型时先跑个空循环别加调试代码。我上次就是先跑通基础流程再加自定义操作。这坑真坑人。我被它坑了一整天最后发现是自己手贱。记住Lightning是帮你省事的不是让你手动搞梯度的。现在跑训练稳得一批。