Created by: phlrain
PR types
Function optimization
PR changes
APIs
Describe
本pr一共有两个改动点(这两个修改点强耦合):
-
eval mode和 no_grad解绑
-
解决多个model之前train/eval干扰的问题
-
在动态图中,eval mode和no_grad(不记录反向)功能是绑定的,切换到eval mode会自动打开no_grad,这个跟之前动态图下不调用 loss.backward,显存无法释放的问题有关系,目前不调用loss.backward显存能够释放,目前把eval mode和 no_grad解绑
-
动态图如果定义了多个model,train/eval model会相互干扰 model_1 = AModel() model_2 = TModel()
model_1.train() model_2.eval()
在这种情况下,model_1其实也被设置成了 eval mode,根本原因是目前mode的设置存储在了一个全局的tracer当中,每次修改都会全局修改; 目前.train/eval切换影响的op只有batch norm和 dropout两种, Dygraph.BatchNorm 和 class形势的 dygraph.Dropout由于都是获取自己内部的training状态,不会受到全局状态的影响。
唯一会有影响的是 fluid.layers.dropout() 在这种写法下,op的is_test属性会获取全局的信息, 为解决避免layers.dropout 受到全局的影响,有两种解决方案
- 将fluid.layers.dropout 替换为 dygraph.Dropout,需要先在 __init__定义 self.dropout = dygraph.Dropout 然后forward中 x = self.dropout(x)
- 采用如下写法 fluid.layers.dropout(x, is_test=not self.training) ,将is_test与Layer的 training状态绑定