载风月|深度学习中的内存管理问题研究综述( 六 )


Wang等人通过对张量生命周期进行分析 , 实现了不同的张量在不同的时间复用同一块内存空间的目的 。 生命周期分析经常在一个训练迭代中动态地保存和释放张量 , 而一个典型的训练阶段包含数百万个迭代 , 如果使用cudaMalloc和cudaFree , 这种高强度的内存操作会带来巨大的性能开销 。 为了解决这个问题 , 作者实现了一个基于堆的GPU内存池 , 提前分配一个大的GPU内存作为共享内存池 。
内存共享一直以来都是优化内存占用的常见思想 。 通过对数据结构生命周期的分析 , 可以较好地应用内存共享策略 。 目前主流的机器学习框架应用了内存共享的策略 。
3.4 压缩压缩在深度学习中的应用有多种方式 。 在深度学习的训练阶段 , 通过压缩算法对变量进行压缩 , 能够有效降低变量占据的内存空间 , 减少加速设备内存的占用;而在深度学习的推理阶段 , 为了能够将训练好的模型部署在内存受限的边缘设备上 , 研究者提出了模型剪枝、量化等方法 , 通过优化模型结构、减少模型参数占用的内存空间等方式对神经网络模型进行压缩 。
vDNN的工作能够较好地解决深度神经网络在训练时GPU内存占用高的问题 , 使得更深层次的神经网络模型能够在单个GPU中进行训练 。 然而 , 由于PCIe带宽的限制 , 当数据移入和移出CPU内存所需的时间比计算DNN的反向传播算法所需的时间长时 , vDNN就会产生不可忽略的性能开销 。 为了解决这个问题 , Rhu等人[28]实现了一个压缩直接内存访问(compressing direct-memory-access , cDMA)引擎 , 它通过降低交换的数据结构的大小来减小PCIe带宽较低带来的性能损失 。 作者注意到 , 被广泛用于DNN的ReLU层产生的可交换的数据具有显著的稀疏性和高度可压缩的特征 。 cDMA引擎利用交换的数据固有的稀疏性 , 实现了平均提供2.6倍(最大13.8倍)的压缩比 , 将vDNN的性能平均提高了53%(最高79%) 。 由于ReLU层被广泛应用于CNN模型 , 所以cDMA在CNN模型中有较好的性能 , 在其他类型的神经网络中效果一般 。
Jain等人针对训练过程中的特征映射 , 提出了一种高效的分层编码机制 , 以减少训练内存的占用 。 作者注意到在POOL层后的ReLU层的输出结果能够用1 bit的数据来代替之前32 bit的数据 , 通过这种编码方式能够实现32倍的压缩率;此外CONV层后的ReLU层的输出结果具有高度稀疏性的特征 , 作者实现了对这种类型的特征映射高效稀疏格式的存储 , 利用稀疏性减少内存占用 。 这两种编码方式没有造成对网络模型进行训练时的精度损失 。 作者对DNN的数据流图进行静态分析 , 识别出适用的编码方式 , 并通过插入相关的编码和解码函数创建了一个新的数据流图 。
Han等人介绍了“深度压缩方法” , 包括模型剪枝、参数量化和哈夫曼编码3个阶段 , 这3个阶段共同作用 , 减少了神经网络的存储需求 , 从而使得神经网络模型能够被部署在内存受限的嵌入式设备中 。 首先是模型剪枝 , 作者通过正常的网络训练来学习连接性 , 修剪小权重的连接:所有权值低于阈值的连接都将从网络中删除;然后 , 对网络进行再训练 , 以获取剩下的稀疏连接的最终权值;接着是参数量化 , 作者通过减少表示每个权值所需的比特数来进一步压缩修剪后的网络 , 此外作者还通过权值共享让多个连接共享相同的权值 , 减少了需要存储的有效权值的数量 , 并且对这些共享的权值进行微调 , 保证训练精度不受损失;最后 , 利用哈夫曼编码对网络模型进行进一步的压缩 。 通过应用“深度压缩方法” , 作者成功将AlexNet的网络模型大小从240 MB降至6.9 MB , VGG16的模型大小从552 MB降至11.3 MB , 使得这些神经网络能够部署在智能手机等边缘设备中 。
Rhu等人和Jain等人提出的方案都可用于降低DNN在训练过程的内存占用 。 适用于压缩技术的数据需要具有高度稀疏性的特征 , 这使得该技术仅能应用于部分数据结构 , 往往需要与其他技术配合才能发挥较好的效果 。 而Han等人的工作则致力于降低DNN在部署时的内存占用 , 使得DNN模型能够被应用到边缘计算设备中 。 模型剪枝、参数量化等方法会造成模型训练精度的损失 , 在保持较高精度的同时减小模型占用的内存空间一直以来都是研究的 热点 。


推荐阅读