载风月|深度学习中的内存管理问题研究综述( 五 )
内存开销的N层线性深度神经网络的目的 。
Gruslys等人将重计算的思想与基于时间的反向传播(backpropagation through time)算法结合 , 提出了一种在训练RNN时减少内存消耗的方法 。 该方法通过动态编程来平衡中间结果的缓存和重计算 , 能够在用户指定的任何内存约束下完成神经网络的训练 。 但是Chen等人和Gruslys等人提出的方案都基于对线性计算图的一个强力假设:计算图中所有中间变量的内存开销都是相同的 , 因此他们的工作都局限于一些特定的神经网络中 。 通常 , 有以速度为中心和以内存为中心的重计算策略 。 以速度为中心的策略保留了重新计算的张量 , 以便反向计算时其他层也可以直接重用它们 。 以内存为中心的策略总是重新计算每个反向计算层依赖的张量 , 与以速度为中心的策略不同 , 它会释放重新计算的中间结果 , 充分利用了节省内存的机会 。 Wang等人提出的CostAware重计算方法充分利用了这两种策略的优势 , 确保最高的内存占用情况与以内存为中心的策略保持一致 , 而额外的计算开销则与以速度为中心的策略相当 。
Kusumoto等人提出了一种新的有效的重计算方法 , 该方法可以应用于更广泛的神经网络模型 。 作者使用图论的语言将在固定的内存大小约束下最小化计算开销的一般重计算问题形式化 , 并提供了一种动态规划的解决方案 。
基于对张量访问模式的分析 , Capuchin能够根据当前内存的占用情况动态地选取重计算的张量 , 并决定张量的重计算时间 , 有效地降低了重计算带来的性能开销 。 Chen等人提出的Checkpointing方案假设计算图中所有节点的内存开销是相同的 , 并且梯度是无法被重构的 。 Jain等人注意到这些假设限制了先前方法的效率和通用性 , 因此 , 他们提出了Checkmate方案 , 将DNN训练时间与训练时内存需求之间的权衡问题抽象为张量重构的优化问题 , 并将其形式化为混合整数线性规划问题 , 根据求得的结果选择可用于重构的张量 , 进而制定高效的重计算策略 。 Checkmate是对Checkpointing策略的一般化 , 适用于任意类型的深度神经网络 。
任何重计算方法的有效性都取决于其定义的规则:缓存哪些变量以及如何重计算其他变量 。 目前的研究者围绕这一问题不断提出新的方法 , 以期望用最小的性能开销换取最大的内存空间 。
3.3 内存共享内存共享技术指的是通过对不同变量生命周期的分析 , 在不同变量之间重复使用同一块内存空间 。 在机器学习框架中有两种类型的内存共享方式:置换操作和内存复用 。 置换操作是将输出结果直接存储在输入数据的物理地址上 。 例如 , 当计算y=sigmod(a)时 , y可以直接存储在a的内存中 。 内存复用则是指在生命周期不重叠的变量之间共享同一块内存 。
Chen等人也应用了内存共享的思想 。 作者构造了以每个变量为节点的冲突图 , 然后按拓扑顺序遍历整个图 , 并使用计数器来表示节点的生命周期 。 如果当前操作的输入变量没有被其他操作引用 , 那么当前操作的输出变量就可以使用置换操作 。 当节点的生命周期没有重叠时 , 节点之间就会发生内存复用 。 此外作者使用静态内存分配算法 , 在训练开始之前将内存分配给每个节点 , 以避免运行时的垃圾回收开销 。
Jin等人在层内以及层间应用了内存复用的策略 。 作者提出了一种层内内存复用策略 , 该策略根据每一层内正向传播和反向传播之间的独立性来复用它们的内存空间 , 即节点的梯度能够重用节点数据的内存空间 。 这种策略能够使得当前层的内存占用降低50% , 适用于层的范围较宽的神经网络 。 此外作者还观察到:深度神经网络中的计算和内存占用都遵循逐层的方式 。 因此 , 对于来自不同层的独立和顺序操作而言 , 可以重复地使用相同的内存空间 。
推荐阅读
- 上海市交通委员会|市交通委党组参加《民法典》学习会
- Java|计算机专业的本科生,该选择学习Java技术体系还是.NET技术体系
- 深度|创意信息:与成都市大数据股份有限公司签署深度合作协议
- |西装、奶奶针织衫显老气?深度解析“衣橱单品”,多看一眼就赚了
- 时尚穿搭生活馆|40、50岁女人就别穿“大妈装”了!学习博主减龄穿搭,洋气又减龄
- |西装、奶奶针织衫显老气?深度解析“衣橱单品”,建议你一定要看
- 中国新闻网|瓦努阿图群岛附近海域发生6.6级地震 震源深度10千米
- 环球网|【深度】突然驱逐15名中国公派留学生,美对华留学限制还将走多远……
- 消除"学历歧视",鹰视教育助力全民终身学习教育体系建设
- 光明网|回馈“山川异域,风月同天”中国援助抵达世界各地
