Guo Qipeng
Guo Qipeng
没有重复计算,链式法则只会用到上一步的梯度结果,而不是之前所有步的梯度。上一步的还保留,但历史的梯度被动态清空了。
这里的概念有一些复杂,上一步的梯度还在显存中,但它其实不在G3这里存储。我们画的G3指的是.grad属性。但实际上pytorch除了.grad还在计算图中存储了梯度。这里牵扯到了pytorch的[autograd graph](https://pytorch.org/docs/stable/autograd.html#autograd-graph) 以及梯度的在graph上的[传递过程](https://pytorch.org/docs/stable/notes/autograd.html#backward-hooks-execution)
1. loss.backward()不需要改动,因为我们通过register_hook的方法改变了backward函数的行为。 2. lora这个实验是lora(用Adam)加上其他参数使用LOMO,所以其实是两部分。LOMO这个方法理论上不限定于SGD,但是对Adam这种需要存储中间变量的方法,需要再做调整,并且也不是论文中所有的优化都能使用。在backward过程直接更新来规避存储gradient还是可行的,但存储中间变量的开销更大,节省一部分的收益有限。如果需要在Adam上进一步应用LOMO的话,一个选择是采用deepspeed里面的optimizer offload机制,把优化器的中间变量交给CPU处理,因为CPUAdam的效率还是可以的。在GPU上再采用LOMO的方法。 3. 峰值也会减小,我们后续会补充相关的实验数据。