RuntimeError: Expected to have finished reduction

2024-01-10 10:30:29

这个问题是因为模型中定义了一堆函数,但是在loss.backward()后,模型中的某些函数跟loss计算无关。
1、可能出现的原因:

  1. 首先检查model 的forward前向过程,可能其中有些函数的计算结果没有参与到loss的计算部分。
  2. 如果是比较大的框架中,在其他py文件中可能定义了继承nn.module的类,此类中定义的函数也须参与进loss的计算,否则要注释掉。

2、有时候一眼找不到报错的信息问题出在哪儿,可以用以下简单方法:
from here
主要有两个:

  1. 在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计算的函数的。网上也有人说这种方法会带来额外的计算开销,而且会导致精度下降,具体没测试,不知道。
  2. 推荐用这种,即
    在这里插入图片描述
    把上面的代码加入到loss.backward()后,loss.step()之前,很方便打印出来哪些网络层出问题。

文章来源:https://blog.csdn.net/qq_41872271/article/details/135494745
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。