RuntimeError: Expected to have finished reduction
发布时间:2024年01月10日
这个问题是因为模型中定义了一堆函数,但是在loss.backward()后,模型中的某些函数跟loss计算无关。
1、可能出现的原因:
- 首先检查model 的forward前向过程,可能其中有些函数的计算结果没有参与到loss的计算部分。
- 如果是比较大的框架中,在其他py文件中可能定义了继承nn.module的类,此类中定义的函数也须参与进loss的计算,否则要注释掉。
2、有时候一眼找不到报错的信息问题出在哪儿,可以用以下简单方法:
from here
主要有两个:
- 在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.backward()后,loss.step()之前,很方便打印出来哪些网络层出问题。
文章来源:https://blog.csdn.net/qq_41872271/article/details/135494745
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:chenni525@qq.com进行投诉反馈,一经查实,立即删除!