PaddlePaddle / Paddle

PArallel Distributed Deep LEarning: Machine Learning Framework from Industrial Practice (『飞桨』核心框架,深度学习&机器学习高性能单机、分布式训练和跨平台部署)
http://www.paddlepaddle.org/
Apache License 2.0
22.23k stars 5.58k forks source link

请教一个recompute单测的问题 #69107

Open houj04 opened 4 hours ago

houj04 commented 4 hours ago

bug描述 Describe the Bug

我在运行这个单测的时候:test/collective/fleet/test_dygraph_recompute_for_eager.py,注意到里面的组网代码有dropout算子,考虑到dropout的实现依赖于硬件,例如在CPU上和GPU上的行为肯定不一样,所以想着把它先注释掉。

于是将下面的代码删除了:

(block_name + "_dropout", paddle.nn.Dropout(p=0.5)),

随后发现这个单测跑不过了。为了确定不是我本地环境的问题,我把这个修改提了个PR,想看看流水线上是什么情况。结果发现流水线也挂了。

PR在这里:https://github.com/PaddlePaddle/Paddle/pull/69006

对应的流水线作业:PR-CI-Coverage、PR-CI-Hygon-DCU-Test。

注意到报错信息里面有nan,并且报错的case的名字叫做

FAIL: test_fc_net_with_fp16 (test_dygraph_recompute_for_eager.TestRecompute)

于是我想是不是因为有什么东西在FP32下够用,FP16下面不够用。于是我进一步尝试修改了这个地方:

原有版本是:

scaler = paddle.amp.GradScaler()

我给它改成了

scaler = paddle.amp.GradScaler(init_loss_scaling=512)

理由是,这个初值,默认值是65536,但是FP16的范围本来只有-65504到66504,所以肯定会爆掉的。改小了就不挂了,倒是也符合预期。

我想问的问题是:

1、要说是爆掉的原因话,原版的单测也应该有爆掉的情况,为啥没有出现?而偏偏是删掉了那个dropout之后才踩上?

2、这里修改初始化,加个参数为512(其实我试了,再大一点也行,但是原有的默认值65536实在是太大了),是合理的吗?我能提个PR给它修掉不?

其他补充信息 Additional Supplementary Information

No response

LiYuRio commented 4 hours ago

不建议修改GradScale的默认参数,这样会改变这个API的行为,属于不兼容升级。可以直接修改单测中GradScale传入的参数。 理论上,这个单测应该一致挂,可能删掉Dropout触发了CI运行这个单测,才暴露了这个问题。