深度学习技术的突破性进展彰显了其令人难以置信的潜力,提供了让人兴奋的新的AI增强软件和系统。
但是,从财政、计算再到环境等几个角度上考虑,训练最强大的模型是极其昂贵的。
提高这些模型的效率会在很多领域产生深远的影响,因此,基于这一需求,未来所开发的模型只会有助于进一步扩大深度学习所提供的范围、适用性和价值。
本文将基于arxiv论文EfficientDeepLearning:ASurveyonMakingDeepLearningModelsSmaller,Faster,andBetter,首先展示深度学习领域模型的快速增长,在继续扩大规模的阶段激发了对效率和性能的需求。随后将给出一个基本框架,介绍实现高效深度学习的可用工具和技术,并进一步为每个重点领域提供详细的示例,盘点工业界和学术界迄今为止的重要探索。
深度学习模型的快速增长
如今,无数应用中都有着机器学习的身影。过去十年中,采用神经网络的深度学习一直是训练新机器学习模型的主要方法。
它的崛起通常要归功于2012年举办的ImageNet竞赛。就在同年,多伦多大学的一支团队提交了一个名为AlexNet(以首席开发人员AlexKrizhevsky命名)的深度卷积网络(deepconvolutionalnetwork),比接下来提交的最好成绩还要高出41%。
在此之前,人们曾尝试过深度和卷积的网络,但不知为何从未兑现承诺。
这其中结合了多种因素:
1.计算(Compute):AlexNet是早期依赖图形处理单元(GPU,GraphicsProcessingUnits)进行训练的模型之一。
2.算法(Algorithms):采用ReLU作为激活函数,使得梯度反向传播地更深。先前的深度网络迭代采用的是Sigmoid或Tanh激活函数,除了很小的输入范围外,在1.0或-1.0处达到饱和。因此,改变输入变量会导致非常微小的梯度,而当存在很多层时,梯度基本上就消失了。三个激活函数的图像如下所示:
简言之,ReLU不会出现梯度消失的问题,而且从计算的角度上看,Sigmoid和Tanh激活函数均需要计算指数,复杂度高,而ReLU通过简单的阈值便可得到激活值。
3.数据(Data):ImageNet(全球最大的图像识别数据库)包含有>1M的数千个类型、数百张有标注的图像。随着互联网产品的出现,从用户行为中收集标注数据的成本也不断降低。
鉴于这一开拓性的工作,人们竞相使用越来越多的参数来创建更深层的网络。如VGGNet、Inception,、ResNet等模型架构,在随后的几年里相继打破了以往ImageNet的竞赛纪录。如今,这些模型也已经在现实世界中进行了部署。
我们在自然语言理解(NLU,NaturalLanguageUnderstanding)领域也看到了类似的效果,Transformer架构在GLUE任务上显著优于之前的基准测试。
上述两个模型都已部署到现实的生产中。
现在,诸如GPT-3的自然语言模型仅训练一次迭代都要花费数百万美元,而且其中还不包括尝试不同的超参组合(微调)或手动/自动运行调试模型架构的成本。毫不夸张地说,这些模型的参数数量高达数十亿甚至数万亿。
与此同时,这些模型令人难以置信的性能也催生出将其应用于新任务的需求,力求突破现有的技术瓶颈。这就产生了一个有趣的问题,这些模型的传播速度会受其效率的限制。
更具体地说,随着深度学习新时代的到来,以及模型变得越来越大并在不同的领域传播,我们难免会面临着以下问题:
2.启用设备部署(EnablingOn-DeviceDeployment):随着智能手机和物联网设备(IoTdevices)的出现,其上部署的应用程序必须是实时的。因此,对设备上的ML模型便产生了一定的需求(其中模型推理直接发生在设备上),这就使得优化它们将要运行设备的模型成为当务之急。
3.隐私和数据敏感性(Privacy&DataSensitivity):当用户数据可能对处理/受到各种限制(如欧洲GDPR法律)敏感时,能够使用少量数据进行训练是至关重要的。因此,用一小部分数据有效地训练模型就意味着需要更少的数据收集。类似地,启用设备上的模型意味着模型推理可以完全在用户的设备上运行,而无需再将输入数据发送到服务器端。
4.新应用程序(NewApplications):效率还可以启用在现有资源约束下无法执行的应用程序。
5.模型爆炸(ExplosionofModels):通常,在同一设备上可能并发地提供多个ML模型。这便进一步减少了单个模型的可用资源。这可能发生在服务器端,其中多个模型可能位于同一台机器上,也可能位于用于不同功能的不同模型的应用程序中。
高效深度学习
我们所确定的核心挑战是效率。效率可能是一个看似宽泛的术语,我们此处明确了需要重点调查研究的两个方面。
1.推理效率(InferenceEfficiency):这主要处理部署用于推理的模型(依据给定输入计算模型输出)的人可能会提及的问题。比如,这种模型小吗?快不快?具体来说,这个模型包含多少参数?磁盘大小、推理阶段的RAM消耗、推理延迟各为多少呢?
如果在给定的任务上有两个同样出色的模型,可能想要选择其中一个更好地、更为理想的模型,在上述两个方面都可以做到最佳。
如果要在推理受到限制的设备(如移动和嵌入式设备)或昂贵的设备(云服务器)上部署模型,则需要注意推理效率。同样地,如果一个人要用有限或昂贵的训练资源上从头开始训练一个大型模型,那么开发旨在提高训练效率的模型将会有所帮助。
反过来,高效的深度学习可被定义为一组算法、技术、工具和基础结构的集合,它们可以协同工作,允许用户训练和部署帕累托最优模型,这些模型只需花费更少的资源来训练和/或部署,同时实现类似的结果。
那么,影响深度学习效率的关键所在又是哪些?
深度学习模型效率的核心领域之一:建模4大支柱
接下来,本文将大致分为以下两部分进行介绍:首先是建模技术的四大支柱——压缩技术(CompressionTechniques)、学习技巧(LearningTechniques)、自动化(Automation)、高效模型的架构和层(EfficientModelArchitectures&Layers),然后是已有的基础设施与硬件基础。
1、压缩技术
(1)剪枝(Pruning):这是一种流行的压缩技术,我们可以对无关紧要的网络连接进行剪枝,从而使网络变得稀疏。LeCun等人在其所发表的题为“最优脑损伤”(OBD,OptimalBrainDamage)的论文中,将神经网络中的参数(层间连接)减少了4倍,同时还提高了推理速度和泛化能力。
Hassibi等人和Zhu等人在OBD方法的基础上提出了OptimalBrainSurgeon工作,这是一种性能较好的网络剪枝技术,利用误差函数的二次导数信息,解析预测权值扰动对函数的影响程度,以自顶向下的方式削弱或消除部分连接权,实现网络的结构化。这些方法采用预训练到合理质量的网络,然后迭代删除显著性得分最低的参数,显著性得分用于衡量特定连接的重要性,这样对验证损失的影响就会最小化。一旦剪枝结束,网络就会用剩余的参数进行微调。重复这个过程,直到网络被剪枝到所需的级别。
在剪枝的各种工作中,差异主要体现在以下几个方面:
l显著性(Saliency):这是决定应该剪枝哪个连接的启发式方法。这可以基于连接权相对于损失函数的二阶导数,连接权的大小等等。
l分布(Distribution):可以在每层设置相同的剪枝预算,或者在每层的基础上进行分配。经验直觉告诉我们,某些层相对来说更容易剪枝一些。例如,通常情况下,前几层如果足够小,则无法容忍显著的稀疏。
l调度(Scheduling):然而,额外的标准是该剪枝多少以及何时进行呢?我们是想在每轮中修剪等量的参数,还是在剪枝开始时较快,然后逐渐放慢呢?
l再生(Regrowth):在某些情况下,允许网络再生剪枝的连接,这样网络就会以相同百分比的连接剪枝不断运行。
就实际使用而言,具备有意义的块大小的结构化剪枝可以辅助提高延迟。在保留相同Top-1精度的情况下,Elsen等人构建的稀疏卷积网络使用约66%的参数,比稠密网络高出1.3-2.4倍。他们通过其库将NHWC(输入数据格式:channels-last)标准密集表示转换为特殊的NCHW(channels-first)“块压缩稀疏行”(BCSR,BlockCompressedSparseRow)表示,这适用于使用其高速内核在ARM设备、WebAssembly(相对JavaScript而言的另一种可以在浏览器中执行的编程语言)等上的进行快速推理。尽管他们也引入了一些约束以限制可加速的稀疏网络类型,但总的来说,这是朝着实际改进剪枝网络的足迹指标迈出的有希望的一步。
(2)量化(Quantization):量化是另一种非常流行的压缩技术。它沿用了这样一种思路,即典型网络中几乎所有权值都是32位浮点值,如果我们愿意降低一些模型质量的话,如准确率、精度、召回率等指标,便可实现以较低精度的格式(16位、8位、4位等)来存储这些值。
例如,当模型持久化时,可以将权值矩阵(weightmatrix)中的最小值映射为0,而将最大值映射为(其中b是精度位数),并线性地将它们之间的所有值外推(extrapolate)为整数。通常,这足以减少模型的大小。例如,如果b=8,则将32位浮点权值映射为8位无符号整数(unsignedintegers),该操作可以将空间减少4倍。在进行推理(计算模型预测)时,我们可以使用数组的量化值和最小&最大浮点值恢复原始浮点值(由于舍入误差)的有损表示(lossyrepresentation)。鉴于要量化模型的权重,于是此步被称为权重量化(WeightQuantization)。
由于大量的参数,有损表示和舍入误差对于内置冗余的大型网络可能问题不大,但对于小型网络而言,由于其对误差的敏感性强,可能会降低精度。
由于权值和激活都是在模拟的量化模式下运行的,这意味着所有层接收的输入都可以以较低的精度表示,在模型经过训练后,它应该具备很强的鲁棒性,能够直接在低精度下执行数学运算。例如,如果我们训练模型在8位域中复制量化,则可以部署该模型对8位整数执行矩阵乘法和其他操作。
在诸如移动、嵌入式和物联网设备之类的资源受限的设备上,使用GEMMLOWP等库可以将8位操作提速1.5-2倍,这些库依赖于硬件支持,如ARM处理器上的Neonintrinsic。此外,TensorflowLite等框架允许用户直接使用量化操作,而不必为底层实现而烦恼。
除了剪枝和量化,还有其他一些技术,如低秩矩阵分解、K-Means聚类、权值共享等等,这些技术在模型压缩领域也十分活跃。
总的来说,压缩技术可以用来减少模型的足迹(大小、延迟等),同时换取一些质量(准确性、精度、召回率等)的提升。
2、学习技巧
(1)蒸馏(Distillation):如前所述,学习技术尝试以不同的方式训练模型,以获得最佳性能。例如,Hinton等人在其开创性工作中探索了如何教会小型网络从大型网络/大型网络的集合中提取暗知识(darkknowledge|Hintonsaid:“Darkknowledgeisthemostofwhatdeeplearningmethodsactuallylearn”)。他们使用一个更大的教师模型(teachermodel)在现有标签数据生成软标签。
软标签为原始数据中的每个可能的类别分配概率,而不是硬二进制值。直觉上,这些软标签捕获了模型可以学习的不同类之间的关系。例如,卡车更像汽车而非苹果,这一模型可能无法直接从硬标签中学习。学生网络(studentnetwork)学习最小化这些软标签的交叉熵损失(cross-entropyloss),以及原始真实的硬标签。损失函数的每个权重可以根据实验结果进行缩放。
Hinton等人曾在论文中表示,能够用一个蒸馏模型来接近10个模型集成的语音识别任务的准确性。其他综合研究表明,小型模型质量有着显著提高。简单举个例子,Sanh等人能够蒸馏一个学生模型,该模型保留了BERT-Base97%的性能,同时在CPU上的占用率要少40%,而速度上快约60%。
(2)数据增强(DataAugmentation):通常对于大型模型和复杂任务来说,拥有的数据越多,改进模型性能的机会就越大。然而,常常采用“人在回路”(humanintheloop)的解决办法,所以获取高质量的标记数据通常既缓慢又昂贵。监督学习就是从这些人工标注的数据中学习。当有资源支付标注费用的时候,它非常有效,但我们能够且应该做得更好。
数据增强主要指在计算机视觉领域中对图像进行数据增强,从而弥补训练图像数据集不足,达到对训练数据扩充的目的,进而提升模型的性能。通常,它涉及到对数据进行转换,这样就不需要重新标注,该过程成为标签不变转换(label-invarianttransformations)。例如,如果您正在教神经网络对包含狗或猫的图像进行分类,旋转图像将不会改变标签。此外,其他的转换形式还有水平/垂直翻转、拉伸、裁剪、添加高斯噪声等。类似地,如果您正在检测给定文本的情感倾向性,引入拼写错误可能不会改变标签。
这种标签不变转换已经在流行的深度学习模型中广泛使用。当您有大量的类和/或特定类的示例很少时,它们尤其方便。
这些技术将数据效率引入到pipeline中。这和教孩子在不同的上下文中识别现实生活中的物体实质上没有太大的区别。
这种对未标注数据进行预训练和对标注数据进行微调的两步过程也迅速得到了NLP社区的认可。ULMFiT率先提出了训练通用语言模型的想法,该模型学习如何解决预测给定句子中的下一个单词的任务。
我们发现,使用大量预处理但未标注的数据,如WikiText-103(源自英文维基百科页面),是预训练步骤的一个不错的选择。这就足以让模型学习语言的一般属性。此外,对于二进制分类问题,微调这种预训练模型只需要100个标注示例,而相比之下,其他情况则需要10000个标注的示例。
该想法也在BERT模型中进行了探索,其中预训练步骤涉及学习双向掩码语言模型(MaskedLanguageModel),使得模型必须在句子中预测缺失的单词。
总的来说,学习技术有助于我们在不影响足迹的情况下提高模型质量。这可以用于改进部署的模型质量。如果原始模型的质量令人满意的话,你还可以通过简单地减少网络中的参数数量来交换新获得的质量收益,以改进模型大小和延迟,直到回到最低可行的模型质量。
有了正确的软件、硬件和技术以后,有效地开发高性能模型的能力,现在取决于如何利用自动化来加速实验过程,并构建最高效的数据模型架构。
3、自动化
如果让自动化帮助网络设计和调优,它将大大减少人类的参与成本和随之而来的偏见。然而,其随之而来的代价是计算成本增加。
(1)超参数优化(Hyper-ParameterOptimization):属于此类工作的常用方法之一是超参数优化(HPO,Hyper-ParameterOptimization)。调整超参数(如初始学习率,权值衰减等)对于加快收敛速度至关重要。当然,还有一些决定网络架构的参数,比如全连接层的数量,卷积层中的过滤器数量等等。虽然我们可以通过实验建立直觉思维,但找到最佳超参数值需要手动搜索能够优化给定目标函数的准确值,往往是验证集上的损失值。
如果用户之前对超参数调优有经验,那么可以使用网格搜索算法(GridSearch,也称为参数扫描)来自动化HPO。在这种情况下,根据用户提供的每个参数的有效范围搜索给定超参数的所有独特且有效的组合。例如,如果学习率(lr,learningrate)的可能值为{0.01,0.05},权重衰减(weightdecay)的可能值为{0.1,0.2},则有4种可能的组合:{lr=0.01,decay=0.1}、{lr=0.01,decay=0.2}、{lr=0.05,decay=0.1}和{lr=0.05,decay=0.2}。
以上每种组合都是一次试验,然后每次试验都可以并行运行。一旦所有试验完成,超参数的最优组合便被找到。由于该方法会尝试所有可能的组合,尝试总数增长非常快,因此遭受维度的诅咒。
另一种方法是随机搜索(RandomSearch),其中从用户提供的可能值范围所构建的搜索空间中进行随机采样试验。类似于网格搜索,每个试验仍然是独立并行运行。然而,鉴于试验独立分布(iid,independentlyandidenticallydistributed)的特点,随机搜索很容易根据可用的计算能力进行扩展,从而找到最优试验的可能性随着试验次数的增加而增加。如果到目前为止最好的试验足够好,这就允许预先搜索。整个超参搜索的过程可视为一个在有限资源限制下的优化问题,在资源分配方面,类似于随机搜索的典型算法有SHA(successionHalving)和HyperBand,可以把更多的资源分配给精度更高或者优化速度更快的算法。
(2)神经架构搜索(NAS,NeuralArchitectureSearch):可以把NAS看作是HPO的扩展版本,在其中搜索改变网络架构本身的参数。NAS可考虑由以下部分组成:
丨搜索空间(SearchSpace):卷积、全连接、池化等操作及其相互连接是图中允许的神经网络操作。这些都是由用户提供的。
丨搜索算法和状态(SearchAlgorithm&State):这是控制架构搜索本身的算法。通常,适用于HPO的标准算法(网格搜索、随机搜索、贝叶斯优化和进化算法等)也同样可用于NAS,以及强化学习(ReinforcementLearning)和梯度下降(GradientDescent)。
丨评估策略(EvaluationStrategy):这定义了用于评估模型适合的度量指标。它可以是简单的常规度量,如验证损失(validationloss)、准确性(accuracy)等;或者也可以是一个复合度量(compoundmetric),如MNasNet,可以根据精度和模型延迟创建单一的定制度量指标。
具有搜索空间和状态的搜索算法可被视为生成样本候选网络的“控制器”。评估阶段对生成的候选进行适合的训练和评估,然后将这个适应值(fitnessvalue)作为反馈传递给搜索算法,该算法将使用它来生成更好的候选对象。
Zoph等人在2016年发表的论文中证明,端到端神经网络架构可以通过强化学习生成。在这种情况下,控制器本身就是一个递归神经网络(RNN,RecurrentNeuralNetwork),它一次生成一层前馈网络的架构超参数,如滤波器数量、步幅、滤波器大小等。训练控制器本身很昂贵(需要22400个GPU小时),因为整个候选网络必须从头开始训练,才能实现单一的梯度更新。在后续论文中,作者改进了搜索空间以搜索单元(cells):一个“正常单元”(NormalCell),可以接收输入,处理并返回相同空间维度的输出。“缩减单元”(ReductionCell)处理其输入并返回其空间维度按比例缩小2倍的输出。每个单元都是块的组合。控制器的RNN每次生成一个块,它选择过去两个块的输出,分别进行操作并将其组合为单个输出。正常和缩减单元堆积以交替的方式堆叠,用于构建CIFAR-10和ImageNet的端到端网络。
其他方法,如进化技术(evolutionarytechniques)、可区分架构搜索(differentiablearchitecturesearch)、渐进式搜索(progressivesearch)、,参数共享(parametersharing)等,这些方法的共同之处在于试图降低架构搜索的成本。
其中,是候选模型,是准确率指标,给定模型在设备上的延迟,表示目标延迟。的取值建议设为0.07。
概括来说,自动化对模型的效率起着至关重要的作用。HPO现在是训练模型的自然步骤,可以提取显著的质量改进,同时最大限度地减少人工参与。而且HPO也可以在独立的软件库以及云服务中使用。类似地,NAS的最新进展也使得以学习的方式构建体系结构成为可能,同时对质量和内存空间都有限制。假设NAS运行完成需要GPU的运行时长达数百小时,并且在领先的云计算服务上,GPU每小时的成本约为3美元,这使得使用NAS方法完全经济可行,并且在针对多个目标进行优化时,成本上与模型体系结构的手动实验不同。
4、高效架构(模型&层)
另一个常见主题是重新设计比基线更好的高效层和模型,这些层和模型可以用于特定任务或作为一般的黑盒。
(1)视觉(Vision):视觉领域中高效层的经典示例之一是使用了卷积层,它改进了视觉模型中的全连接(FC,FullyConnected)层。不过,FC层存在两个主要问题:
丨FC层忽略输入像素的空间信息。直观地说,很难通过孤立地观察单个像素值来构建对给定输入的理解。此外,还忽略了邻域的空间局部性。
丨使用FC层还会在处理中等大小的输入时导致参数数量的激增。一个100×100的RGB图像有3个通道,第一层的每个神经元有3×104个连接,这使得网络也容易过度拟合(overfitting)。
卷积层通过学习过滤器来避免这种情况,每个过滤器都是固定大小的3D权重矩阵(33,55等),第三维与输入通道的数量相同。每个过滤器都对输入进行卷积操作,生成给定过滤器的特征映射。每个过滤器都可以学习检测边缘等特征(水平、垂直、对角线等),从而在特征映射中发现该特征存在的更高值。总的来说,单个卷积层的特征映射可以从图像中提取有意义的信息。堆叠在上面的卷积层将使用前一层生成的特征映射作为输入,逐步学习更复杂的特征。
卷积层效率背后的核心思想是,在图像的任何位置都使用相同的过滤器,不论应用在哪。让我们再回到带3个通道的100×100RGB图像的例子,5×5滤波器意味着总共有75个(5×5×3)参数。每一层都可以学习多个独特的过滤器,并且仍处在非常合理的参数预算之内。这还具有正则化的效果,其中参数数量的显著减少,可以更容易的优化和更好的泛化。
(2)深度可分离卷积层(Depth-SeparableConvolutionalLayers):在卷积操作中,每个滤波器用于在两个空间维度和第三通道维度上进行卷积。由此看来,每个过滤器的大小是××input_channels,其中和通常是相等的。针对每个滤波器都是同样的操作,因此卷积操作同时发生在x和y维度的空间,并在z维度中向纵深处进行。
深度可分离卷积将此划分为两个步骤:
丨用1x1个过滤器进行逐点卷积(point-wiseconvolution),这样得到的特征映射现在达到output_channels的深度。
丨在和维度中使用×过滤器进行空间卷积。
这两种操作堆叠在一起(有任何中间非线性激活)会得到与常规卷积相同形状的输出,但参数要少得多。类似地,计算量减少了一个数量级,因为逐点卷积对每个输入通道的深度卷积要便宜得多。Xception模型架构演示了在Inception体系结构中使用深度可分离卷积,允许在保持参数数量相同的情况下,实现更快地收敛,并在ImageNet数据集上获取更高的精度。
MobileNet模型架构是为移动和嵌入式设备设计的,它也使用深度可分离层而不是常规的卷积层。这有助于减少7-10倍的参数数量和乘法运算,并允许在移动端部署计算机视觉(CV,ComputerVision)任务。用户可以预期10-100毫秒之间的延迟,只不过具体还得取决于模型。MobileNet还通过深度倍增器(depthmultiplier)提供了一个旋钮(knob),用于扩展网络,使用户能够在准确性和延迟之间进行权衡。
(3)注意力机制(AttentionMechanism):在自然语言方面,我们也看到了快速的进步。对于序列到序列(sequence-to-sequence)模型,一个持久存在的问题是信息瓶颈(information-bottleneck)。这些模型通常由编码器(Encoder)和解码器(Decoder)构成。其中,编码器对应输入序列,负责将信息编码到上下文向量中;而解码器对应输出序列,响应生成上下文的输出序列。这类任务的一个典型例子是机器翻译,其中输入序列是源语言中的句子,输出序列是目标语言中的句子。
传统的做法是在编码器和解码器中都使用RNN。然而,第一个解码器层只能看到最终编码器步骤的隐藏状态。这就造成了一种“瓶颈”,因为解码器的第一步必须从最终隐藏状态中提取所有信息。
另一个核心思想是,self-attention允许并行化获取输入序列中tokens之间关系的过程。RNN固有地迫使过程一步一步地发生。例如,在RNN中,token的上下文可能只有在处理了整个序列之后才能完全理解。而有了注意力,所有的tokens都被一起处理,并且可以学习成对的关系。这就使得利用优化的训练设备(如GPUs和TPUs)变得更容易。
正如在上文所介绍的,BERT模型架构在几个NLU基准测试中击败了最先进的水平。BERT的网络架构使用的就是多层的Transformer结构,通过注意力机制有效的解决了NLP中棘手的长期依赖问题,更彻底的捕捉语句中的双向关系。当然,它也可以用作通用编码器,更好地处理其他任务。与之相类似的模型,如GPT家族也在许多NLU任务上得到了广泛的应用。
现有基础设施
在介绍完上述的四个重点领域(压缩技术、学习方法、自动化和高效架构)之后,本文将以对训练和部署高性能模型至关重要的基础设施简介作为结束。
为了能够有效地训练和运行推理,必须有强大的软件和硬件基础设施基础。
1、软件生态系统
(1)Tensorflow生态系统:
Tensorflow(TF)是一种流行的机器学习框架,已被许多大型企业用于实际的生产过程。它为模型效率提供了最广泛的软件支持。
TensorflowLiteforOn-DeviceUseCases:TensorflowLite(TFLite)是一组工具和库,旨在用于边缘设备等低资源环境中的推理。
TensorflowJS(TF.JS)是TF生态系统中的一个库,可用于在浏览器中或使用Node.js训练和运行神经网络。这些模型也可以通过WebGL接口通过GPU加速。它既支持导入在TF中训练的模型,也支持在TF.JS中从头开始创建新模型。还有TF模型优化工具包,它提供在模型图中添加量化、稀疏性、权重聚类等。
用于服务器端加速的XLA:XLA(加速线性代数)是一种图形编译器,它可以通过为图形定制的操作(内核)生成新的实现来优化模型中的线性代数计算。
(2)PyTorch生态系统:
PyTorch是学术界和工业界都在使用的另一个流行的机器学习平台,它在可用性和功能方面可以与Tensorflow相媲美。
设备上用例:PyTorch还具有一个轻量级解释器,可以在移动设备上运行PyTorch模型。PyTorch还提供训练后量化和其他图优化。
通用模型优化:PyTorch提供了即时(JIT)编译工具,用于从TorchScript中的代码生成模型的可序列化中间表示,TorchScript是Python的一个子集,并添加了类型等功能-检查。它帮助在用于研究和开发的灵活PyTorch代码与可部署用于生产推理的表示之间建立桥梁。这是在移动设备上执行PyTorch模型的主要方式。
PyTorch中,XLA的替代品是Glow和TensorComprehension编译器。它们有助于生成从更高级别的IR(如TorchScript)派生的较低级别的中间表示(IR)。
PyTorch还提供了一个模型调整指南,其中详细介绍了ML从业者可以使用的各种方法。其中的一些核心思想是:
丨使用PyTorchJIT融合逐点运算(加、减、乘、除等)。
丨启用缓冲区检查点允许仅将某些层的输出保留在内存中,并在向后传递期间计算其余层。这特别有助于廉价计算具有大输出(如激活)的层。
丨启用特定于设备的优化,例如cuDNN库和使用NVIDIAGPU的混合精度训练(在GPU小节中解释)。
丨TrainwithDistributedDataParallelTraining,适用于数据量大,有多个GPU进行训练的情况。
(3)硬件优化库
可以通过优化运行神经网络的硬件的软件堆栈来进一步提高效率。例如,ARM的Cortex系列处理器支持SIMD(单指令多数据)指令,该指令允许使用Neon指令集对操作(处理批量数据)进行矢量化。QNNPACK和XNNPACK库针对移动和嵌入式设备的ARMNeon以及x86SSE2、AVX架构等进行了优化。前者用于PyTorch的量化推理模式,后者支持32位浮点-点模型和TFLite的16位浮点。同样,还有其他低级库,如AccelerateforiOS和NNAPIforAndroid,它们试图从更高级别的ML框架中抽象出硬件级加速决策。
2、硬件
降低精度乘法累加(MAC)操作:BxC是一项昂贵的操作,因此它以降低的精度完成。
TensorCores优化了标准的乘法累加(MAC)操作,A=(B×C)+D。其中,B和C的精度降低(fp16、bfloat16、TensorFloat32),而A和D的精度为fp32.根据模型架构和所选GPU,NVIDIA报告称,通过这种降低精度的MAC操作,训练速度提高了1到15倍。
在GPU和TPU上训练和推理期间使用的数据类型。bfloat16起源于TPU,仅NVidiaGPU支持TensorFloat32。
TPU:TPU是专用集成电路(ASIC),由谷歌设计用于使用Tensorflow加速深度学习应用程序,并经过微调以并行化和加速线性代数运算。TPU架构支持使用TPU进行训练和推理,并可通过其GoogleCloud服务向公众开放。
TPU芯片的核心架构利用了SystolicArray设计,其中将大量计算拆分为网状拓扑,每个单元计算部分结果并将其按顺序传递给下一个单元,每个时钟-step(以类似于心脏收缩节律的有节奏方式),无需将中间结果存储在内存中。
每个TPU芯片有两个TensorCores,每个都有一个脉动阵列网格。一块TPU板上有4个相互连接的TPU芯片。为了进一步扩展训练和推理,可以在网状拓扑中连接更多数量的TPU板以形成“pod”。根据公开发布的数字,每个TPU芯片(v3)可以达到420teraflops,而一个TPUpod可以达到100+petaflops。TPU已在Google内部用于诸如Google搜索训练模型、通用BERT模型、DeepMind的AlphaGo和AlphaZero等应用。与GPU类似,TPU支持bfloat16数据类型,这是一种以全浮点32位精度训练的低精度替代方案。
EdgeTPU:
EdgeTPU也是谷歌设计的定制ASIC芯片。与TPU类似,它专门用于加速线性代数运算,但仅用于推理,并且在边缘设备上的计算预算要低得多。它进一步仅限于操作的子集,并且仅适用于int8量化TensorflowLite模型。EdgeTPU芯片本身比1美分硬币还小,因此适合部署在多种物联网设备中。它已部署在类似RaspberryPi的开发板中,在Pixel4智能手机中作为PixelNeuralCore,也可以独立焊接到PCB上。
JetsonNano模块
Jetson:Jetson是Nvidia的一系列加速器,用于为嵌入式和物联网设备启用深度学习应用程序。它包括Nano,这是一个为轻量级部署而设计的低功耗“模块系统”(SoM),以及更强大的Xavier和TX变体,它们基于NVidiaVolta和PascalGPU架构。Nano适用于家庭自动化等应用,其余适用于工业机器人等计算密集型应用。