目录
2.BACKGROUND AND MOTIVATION(背景和动机)
2.2 Error-Bounded Lossy Compression
2.3 Research Goals and Challenges(研究目标与挑战)
3.COMPRESSION ERROR PROPAGATION ANALYSIS(压缩误差传播分析)
3.1 Modeling Compression Error
3.2 Modeling Error Impact on Gradient
3.3 Error Propagation Analysis(误差传播分析)
写在前边
知识补充:
可靠性、安全性和性能是 IT 系统最重要的三个评价维度。对于 IT 系统来说,可靠性和安全性是基础,系统故障或数据泄露等造成的破坏性是显而易见的;而性能则是核心能力,代表着 IT 系统的服务水平,性能瓶颈会制约企业业务的发展,严重影响用户体验。
存储系统是企业 IT 基础架构重要的组成部分,为企业内部众多的 IT 系统提供数据存储服务。随着数字化转型的深入,企业的 IT 系统建设也进一步加快,这一方面带来了数据量的急剧增长,另一方面也提高了数据的访问频率,存储的性能瓶颈的影响也会被进一步放大。
存储系统
经过多年的技术演进和架构变化,存储系统可大致分为 SAN 存储、 NAS 存储以及分布式存储这三类,它们有类似之处,又各有特点。
1.SAN存储
SAN ( Storage Area Network )本身是一个承担数据存储任务的存储网络,与业务 LAN 网相互隔离。SAN 存储则是一种基于存储块的存储系统,一般使用 FC 、 ISCSI 、 NVMe 等通信协议。
架构层面看, SAN 存储一般是存储控制器后端挂载磁盘阵列,数据最终储存在磁盘阵列,而磁盘阵列则包括了多个 RAID 组。N 个磁盘组成一个 RAID 组,在 RAID 组之上又会被划分出逻辑存储单元 LUN ,也就是共享存储池的逻辑磁盘,这些 LUN 会通过 SAN 网络与服务器的 HBA 卡相连,从而会被服务器的操作系统识别为磁盘,并被分区和格式化后使用,其架构如图 1 所示。
2.NAS存储
NAS ( Network Attached Storage )存储一般也可认为是网络文件存储,用户数据大多数以文件形式存在,通过以太网访问模式走 NFS/CIFS 协议,提供了广泛兼容性易用性的共享能力。相比于 SAN 存储, NAS 存储不以磁盘形式提供存储服务,不需要分区和格式化,可以直接提供可以直接挂载的网络文件系统。
3.分布式存储
分布式存储系统是采用可扩展的集群架构,通过数据副本算法将数据分散存储在多台独立的设备上,分布式集群之间一般通过通用 TCP/IP 网络连接。相比于其传统的集中式存储阵列,分布式存储系统可以通过多台存储服务器来分担存储负荷,可以满足大规模存储应用的需要。常见的分布式存储系统的形式包括分布式文件系统(如 HDFS )和对象存储(如 Ceph )。
存储性能分析
1.定性分析
定性分析是结合个人的运维经验,来分析存储系统的性能是否能满足应用系统的需求,来分析存储系统是否存在性能瓶颈,而这些都取决于对应用数据类型和存储系统的熟悉程度。
2.定量分析
定量分析是从数据指标角度来分析解决问题,既可以从存储侧来度量存储系统的服务能力,也可以从用户应用侧来衡量存储 IO 体验。无论是存储侧还是用户应用侧的定量分析,都离不开三大存储性能数据指标:IOPS 、吞吐量( Throughput )、延时( Latency )。因此有必要弄清楚三个性能数据指标的含义及其关联关系。
IOPS | 代表存储每秒所处理的 IO 操作数量。对于存储系统来说,我们在性能分析时,既需要关注整体的 IOPS ,有时也需要分析单个控制器、单个 LUN 或者单个磁盘的 IOPS ,甚至可能还需要区分读或者写的 IOPS 。 |
吞吐量 | 代表存储每秒所处理的 IO 数据量大小,也就是存储数据传输所占用的带宽,与 IOPS 类似,也可以细分读或者写,可以单独组件分析。 |
延时 | 代表存储系统处理 IO 操作所需要的时间,通常情况下,是最重要的存储性能指标,与 IOPS 类似,也可以细分读或者写,可以单独组件分析。 |
深度学习模型需要大量数据集,这对于人工智能和深度学习的存储是一种独特的挑战。简要介绍机器学习和深度学习软件的本质,将会揭示存储系统对于这些算法如此重要以提供及时准确结果的原因。
为什么人工智能和深度学习的存储很重要?
随着数据集的增加,深度学习模型的准确性也会提高。这一改进意义重大,研究人员经常使用复杂的数据增强技术来综合生成额外的数据用于模型训练。
例如,用于对各种深度学习图像分类算法进行基准测试的ImageNet数据集包含超过1400万张具有大量注释的图像。虽然经常用于对图像分类硬件进行基准测试的ResNet-50模型的大小刚好超过100MB。这些模型最好保存在内存中,必须不断地提供数据,这通常会导致存储系统成为整体性能的瓶颈。
深度学习存储系统设计必须在各种数据类型和深度学习模型之间提供平衡的性能。
无论模型和应用如何,深度学习包括两个步骤:模型训练和数据推理。训练是在使用训练数据集进行重复的、通常是递归的计算的基础上计算和优化模型参数的过程。数据推理是在新的输入数据上使用经过训练的模型进行分类和预测的地方。
每个步骤都会以不同的方式强调为人工智能和深度学习提供存储的系统。通过训练,其压力源于大型数据集和对计算复合体(通常是分布式集群)的快速I/O,这是可接受性能所必需的。通过推理,其压力来自数据的实时性,必须以最小的延迟处理这些数据。
深度学习模型和数据源的多样性,以及通常用于深度学习服务器的分布式计算设计,意味着旨在为人工智能提供存储的系统必须解决以下问题:
0.Abstract
由于对预测精度和分析质量的要求越来越高,深度神经网络(DNN)正变得越来越深、越来越宽、越来越非线性。但训练宽深度神经网络需要大量的处理时间和计算资源,如内存、存储、I/O 等。在训练 DNN模型时,前向传播时必须先将中间激活数据保存在内存中,然后再恢复到后向传播。然而,由于硬件设计的限制,gpu等最先进的加速器只能配备非常有限的内存容量,这极大地限制了最大批处理大小(batch_size),因此在训练大规模 dnn时性能加速。传统的内存节约技术,如数据重计算和迁移,要么承受高性能开销,要么受到特定互连技术和有限带宽的限制。
(ps:数据迁移:数据迁移(又称分级存储管理,hierarchical storage management,hsm)是一种将离线存储与在线存储融合的技术。它将高速、高容量的非在线存储设备作为磁盘设备的下一级设备,然后将磁盘中常用的 数据按指定的策略自动迁移到磁带库(简称带库)等二级大容量存储设备上。当需要使用这些数据时,分级存储系统会自动将这些数据从下一级存储设备调回到上一 级磁盘上。对于用户来说,上述数据迁移操作完全是透明的,只是在访问磁盘的速度上略有怠慢,而在逻辑磁盘的容量上明显感觉大大提高了。)
在本文中,我们提出了一种新颖的内存驱动的高性能 DNN训练框架,该框架利用错误有界有损压缩来显著降低训练的内存需求,从而允许训练更大的神经网络。与采用基于图像的有损压缩器(如JPEG)来压缩激活数据的最先进的解决方案不同,我们的框架有意设计带有严格错误控制机制的有错误限制的有损压缩。具体来说,我们从理论上分析了从改变的激活数据到梯度的压缩误差传播,然后实证研究了改变的梯度对整个训练过程的影响。基于这些分析,我们提出了一种改进的有损压缩器和一种自适应方案来动态配置有损压缩误差范围和调整训练批处理大小,以进一步利用节省的内存空间来进一步加速。我们使用四个广泛采用的dnn和ImageNet数据集,以最先进的解决方案来评估我们的设计。结果表明,我们提出的框架可以显著地减少训练的内存消耗,分别比基线训练和最先进的压缩框架减少 13.5×和 1.8×?,且精度损失很小或没有损失。
1.Introduction
深度神经网络(dnn)已迅速发展为最先进的技术,可用于图像和视觉等各种科学技术领域的许多人工智能(AI)任务识别系统,推荐系统,自然语言处理(NLP)。dnn 以一种无与伦比的表示方式包含数百万个参数,这对于复杂非线性建模是有效的。许多研究表明,使用更深层或更宽的 dnn是提高分析质量的有效方法,事实上,许多近期的 dnn 在深度和更宽方面都有显著提高。(OpenAI 最近发布了他们新的基于 dnn 的 NLP 模型 GPT-3,具有1750 亿个参数,这是迄今为止训练的最大的NLP模型。与它的前身GPT-2相比,GPT-3 在没有对模型架构进行重大修改的情况下将容量扩展了三个数量级,而不是仅仅采用更深或更宽的层。)
DNN训练是将目标损失函数最小化的优化过程,将事件或值直观地反映为一个实数来表示成本或差异。训练现代 dnn 需要大量的计算量和内存、存储、I/O 等资源。实施高效 DNN训练的典型策略是依赖于配备高吞吐量加速器的高级高性能计算(HPC)或数据中心架构,如通用提议加速器(如 gpu)或定制硬件(如 FPGA或ASIC 设计),以大规模并行方式执行浮点运算。然而,在目前的大规模网络模型下,高效的培训很难实现。
在这篇论文中,我们探讨了一种通用的内存驱动方法来实现高效的 DNN训练。具体地说,最终目标是大幅度减少训练的内存需求,以减少大规模训练加速的最大批处理大小限制。在训练DNN模型时,通常在正向传播时将中间激活数据(即所有神经元的输入)保存在内存中,在反向传播时进行恢复,计算梯度并相应地更新权值。然而,考虑到当前大规模非线性 dnn 的深度层和广度层,存储这些来自所有层的激活数据需要较大的内存空间,而gpu等最先进的训练加速器无法提供这些内存空间。
近年来,将模型分布到多个节点的模型并行技术不断发展,可以减少每个节点的内存消耗,但引入了较高的通信开销;另一方面,数据并行技术在每个节点上保持相同的模型,但将训练数据分散到不同的节点上,因此内存消耗较大,无法充分利用计算能力。一些技术,如重新计算、迁移和激活数据的无损压缩,已经被提出,以解决训练大规模到大规模 dnn 的内存消耗挑战。
技术 | 做法,好处 | 存在问题 |
数据迁移技术 | 将中间数据从 GPU迁移到CPU,减轻了内存负担。 | 具体的节点内互连技术(如PCIe和NVLinks)及其可用带宽限制了数据迁移方法的性能。 |
重新计算激活数据 | ? | 这些方法往往会导致较大的性能下降,特别是对于卷积层等计算密集型层。 |
基于激活数据无损压缩的内存压缩 | ? | 存在压缩比有限的问题,例如大多数浮点数据的压缩比仅为 2:1左右。 |
压缩卸载加速器 | 在将激活数据传输 到CPU DRAM之前减少激活数据的大小。 | 添加一个新的专用硬件组件到现有的GPU架构需要巨大的行业努力,并没有准备好立即部署。 |
总之,这种设计可能不够通用,无法适应未来的DNN模型和加速器架构。
为了应对这些挑战,我们提出了一种高效存储的深度神经网络训练框架,通过使用灵活的错误有界有损压缩来压缩激活数据。与JPEG、JPEG2000等有损压缩方法相比,错误有界有损压缩能够对浮点激活数据发生的错误提供更严格的控制;与GZIP和 Zstd等无损压缩相比,它可以提供更高的压缩比,从而获得更高的内存消耗和性能改进。本研究探索的主要观点包括:(i)可以从理论上和实验上分析在严格控制误差的有损压缩下,激活数据中发生的压缩误差对梯度和整个DNN训练过程的影响,(ii)基于对误差有界有损压缩(即压缩误差)的动态细粒度控制,可以很好地保持训练精度。据我们所知,这是第一次从理论上研究DNN训练过程中的压缩误差传播,并利用该分析在保持高训练精度的同时,显著减少训练大型 DNN的内存消耗。综上所述,本文的贡献如下:
•我们提出了一种新颖的内存高效 DNN训练框架,通过细粒度错误有界有损压缩动态压缩中间激活数据。
•我们从理论和经验的角度对DNN训练过程中压缩误差传播的影响进行了深入的分析。此外,我们改进了有损压缩算法,以避免由于引入到激活数据的错误而导致梯度的显著改变(消失或爆炸)。
•我们提出了一种自适应方案,以基于一系列当前训练状态数据动态配置错误有界有损压缩。
•我们在 4 个广泛采用的 DNN 模型(AlexNet, VGG-16, ResNet-18,ResNet- 50)和 ImageNet-2012 数据集上评估我们提出的训练框架,并将其与最先进的解决方案进行比较。实验结果表明在相同批量下,与原训练框架和最先进的方法相比,我们的设计可分别减少13.5×和 1.8×的内存消耗。
2.BACKGROUND AND MOTIVATION(背景和动机)
2.1 大规模DNN的训练
近年来,dnn 被广泛研究,在视觉检测[36]和自然语言处理(NLP)等多个科学领域都得到了证实。每个神经网络包含许多连接层,允许输入数据流通过计算并提供相关的结果。针对 dnn开发了不同类型的层,其中卷积层及其优化是近年来深度学习(DL)社区的研究热点之一,如 TPU的发
明。它们由一组过滤器和内核组成,通过一个滑动窗口对输入数据执行卷积。卷积神经网络(cnn)通常由卷积、激活、池化、批处理归一化、局部响应归一化、全连接和退出层组成。为了进一步提高在大型真实数据集上的最先进的精度,最近的工作提出了更深入和更广泛的非线性CNN架构,如 ResNet[19]和 Inception V4。例如,具有 50 个卷积层的ResNet-50 可以为ImageNet-12 数据集提供 71.49%的 top-1 精度,但早期的线性 CNN 架构,如 AlexNet,只有 5 个顺序层,只能提供 57.41%的 top-1精度。
训练深度和广度的神经网络变得越来越具有挑战性。虽然许多最先进的深度学习框架,如 TensorFlow和 PyTorch,可以通过利用gpu等通用加速器上的大规模并行性来提供高计算吞吐量,但最常见的瓶颈之一仍然是训练过程中的高内存消耗,特别是考虑到有限的现代DNN加速器上可用的片上内存。这主要是由于在训练过程中计算的激活数据的规模不断增大。训练神经网络涉及许多训练迭代/阶段,以微调模型权值。每个迭代都包括一个向前和向后的传播,如图 1 所示。
每一层产生的中间激活数据(每个神经元的输出)通常保存在内存中,直到反向传播再次到达这一层。一些文献指出,在正向传播中,激活数据产生的时间与反向传播中激活数据被重用的时间之间存在很大的差距,特别是在训练非常深入和广泛的神经网络时。图 2 显示了各种神经网络的内存消耗情况。对于这些 cnn,与model/weight size 相比,激活数据的大小要大得多,因为卷积核相对于激活张量来说相对较小。
综上所述,由于当前深度学习训练的高内存消耗,我们面临两个主要挑战:(1)在有限的GPU内存容量下,扩大训练过程具有挑战性;(2)批量限制导致训练性能低下。当基于错误和跟踪的方法通常用于开发新的 DNN模型和算法时,性能挑战进一步加剧。
近年来,人们提出了一些降低 DNN训练内存消耗的工作。
重新计算利用了计算成本低的层,如池化层。具体来说,它将释放这些层的激活数据,并在需要时在反向传播期间根据它们的前一层重新计算它们。这个方法可以减少一些不必要的内存开销,但只能应用于性能开销较小的有限类型的层。像卷积层这样的层通常不能在可接受的性能开销下有效地重新计算。
另一种关于数据迁移的方法被提出,它在生成时将激活数据从加速器发送到CPU主机,然后在需要时将其从主机加载回来。但数据迁移性能在很大程度上取决于主机与加速器之间的可用互联带宽,以及采用的节点内互联技术。例如,NVLink技术目前仅限于高端 NVIDIAAI 节点(如DGX系列)和IBM power 系列。本文的目标是开发一种通用的技术,可以应用于所有类型的HPC和数据中心系统。
最后是数据压缩方法,特别是在节约内存带宽方面。这里使用数据压缩的基本思想是,在生成激活数据时将其压缩,将压缩数据保存在内存中,并在需要时将其解压。然而,使用无损压缩只能提供一个相对较低的内存减少率(即压缩比),例如,通常在2×内。其他一些研究,如 JPEG- act利用了视觉识别任务中激活张量和图像之间的相似性,并将修改后的 JPEG有损压缩器应用于激活数据。与基于无损压缩的解决方案相比,这种方法提供了更高的压缩比(例如,通常约 7×)。但它有两个主要缺点。首先,它给激活数据引入了不可控的压缩误差,最终可能会失去对整体训练精度的控
制,因为 JPEG主要是为图像设计的,并且是一个基于整数的有损压缩。基于 JPEG的解决方案(或其他基于图像的有损压缩)可能不适用于 dnn,因为dnn 应用于比图像处理更普遍和更大的科学背景下,以分析极其大量的数据,例如,通过深度学习为前所未有的发现的大规模 HPC 场景。其次,基于 JPEG的解决方案需要GPU硬件中添加的专用硬件组件的支持。硬件创新通常需要 5 到 10 年的时间来适应,而且不能直接部署到今天的系统中。
我们注意到,上述三种方法都是相互正交的,这意味着它们可以一起部署,以最大限度地提高压缩比和训练性能。因此,在本文中,我们主要致力于设计一种高效的数据压缩,更具体地说,是基于有损压缩的解决方案,以实现超出CNN模型上最先进的方法的内存减少率。此外,由于卷积层是最难以进行高效重计算的层类型,我们的解决方案集中在卷积层上,以最小的性能开销和精度损失提供高压缩比。
2.2 Error-Bounded Lossy Compression
有损压缩可以在重构后的数据中以很小的信息损失来压缩数据。与无损压缩相比,有损压缩可以提供更高的压缩比,同时仍然为科学发现保留有用的信息。不同的有损压缩器可以提供不同的压缩模式,如错误有界压缩模式和固定速率压缩模式。误差有界模式要求用户设置一个误差界,如绝对误差界和点相对误差界。压缩器保证原始数据和重构数据之间的差异不超过用户设置的误差范围。固定码率模式是指用户可以设定一个目标码率,压缩器保证被压缩数据的实际码率低于用户设
定的值。
近年来,针对科学数据提出并开发了新一代的有损压缩器,如SZ和 ZFP。与传统的有损压缩器(如 JPEG)不同,SZ 和ZFP 是用来压缩浮点数据的,可以根据用户的要求提供严格的错误控制方案。在本工作中,我们选择使用SZ而不是ZFP,因为SZ - cuSZ- 1的GPU版本比ZFP提供了更高的压缩比,并提供了ZFP不支持的绝对误差绑定模式(但对我们的错误控制是必要的)。具体来说,SZ 是一种基于误差有界预测的科学数据损耗压缩器。
SZ主要有三个步骤:(1)利用自适应的最佳拟合预测方法,根据各数据点的邻点预测各数据点的值;(2)基于用户集误差界量化真实值与预测值的差值;(3)采用定制的霍夫曼编码和无损压缩,实现更高的压缩比。
2.3 Research Goals and Challenges(研究目标与挑战)
在本文中,我们提出了一种新颖的内存驱动的高性能 CNN训练框架,该框架利用错误有界有损压缩来显著降低训练的内存需求,以便允许更大的神经网络训练和开发。要实现这一目标,有几个关键的挑战需要解决。首先,由于我们计划使用错误有界的有损压缩器,一个严格控制的压缩错误将被引入到激活数据中。其次,为了保持训练精度曲线对性能和最终模型精度的影响最小,我们必须了解引入的误差是如何在整个训练过程中传播的。换句话说,我们必须从理论上和实验上分析误差传播,这是一个挑战。据我们所知,之前没有对此进行过调查。
第三,一旦我们理解了受控误差和训练精度之间的关系,如何在细粒度下平衡压缩比和精度退化也是一个挑战。换句话说,更激进的压缩可以提供更高的压缩比,但也会给激活数据带来更多的错误,这可能会显著降低最终模型的性能准确性或训练表现(不能收敛)。因此,我们必须找到一种平衡,在不同的迭代过程中为不同的层提供尽可能高的压缩比,同时保持对准确性的最小影响。
3.COMPRESSION ERROR PROPAGATION ANALYSIS(压缩误差传播分析)
在本节中,我们给出了我们所提出的训练框架分析压缩错误传播(1)从激活数据到梯度,(2)从梯度到卷积层的整体训练的理论支持。
3.1 Modeling Compression Error
图3展示了一个由 cuSZ压缩和解压缩激活数据时的错误分布示例。这里用于演示的激活数据是在某一次迭代中从AlexNet的conv5层提取的。注意,实际上我们每50次迭代绘制误差分布,并观察到所有的误差分布都非常相似,遵循均匀分布,这与之前的工作得出的结论一致。因此,我们提出采用均匀分布误差模型进行理论分析,并采用基于误差注入的方法来证明本节理论推导的有效性。注意,出于理论分析的目的,我们注入了错误,而不是实际压缩和解压缩激活数据,以演示均匀分布的错误如何从激活数据传播到梯度,然后传播到整个训练过程。我们把实际压缩的评估留给第5节。
3.2 Modeling Error Impact on Gradient
接下来,我们从理论上推导了误差是如何从激活数据传播到梯度的,并利用误差注入提供了基于统计分析的实验证明。
如图1所示,当反向传播到达相应层时,需要对压缩的激活数据进行解压缩。在反向传播过程中,每一层计算梯度来更新权值和要传播到前一层(反向传播)的损失。如图 4 所示,一方面,前一层激活数据的丢失只取决于当前层的丢失和权重。另一方面,梯度不仅取决于当前层的损耗,还取决于激活数据。我们注意到,激活数据可以在向前传播期间压缩,以减少内存消耗。总之,为了理解压缩激活数据的影响,我们必须首先理解引入到激活数据的压缩错误是如何传播到梯度的。
在正向传递中,多个内核对输入激活数据执行卷积。如图 5a 所示,内核对激活数据(棕色标记)执行,并生成红色所示的输出值。与前向传递类似,后向传递反向计算,其中基于丢失(与前向传递中的输出数据具有相同的维数)和内核中的原始数据计算参数的梯度,如图 5b 所示。类似地,激活数据和损失计算梯度值,如红色所示。更具体地说,这个值计算为:
G代表梯度,A代表激活数据,L代表损失,k是当前通道,n是损失矩阵的数值。
图6b显示了我们将错误注入到激活数据(保持零不变)后梯度误差的分布。与图 6a 相比,我们可以看到下降,但仍然保持正态分布。这种减少的部分原因是方程 4中元素的数量减少了,因为这些零没有任何误差。
3.3 Error Propagation Analysis(误差传播分析)
最后,我们通过实验分析讨论了从梯度到整体训练曲线的误差传播。
我们的目标是确定最大可接受的梯度误差,将导致很少或没有准确性损失。根据我们在 3.2 节的理论和实验证明,梯度误差可以被建模为正态分布误差。在本节中,我们使用与上一节相同的策略,将错误注入到跟随误差模型的梯度中,并执行分析和评估。
我们建议使用动量来减轻梯度误差的影响。动量在大多数神经网络训练中得到了广泛的应用。实际上,为了更新权值,它不仅基于当前迭代计算的梯度,还基于动量。换句话说,梯度和动量(与权重和梯度具有相同的维度)都占据了权重更新数据的一部分。因此,保持与无误差动量向量相似的精确动量向量来指导权值的更新方向至关重要。
实际上,动量是根据当前层的梯度计算的,动量误差与梯度误差直接相关。而正态分布的梯度误差在原方向上是集中对称的,动量误差相对于梯度误差来说相对较低。因此,这确实有助于训练走向正确方向。甚至几个迭代可能会产生不希望的梯度,它们可以通过基于估计的梯度误差的动量快速抵消。
4.DESIGN METHODOLOGY
在本节中,我们描述了我们提出的支持有损压缩的 CNN训练框架的总体设计,并分析了性能开销。
我们建议的内存驱动框架如图 7 和图1 所示。对于每个迭代中的每个卷积层,我们迭代地重复图 7 所示的过程。我们提出的框架主要包括四个阶段:(1)收集当前训练状态的参数用于自适应压缩(2)梯度评估以确定可接受的最大梯度误差(3)估计压缩配置(例如,绝对误差界)(4)使用cuSZ对激活数据进行压缩/解压。
4.1参数收集
首先,我们收集当前训练状态的参数,用于后续的有损压缩配置调整。我们的框架主要收集两类参数:(1)CNN架构中的离线参数,(2)半在线参数,包括激活数据样本、梯度和动量。
首先,我们收集了多个静态参数,包括 batch size,每个卷积层的激活数据大小,以及其输出层的大小。我们需要这些参数,因为它们影响组合成梯度中每个值的元素的数量,因此影响它的正态误差分布,如第3节所讨论的。它也将帮助框架收集相应的在线参数。对于半在线参数,我们收集了激活数据的稀疏性及其在反向传播中的平均损耗,以估计压缩误差如何从激活数据传播到梯度。
此外,在我们的框架中,还需要在训练的开始阶段设置一个积极的因素来调整整体的积极性。用来确定参数提取的活跃度。
这些参数在训练过程中变化相对缓慢,因此,我们只需要在框架中一个固定的迭代间隔内估计误差影响。在本文中,我们将默认值设置为1000,这在我们的评估中提供了较高的准确性和较低
的开销。
4.2梯度评估
接下来,我们估计梯度误差对训练曲线造成的精度损失很小或没有损失的极限,如图 7 所示。即使有动量偏移的帮助,我们仍然希望每次迭代的梯度尽可能接近原始的梯度。根据我们之前在第 3 节的分析,我们需要在梯度误差分布中确定可接受的,使对整体训练精度曲线的影响最小化。基于我们的实证研究,我们使用 1%作为可接受的误差率。
注意,这里我们使用的是平均长度而不是模长度的动量,因为我们关注的是梯度的每个单独的值,平均值可以更有代表性。另外,请注意,我们不想估计梯度和动量的平均值;相反,我们寻求
一个经验的解决方案,直接监测平均值。实验结果表明,在训练过程中,梯度在短时间内变化不大。
4.3激活评估
之后,我们根据前一阶段的梯度评估和收集到的参数,动态地配置激活数据的有损压缩,如图 7所示。如第3节所讨论的,我们需要(从梯度误差模型)、(激活数据的稀疏性)、(电流损耗的平均值)和(批量大小)来确定在当前层压缩激活数据时可接受的误差范围。
4.4自适应压缩
在最后一阶段,我们将经过优化配置的有损压缩部署到相应的卷积层。我们还监测压缩比进行分析。当需要时,我们在反向传播中解压压缩的激活数据。?如第 3 节所述,我们需要强制激活数据中的零在压缩算法中保持不变。但是,目前的 cuSZ 算法在遇到连续零点时,可能会产生误差范围内的一系列小值。
为了解决这一问题,我们提出了一种绕过这一问题的方法,即利用数据重计算技术。具体来说,当这种情况发生时,我们重新计算激活函数层,以便这些零在解压后可以保持为零,而其他值仍然是解压后的值。
对于更一般的解,我们建议在压缩连续零的情况下修改cuSZ。更具体地说,我们在解压缩过程中添加一个过滤器,以在错误范围内将这些值重新归零。
5.EXPERIMENTAL EVALUATION
在本节中,我们从四个方面评估我们提出的框架
评估压缩误差对梯度的影响 |
评估误差从梯度到训练曲线的传播 |
我们提出的框架与最先进的方法的比较 |
性能评估 |
5.1实验设置
我们的评估是用Caffe和Tensorflow进行的。我们选择Caffe 进行单节点实验,因为它易于修改;选择 Tensorflow进行多节点评估,因为它使用得当。我们的实验平台是 TACC Longhorn 系统,每个GPU节点配备 4 个 Nvidia Tesla V100 GPU。我们的评估数据集是 ImageNet-2012。我们使用 CNN模型进行图像分类,包括 AlexNet , VGG-16 , ResNet-18和ResNet-50。
5.2误差传播评估
我们还使用 256 个批处理大小对 AlexNet和 vg -16 的不同层进行评估,如上图所示。我们可以清楚地看到系数和我们的估计值是如何与实际误差分布相吻合的。这意味着我们不仅可以估计误差传播,而且还可以根据给定的可接受的误差分布确定误差界。
接下来,我们评估误差传播从梯度到整体训练曲线的准确性。当我们的目标是造成很少或没有准确性损失时,我们将重点放在训练结束后的迭代上,因为在训练接近尾声时,准确率很难提高。为了减少训练时间并找到经验解,我们在没有框架帮助的情况下对模型进行预训练,并在每个epoch 保存快照。然后,我们从不同的快照的不同迭代执行我们的误差传播的评估。图 9 显示了我们在 AlexNet 上的实验,从批量为 256 的190,000 次迭代开始。一方面,我们可以从放大的子图中看到= 0.05会导致不可接受的误差损失,最终无法恢复。另一方面,
= 0.02 可以提供更好的精度和更高的压缩比,但在某些情况下,它会略微影响精度。因此,考虑到我们的目标是为所有卷积层提供一个通用的解决方案,我们最终选择
= 0.01 作为我们框架中的默认值;换句话说,目标是梯度平均值的1%。
5.3内存减少评价
然后,我们使用 ImageNet 数据集在各种流行的 cnn 上测试我们的框架,并评估其内存缩减能力。图 10 展示了使用 AlexNet 的结果。红色和蓝色的线是基线训练和我们框架的训练精度曲线。我们可以观察到这两条曲线非常接近,这意味着我们的框架没有明显的影响accuracy。
我们还在这张图中用黄色表示了压缩比到迭代的曲线。在训练的早期,压缩比可能会因为模型变化较大而稍微不稳定。需要注意的是,当学习率发生变化时,压缩比会有轻微的变化,因为学习率只在梯度到权值的更新时起作用。此外,对于某些层,虽然每个输入的平均最大损失应该降低,导致较高的误差界,但相应的激活数据值实际上增加了。因此,即使有较高的误差界,压缩比也不会增加。
表 1 显示了我们的框架可以提供的卷积层的压缩比。精度损失几乎没有或很小,高达 0.31%。这要归功于我们对压缩误差的仔细控制,以及对误差影响的深入的理论分析和建模。我们的框架可以提供一个有希望的压缩比,而无需对不同模型的任何参数进行大量的微调。总的来说,我们提出的框架可以提供高达 13.5×的压缩比,而精度损失很小或没有损失。
对比分析:与基于无损压缩的解决方案[35]相比,[35]减少了 2 倍以内的内存使用,我们的框架的性能优于它 9倍以上;与目前最先进的基于有损压缩的解决方案[14]相比,我们的框架在ResNet-18 和ResNet-50 上分别优于它1.5×和 1.8×?。[14]使用基于图像的有损压缩器提供高达7×的压缩比。
5.4绩效评估与分析
我们的框架在训练过程中引入了相对较小的开销,但可以大大降低内存利用率,并允许在有限的 GPU内存下训练更大、更宽的神经网络。此外,节省的内存还可以进一步用于更大的批处理大小,从而提高整体性能。图 11 显示了在单 gpu 和多节点/多 gpu 情况下,随着批处理大小的增加,原始性能(即每秒图像量)的提高。我们可以清楚地观察到原始性能可以通过这两个用例得到改善。
6 CONCLUSION AND FUTUREWORK
在本文中,我们提出了一种新的高效记忆的深度学习训练框架。我们利用SZ误差有界的有损压缩器来减少卷积层的内存消耗。我们建立了一个误差传播模型,并证明了它的准确性。我们使用 ImageNet 数据集在几个流行的 cnn上评估我们提出的框架。结果表明,我们的框架显著地减少了内存使用高达 13.5×,几乎或没有准确性损失。与最先进的基于压缩的方法相比,我们的框架可以提供高达 1.8倍的性能改进。(未来工作:我们计划实现那些正交的方法,如数据迁移和重新计算到框架中,以获得更高的性能和更多的内存减少。)此外,我们将进一步优化激活数据的压缩解压缩性能。(既提高了压缩比,减少了内存消耗,而且精度损失很小)
7.启发
1.一些技术,如重新计算、迁移和激活数据的无损压缩,已经被提出,以解决训练大规模到大规模 dnn 的内存消耗挑战。但是无损压缩方法存在压缩比有限的问题,例如大多数浮点数据的压缩比仅为 2:1左右。而有损压缩又会损失精度。面对这个问题,可以通过使用灵活的错误有界有损压缩来压缩激活数据(相当于设置一个自适应的压缩错误阈值,在精度损失很小的要求下),它可以提供更高的压缩比,从而获得更高的内存消耗和性能改进。
2.可以从理论上和实验上分析在严格控制误差的有损压缩下,激活数据中发生的压缩误差对梯度和整个DNN训练过程的影响,来确定最大可接受的梯度误差,将导致很少或没有准确性损失。。
3.上述三种方法(重新计算、迁移和激活数据的无损压缩)都是相互正交的,这意味着它们可以一起部署,以最大限度地提高压缩比和训练性能。
8.问题
1.所提出的有损压缩的 CNN训练框架中,使用cuSZ对激活数据进行压缩后又解压缩的目的是什么?
2.对于重计算方法不是太理解。。。
3.压缩比(13.5x)是怎么定义的,对于这个单位不是太清楚