MegEngine icon indicating copy to clipboard operation
MegEngine copied to clipboard

MegEngine复现stylegan2-ada,梯度不能对齐

Open miemie2013 opened this issue 3 years ago • 5 comments

环境

1.系统环境:win10+cuda10.2 2.MegEngine版本:1.9.0 3.python版本:3.8

代码地址: https://gitee.com/miemie2013/ppgan2

进入test_grad文件夹。首先运行test2_53_SynthesisNetwork_grad.py,跑pytorch的8次训练,保存输入、输出、梯度等为文件53.npz; 接着,跑test2_53_SynthesisNetwork_grad_2mge.py,将pytoch的权重移植为MegEngine的权重,保存为文件53.pkl。最后,跑test2_53_SynthesisNetwork_grad_mge.py,读取53.npz中保存的输入作为输入,跑MegEngine的8次训练。即此时MegEngine版与pytorch版有相同的输入和权重,我们期望MegEngine与pytorch有相同的输出、相同的梯度。但是跑第1次训练时发现,model.b32.torgb.weight.grad和model.b32.conv1.weight.grad与pytorch差异巨大。因为要实现梯度惩罚损失,所以一阶梯度dy_dws参与损失的计算。

SynthesisNetwork中的SynthesisLayer和ToRGBLayer的梯度应该是没问题的。可以做以下实验验证: 先跑test2_51_ToRGBLayer_grad.py,再跑test2_51_ToRGBLayer_grad_2mge.py,最后跑test2_51_ToRGBLayer_grad_mge.py,差异ddd会很小,说明ToRGBLayer的梯度没有问题(有多种配置供测试,我本人试过所有配置,差异ddd都不大); 先跑test2_52_SynthesisLayer_grad.py,再跑test2_52_SynthesisLayer_grad_2mge.py,最后跑test2_52_SynthesisLayer_grad_mge.py,差异ddd会很小,说明SynthesisLayer的梯度没有问题(有多种配置供测试,我本人试过所有配置,差异ddd都不大)。

miemie2013 avatar Apr 29 '22 04:04 miemie2013

不对,是ToRGBLayer的梯度有问题,

test2_51_ToRGBLayer_grad.py和test2_51_ToRGBLayer_grad_mge.py中的损失都改成 loss = dy_dx.sum() + dy_dws.sum() + y.sum() (原来是loss = dy_dws.sum() + y.sum())

先跑test2_51_ToRGBLayer_grad.py,再跑test2_51_ToRGBLayer_grad_2mge.py,最后跑test2_51_ToRGBLayer_grad_mge.py,差异ddd会变大,请帮我看看ToRGBLayer中出现的问题!

miemie2013 avatar Apr 29 '22 04:04 miemie2013

我刚才试了一下,test2_51_ToRGBLayer_grad_paddle.py中的损失也改成 loss = dy_dx.sum() + dy_dws.sum() + y.sum() 跑test2_51_ToRGBLayer_grad_paddle.py(需要注释掉ppgan/models/generators/generator_styleganv2ada.py开头的from custom_gather import gather_op),Paddle也是不能和pytorch对齐的。

但是最新版本Paddle的SynthesisNetwork(跑test2_53_SynthesisNetwork_grad_paddle.py)是可以和pytorch对齐的。所以说可以不管ToRGBLayer中dy_dx参与损失计算后不能和pytorch对齐的问题,重点帮我解决SynthesisNetwork梯度不能和pytorch对齐的问题,谢谢!

miemie2013 avatar Apr 29 '22 04:04 miemie2013

可以提供一个最小复现吗?或者提供一下从哪个 op 开始,梯度的值就和 torch 对不上了。

a419775258 avatar Apr 29 '22 07:04 a419775258

可以提供一个最小复现吗?或者提供一下从哪个 op 开始,梯度的值就和 torch 对不上了。

SynthesisNetwork里有SynthesisLayer和ToRGBLayer,现在这两个没问题(ToRGBLayer中 dy_dx不参与计算的话),所以才求助你们呀。如果改了SynthesisNetwork的代码,SynthesisNetwork就不是原来的SynthesisNetwork了,那还怎么修复原来的SynthesisNetwork的bug

miemie2013 avatar Apr 29 '22 08:04 miemie2013

我理解,梯度应该是从网络中的某一个算子开始,和 torch 计算的结果开始出现比较大的差距,这个计算结果的差距和网络应该是无关的。现在需要您提供一下具体是哪个算子,我们才好修复。 如果您发现 SynthesisLayer 和 ToRGBLayer 单独都没有问题,但是两者一组合就和 torch 不同,也请您提供一个最小复现。不是在 SynthesisNetwork 这个网络中,而是两者简单的组合。

a419775258 avatar Apr 29 '22 13:04 a419775258