解决pytorch报错——RuntimeError: Expected to have finished reduction in the prior iteration...

这篇具有很好参考价值的文章主要介绍了解决pytorch报错——RuntimeError: Expected to have finished reduction in the prior iteration...。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、报错信息

之前写代码时碰到了这样一个错误:
RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. This error indicates that your module has parameters that were not used in producing loss. You can enable unused parameter detection by (1) passing the keyword argument find_unused_parameters=True to torch.nn.parallel.DistributedDataParallel; (2) making sure all forward function outputs participate in calculating loss. If you already have done the above two steps, then the distributed data parallel module wasn’t able to locate the output tensors in the return value of your module’s forward function. Please include the loss function and the structure of the return value of forward of your module when reporting this issue (e.g. list, dict, iterable).
翻译成中文即:
运行时错误:期望在开始新迭代之前已完成前一次迭代的reduction(但没做到这一点)。此错误表明您的模块具有未参与产生loss的参数。您可以通过 (1) 将关键字参数 find_unused_parameters=True 传递给 torch.nn.parallel.DistributedDataParallel 来启用未使用的参数检测; (2) 确保所有 forward 函数的所有输出都参与计算损失。如果您已经完成了上述两个步骤,那么分布式数据并行模块无法在模块的 forward 函数的返回值中定位输出张量。报告此问题时,请包括损失函数和模块 forward 返回值的结构(例如 list、dict、iterable)

二、出现原因

出现这样的报错基本是由于模型中某个(些)定义的模块没有参与梯度的反向传播导致的,即“your module has parameters that were not used in producing loss”。

三、解决方案

下面给出全网能找到的几种解决方案,包括我最后自己解决的方法,供大家参考。
在DistributedDataParallel中加入find_unused_parameters=True,如model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.local_rank], output_device=args.local_rank, find_unused_parameters=True)
肉眼逆向检查loss的计算过程,看模型的哪部分没有参与当前loss的梯度反向传播,然后debug。
借助param.grad的值来帮助我们分析,找到代码中哪一部分的参数没有接收到回传梯度,然后debug。

for name, param in model.named_parameters():
    if param.grad is None:
        print(name)
  1. 确保forward函数的所有输出都被用于计算loss了,如果forward的返回值中包含没有参与计算loss的变量,就不要输出它(这其实有歧义,也并不一定是万无一失的办法,最后我个人感觉本质原因还是因为模型中有部分参数未参与梯度反传,请继续看)。这一解决方法摘自Github pytorch issue: RuntimeError when using multiple DistributedDataParallel model · Issue #22436 · pytorch/pytorch (github.com)
    解决pytorch报错——RuntimeError: Expected to have finished reduction in the prior iteration...

  2. 确保所有的forward的函数的所有输出都被用于计算损失函数了。这一解决方法摘自CSDN,该作者遇到的问题是:在多任务学习中,损失函数是通过一个整个继承自nn.Module的模块来计算的,但是在forward返回的loss中少加了一个任务的loss,导致这个报错。
    解决pytorch报错——RuntimeError: Expected to have finished reduction in the prior iteration...

  3. 本人的解决方法。
    正如我上文所说,我个人感觉本质原因是因为模型中有部分参数未参与梯度反传。
    一般情况下,找到这部分参数对应的模块,然后使其参与loss计算即可解决了,但是本人的情况是:在一个for loop中有两次loss.backward(),第一次backward的loss1是由模型的某个中间层的feature map计算出的(即,最后一层的输出未参与loss计算),第二个backward的loss2是由模型的最终输出计算出的。在这样一个情境下,当执行第二个backward时,便会报错。分析一下不难发现,确实是由于我在计算第一个loss时,模型有一部分模块的参数并未参与梯度反传(即从上述中间层往后一直到最终层(包括最终层)的这些层)。按照上述解决方法,我必须使得这些层参与loss1的计算,也就是说我必须让最终层的输出参与loss1的计算。但是,我的实际需求确实是不需要最终输出参与loss1的计算的。因此,我想到这样一个办法:既然你非要让我所有参数都参与loss的梯度反传,那我直接让从中间层往后一直到最终层(包括最终层)的这些层的梯度为0不就行了?这样一来,这些层的参数梯度为0,更新时相当于没更新这部分参数,这不影响什么。
    基于这样的思想,我设置了一个辅助性loss:util_adv_loss = torch.nn.functional.softplus(-real_logit_b).mean() * 0 + torch.nn.functional.softplus(-rec_logit_b).mean() * 0,这样一来,该loss对于整个模型的任何参数的偏导都是0(根据链式法则),那么在梯度反传时,所有模块的参数都得到0梯度,即不影响任何模块的更新,但又同时满足了报错中所提到的条件,即需要“All the parameters in your module should be used in producing loss”。文章来源地址https://www.toymoban.com/news/detail-416050.html

到了这里,关于解决pytorch报错——RuntimeError: Expected to have finished reduction in the prior iteration...的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 报错解决:RuntimeError: expected scalar type Long but found Float

    nn.Linear需要作用于浮点数,这里可能输入了整数类型的张量作为参数。 报错: 把a转为float,结果为:

    2024年02月09日
    浏览(44)
  • pytorch异常——RuntimeError:Given groups=1, weight of size..., expected of...

    nn.Conv2d 需要的输入张量格式为 (batch_size, channels, height, width),但您的示例输入张量 x 是 (batch_size, height, width, channels)。因此,需要对输入张量进行转置。 注意, TensorFlow使用\\\"NHWC\\\"(批次、高度、宽度、通道)格式,而PyTorch使用\\\"NCHW\\\"(批次、通道、高度、宽度)格式 在pytorch中

    2024年02月10日
    浏览(57)
  • 报错:RuntimeError: expected scalar type Double but found Float

    这个问题是深度学习,用pytorch跑的时候出现的 解决办法:这个是格式问题,希望的格式是double,但得到的是float。字面意思是这个,但是并不是非要把格式改成double,这个时候应该在出错的前面几处代码设个断点debug一下,我得到的结果是image、img_rgb都是tensor.unit8格式的,但

    2024年02月13日
    浏览(46)
  • 解决报错ValueError: not enough values to unpack (expected 3, got 2)

    错误提示: 在使用opencv进行关键点识别、边缘轮廓提取的时候,提示以上错误,报错原因是函数定义的返回值数量和调用函数时实际赋予的返回值数量不一致。导致这个问题,实际是因为opencv版本不一致引起的,新版opencv(opencv4)在调用findContours时只需要两个参数,需要删

    2024年02月11日
    浏览(49)
  • 解决PyTorch DDP: Finding the cause of “Expected to mark a variable ready only once“

    早上做消融实验的时候需要复现俩月前的实验结果,但是莫名其妙同样的代码和环境却跑不通了,会在loss.backward()的时候报如下错误: RuntimeError: Expected to mark a variable ready only once. This error is caused by one of the following reasons: 1) Use of a module parameter outside the ``forward`` function. Please

    2024年02月07日
    浏览(54)
  • 机器学习报错解决2——ValueError: too many values to unpack (expected 3)

    参考资料:蔚蓝呆鸟 在我学习Pytorch的PIL模块的过程中,运行了如下代码: 大致意思是将一张RGB图片分成R、G、B三个通道,并分别将每个通道的图片保存下来。 但是出现了如下的报错: ValueError: too many values to unpack (expected 3) 翻译一下就是用来接收的变量数与函数需要接收的

    2024年02月02日
    浏览(51)
  • 【Pytorch报错】RuntimeError:cuDNN error:CUDNN_STATUS_INTERNAL_ERROR 高效理解记录及解决!

    明明跑了一段时间?跑过一次完整的?怎么就出现这个报错呢?代码也未改动?而这就是现实! 观察显卡使用情况,多人共用同一服务器,项目各自运行,会抢占显存,进而报错! 多个项目运行,占用增加,导致内存用完报错,还是很真实的! 文件是否设置了CUDA_VISIBLE_DE

    2024年02月15日
    浏览(48)
  • Stable Diffusion WebUI报错RuntimeError: Torch is not able to use GPU解决办法

    新手在安装玩Stable Diffusion WebUI之后会遇到各种问题, 接下来会慢慢和你讲解如何解决这些问题。 在我们打开Stable Diffusion WebUI时会报错如下: RuntimeError: Torch is not able to use GPU;add --skip-torch-cuda-test to COMMANDLINE_ARGS variable to disable this check 提示:Python 运行时抛出了一个异常。请

    2024年02月08日
    浏览(62)
  • Given groups=1, weight of size [256, 256, 3, 3], expected input[4, 512, 64, 64] to have 256 channels

    【问题解决】 这个应该是很常见的问题了。直接翻译过来就是:在给定组=1,大小权重[256,256,3,3],预期输入[4,512,64,64]具有256个通道,但得到了512个通道。直白点说就是第2位置的参数没设置对应上,要么第二个都是256,要么第二个都是512。 Given groups=1, weight of size [

    2024年02月12日
    浏览(94)
  • Expected one result (or null) to be returned by selectOne(), but found: 3报错解决方案

    Expected one result (or null) to be returned by selectOne(), but found: 3 Expected one result (or null) to be returned by selectOne(), but found: 3 意思是“期望selectOne()返回一个结果(或null),但发现3个”这说明你的返回结果有三个对象,但是selectOne只能返回一个。 第一种方案:可以把selectOne更换为selectList,

    2023年04月13日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包