分析内存申请和内存使用情况

内存申请

从模型结构维度,以下四个阶段都会申请设备侧内存:
  • 模型初始化。模型权重等长生命周期内存,保存到训练结束。
  • 前向计算。参与反向计算的激活值等中长生命周期内存,保存到同step的反向结束。
  • 反向计算。首次反向计算产生的模型梯度等长生命周期内存,保存到训练结束。
  • 优化器梯度更新。优化器状态等长生命周期内存,保存到训练结束。
  • 模型初始化、前/反向计算和优化器梯度更新可能存在格式转换/精度转换/非连续转连续等,会申请临时内存。

内存使用

从内存使用维度,以下几个方面都会影响内存使用峰值:
  • 内存池缓存算法。不同的缓存算法,碎片控制水平存在差异。
  • 内存池个数。空闲内存不能跨内存池复用,内存池个数越多,空闲内存利用率就越低。
  • 算子实现。不同的实现算法/策略(例:小块数据多次计算vs大块数据几次计算),内存开销也不同。
  • PyTorch API/OP适配。不同的适配方式(例:大kernel vs 小算子拼接),内存开销也不同。
  • 非连续转连续。某些算子不支持非连续输入,需要插入格式转换算子,产生额外临时内存开销。
  • 私有格式。某些场景,私有格式比ND格式多占用内存,存在私有格式流转的网络内存峰值会高于ND格式整网流转。