这一篇博客主要是帮助分析显存为什么炸裂的,不单独提具体的技术。技术可以参见另一篇博客
深度学习训练降低显存指南_Zjhao666的博客-CSDN博客
首先,从总体来看,显存的增长情况大致可以分为两类:
- 线性型:以epoch或更短的batch为单位,显存整体上呈线性缓慢增长。
- 波动型:没有固定的周期,短期内显存急剧增加,然后裂开了。
其次,从显存的分配来看,分配对象一般分为两类:
- 模型变量:主要是模型的固定参数(显存固定),以及一些如结构形的增量参数(显存渐增)
- 数据变量:包括模型的输入输出,以及模型中间的计算结果。
再次,根据以往的经验,两种显存增长情况和两种显存分配对象的关系是:
- 线性型增长,一般是由于模型中的增量参数导致的,因为变量的覆盖机制,会使得数据变量再重新分配新内容时,自动丢弃掉之前的垃圾内容。
- 波动型增长,一般是由于模型计算时的数据变量导致的,可能是输入输出,也可能是中间计算结果,也同样因为变量的覆盖机制,既然会覆盖,所以只是波动,总体来看围绕均值变化应该不大。
最后,基于经验,对显存炸裂的下药治病方式应该是这样:
- 直接买A100显卡,80GB随便爽(不是)
- 总体上,先解决波动型增长,再解决线性型增长。原因:(1)波动型增长不解决,显存必然炸裂;(2)波动型增长波动太大,显存变化的大尺度,会淹没掉线性增长的问题(难以发现)
- 对于波动型增长,及时清理无用的数据变量(del+显存清理)
- 对于线性型增长
- 如果模型中增量参数删掉后不影响效果,就删掉;
- 否则,以牺牲精度、效果为代价,降低固定参数的大小
|