PyTorch Autograd内部实现
原文:
前面只要有一个node的requires_grad为True,则后面所有node都要为True:
forward阶段,ctx里存放其backward操作需要的值,也就是forward时的部分input或output值;
requires_grad为False的(Tensor b),不会计算其梯度;
requires_grad为True,且is_leaf为Tree的,会将梯度累积到其grad成员上;
优化:如果is_leaf=False,则说明不需要该Tensor的grad,所以,grad_fn直接将output梯度传递给下一个grad_fn了,绕开对该Tensor的grad的更新;(节省一步梯度加和操作的时间,也节省一个grad数据存储空间)
用_version号来防止backward时用到的activation在之前发生改动;如果_version号跟本次backward源头的_version号不同了,则报错;
我:Pipeline并行,如果直接做,就会有这种报错出现;
如果是Add操作这种,压根不需要某些activation的值,所以这种值发生改动,不影响backward传递参数,因此就不会报错
每个运算,是一个独立的operator,对应backward也是独立的:
Tensor.detach(),用在什么情况:想保留结果值,但又想把原始计算图垃圾回收释放掉;新Tensor和老Tensor共享数据内存(data),但不在hold指向计算图的reference了(grad_fn=None)
原文地址:https://blog.csdn.net/smartcat2010/article/details/140455716
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!