指南深度学习在自然语言处理等领域已广泛应用于实际业务场景,其推理性能优化成为部署过程中的重要一环。推理性能的提升:一方面可以充分利用部署硬件的能力,减少用户响应时间,节约成本;另一方面,可以使用更复杂的深度学习模型,同时保持响应时间不变。从而提高业务准确度指标。本文针对地址标准化服务中的深度学习模型进行推理性能优化工作。通过高性能算子、量化、编译优化等优化手段,在不降低准确率指标的情况下,AI模型的端到端推理速度最高可提升4.11倍。1.模型推理性能优化方法模型推理性能优化是AI服务部署的重要组成部分。一方面可以提高模型推理的效率,充分释放硬件的性能。另一方面可以让业务在保持推理时延不变的情况下采用更复杂的模型,从而提高准确率指标。然而,实际场景中的推理性能优化遇到了一些困难。1.1优化自然语言处理场景的难点在典型的自然语言处理(NLP)任务中,递归神经网络(RNN)和BERT[7](BidirectionalEncoderRepresentationsfromTransformers.)是两类使用更高模型结构的。为了便于实现弹性伸缩机制和高性价比的在线服务部署,自然语言处理任务通常部署在x86CPU平台上,如Intel?Xeon?处理器。但随着业务场景的复杂化,对业务的推理计算性能要求也越来越高。以上述RNN和BERT模型为例,将它们部署在CPU平台上的性能挑战如下:链式循环神经网络中的序列和所有节点(循环单元)。实际使用中常见的RNN包括LSTM、GRU和一些衍生变体。在计算过程中,如下图所示,RNN结构中每个后续的输出都依赖于对应的输入和之前的输出。因此,RNN可以完成序列类型的任务,近年来在NLP乃至计算机视觉中得到了广泛的应用。与BERT相比,RNN计算量少,模型参数共享,但其计算时序依赖性导致无法对序列进行并行计算。RNN结构示意图BERTBERT[7]证明其可以在具有深度网络结构的大数据集上完成无监督预训练(UnsupervisedPre-training),然后提供模型进行微调(finetune)具体任务。它不仅提高了这些特定任务的准确率性能,还简化了训练过程。BERT模型结构简单,易于扩展。通过简单地加深和加宽网络,与RNN结构相比可以获得更好的精度。另一方面,精度的提高是以更大的计算开销为代价的。BERT模型中有大量的矩阵乘法运算,这对CPU是一个巨大的挑战。BERT模型结构示意图1.2模型推理优化策略基于以上推理性能挑战的分析,我们认为软件栈层面的模型推理优化主要包括以下策略:模型压缩:特定场景下的高性能计算包括量化、稀疏和剪枝Sub-AI编译器优化量化模型。量化是指将浮点激活值或权重(通常用32位浮点数表示)近似为低位整数(16位或8位),然后在低位表示中完成计算。过程。一般来说,模型量化可以压缩模型参数,从而减少模型存储开销;通过减少内存访问,有效利用低位计算指令(如英特尔?深度学习升压矢量神经网络指令,VNNI),可以提高推理速度。给定一个浮点值,我们可以通过以下公式将其映射为低位值:其中和是通过量化算法得到的。基于此,以Gemm运算为例,假设有一个浮点运算过程:我们可以在低位域完成相应的计算过程:深度学习框架中的高性能算子,在为了保持通用性,同时兼顾各种过程(如Training),算子的推理开销存在冗余。当模型结构确定后,算子的推理过程只是原来全过程的一个子集。因此,当模型结构确定后,我们可以实现高性能的推理算子,替换原有模型中的通用算子,从而达到提高推理速度的目的。在CPU上实现高性能运算符的关键是减少内存访问并使用更高效的指令集。在原始算子的计算过程中,一方面存在大量的中间变量,这些变量会对内存进行大量的读写操作,从而减慢推理速度。针对这种情况,我们可以修改它的计算逻辑,减少中间变量的开销;另一方面,我们可以直接调用向量化指令集来加速运算符内部的一些计算步骤,例如Intel?Xeon?处理器上的高效AVX512指令集。AICompilerOptimization随着深度学习领域的发展,模型的结构和部署的硬件都呈现出多样化的趋势。在将模型部署到各个硬件平台时,我们通常会调用各个硬件厂商引入的runtime。在实际业务场景中,这可能会遇到一些挑战,例如:模型结构和算子类型的迭代速度会高于厂商runtime,导致部分模型无法基于厂商runtime快速部署。这时候就需要依赖厂商更新,或者使用插件等机制来实现缺失的算子。业务可能包含多个模型,这些模型可能由多个深度学习框架训练,模型可能需要部署在多个硬件平台上。这时候就需要将这些不同格式的模型转换成各个硬件平台需要的格式。同时,需要考虑各种推理框架的不同实现所带来的模型精度和性能变化,尤其是对量化等数值差异的敏感度较高。方法。AI编译器就是为解决上述问题而提出的,它抽象出多个层次来解决上述部分问题。首先,它接受各个前端框架的模型计算图作为输入,通过各种Converter变换生成统一的中间表示。随后,将运算符融合和循环展开等图形优化过程应用于中间表示,以提高推理性能。最后,AI编译器会根据优化后的计算图,针对特定的硬件平台进行codegen,生成可执行代码。在这个过程中,会引入stitch和shapeconstraint等优化策略。AI编译器具有良好的健壮性、适应性和易用性,可以收获显着的优化收益。本文由阿里云机器学习平台PAI团队、英特尔数据中心软件团队、英特尔人工智能与分析团队、达摩院NLP地址标准化团队共同实现了高性能推理优化方案解决地址标准化服务的推理性能挑战。.2、地址标准化介绍公安政务、电商物流、能源(水、电、油)、运营商、新零售、金融、医疗等行业在业务过程中往往会涉及到大量的地址数据开发,而这些数据往往没有形成标准的结构规范,存在地址缺失、一处多名等问题。随着数字化升级,城市地址不规范问题更加突出。地址应用存在的问题地址净化[2](AddressPurification)是阿里达摩院NLP团队依托阿里云海量地址语料和超强NLP算法实力沉淀的高性能、高精度标准地址算法。地址标准化产品从标准化地址数据、建立统一的标准地址库的角度,提供高性能的地址算法。地址标准化的优势地址算法服务可以自动对地址数据进行标准化处理,有效解决地址数据不规范、人工管理费时费力、重复建设地址数据库等问题。提供地址为企业、政府机构、开发者提供数据清洗和地址标准化能力,让地址数据更好地支撑业务。地址标准化产品具有以下特点:准确率高:拥有海量的地址语料和超强的NLP算法技术,并持续迭代优化,地址算法准确率高,性能超强:积累了丰富的项目构建经验丰富,承载稳定全面的海量数据服务:提供20余种地址服务,满足不同业务场景需求灵活部署:支持公有云、混合云、私有化部署。本次优化的模块属于地址标准化中的搜索模块。地址搜索是指与用户输入的地址文本相关的信息。基于地址数据库和搜索引擎,对用户输入的地址文本进行搜索关联,返回相关的兴趣点(POI)信息。地址查询功能不仅可以提升用户数据处理体验,还可以作为经纬度查询、门址标准化、地址归一化等多种地址下游服务的基础,在地址查询中发挥着关键作用。完整的地址服务体系。地址服务搜索系统示意图具体来说,本次优化的模型是基于多任务地理预训练语言模型基础产生的多任务向量召回模型和精细排序模型。基于MaskedLanguageModel(MLM)任务,多任务地理预训练语言模型库结合了相关兴趣点的分类和地址元素(省、市、区、POI等)的识别,以及通过元学习(MetaLearning),自适应调整多个任务的采样概率,将通用地址知识融入语言模型。多任务地址预训练模型base示意图多任务向量recall模型基于上述base的训练,包括四个任务:双塔相似度、Geohash(地址编码)预测,分词,以及TermWeighting(词权重)。以多任务向量召回模型示意图为计算地址相似度匹配的核心模块,精化排序模型基于上述基础,引入海量点击数据和标签数据训练[3],并通过模型蒸馏技术,改进提高了模型的效率[4]。最后的重新排序是使用应用于召回模型的地址基础文档完成的。基于以上过程训练的4层单模型在CCKS2021中文NLP地址关联任务[5]上可以取得比12层基线模型更好的效果(详见性能演示部分)。精细化模型示意图3.模型推理优化方案阿里云机器学习平台PAI团队推出的Blade产品,支持上述所有优化方案,提供统一的用户界面,拥有高性能计算等多种软件后端Son,IntelCustomBackend,BladeDISC等Blade模型推理优化架构图3.1BladeBlade是阿里云机器学习PAI团队(人工智能平台)推出的通用推理优化工具,可以对模型进行优化,使推理性能达到最优通过模型系统的联合优化。将计算图优化、Intel?oneDNN等厂商优化库、BladeDISC编译优化、Blade高性能算子库、CostomBackend、Blade混合精度等多种优化手段有机融合。同时,简单的使用方式降低了模型优化的门槛,提升了用户体验和生产效率。PAI-Blade支持多种输入格式,包括Tensorflowpb、PyTorchtorchscript等。对于要优化的模型,PAI-Blade会对其进行分析,然后应用各种可能的优化方法,从各种优化结果中选择加速效果最明显的作为最终的优化结果。Blade优化图为了在保证部署成功率的前提下获得最大的优化效果,PAI-Blade采用“圆图”的方式进行优化,即需要优化的子计算图可以推理出将后端/高性能算子支持的部分转换为对应的优化子图;无法优化的子图回退到对应的原生框架(TF/Torch)执行。Blade圆图BladeCompression是Blade推出的一款面向模型压缩的工具包,旨在协助开发者进行高效的模型压缩优化。它包括多种模型压缩功能,包括量化、剪枝、稀疏化等,压缩后的模型可以很容易地通过Blade进一步优化,获得模型系统组合的极致优化。在量化方面,BladeCompression:提供简洁的用户界面。通过调用几个简单的API,即可完成量化图修改、校准(calibration)、量化感知训练(Quantization-awareTraining,QAT)、量化模型导出等步骤。提供多种后端支持。通过config文件的配置,可以完成针对不同设备、不同后端的量化过程。在实际生产操作中融合PAI-Blade团队自主研发的多种算法,获得更高的量化精度。同时,我们提供了丰富的原子能力API,方便针对特定情况进行定制化开发。Blade压缩示意图BladeDISC是阿里云机器学习平台PAI团队推出的一款面向机器学习场景的动态形态深度学习编译器,是Blade的后端之一。支持主流的前端框架(TensorFlow、PyTorch)和后端硬件(CPU、GPU),也支持推理和训练优化。BladeDISC架构图3.2基于Intel?Xeon?的高性能算子神经网络模型中的子网络通常具有长期的通用性和普适性,例如PyTorch中的LinearLayer和RecurrentLayers,它们是模型的基本模块构建并负责特定的功能,通过这些模块的不同组合可以得到各种模型,而这些模块也是AI编译器重点优化的目标。据此,为了获得性能最好的基础模块,从而实现性能最好的模型,英特尔针对X86架构对这些基础模块进行了多层次的优化,包括启用高效的AVX512指令、算子内部计算调度等。和Fusion、缓存优化、并行优化等。在地址标准化服务中,经常出现循环神经网络(RNN)模型,而RNN模型中对性能影响最大的模块是LSTM或GRU模块。本章以LSTM为例,展示当输入为变长和多batch时,如何实现LSTM的极致性能优化。通常,为了满足不同用户的需求和请求,追求高性能和低成本的云服务会对不同的用户请求进行批处理,以最大限度地利用计算资源。如下图,一共嵌入了3个句子,内容和输入长度都不一样。为了使LSTM对原始输入数据的计算更加高效,需要使用PyTorch的pack_padded_sequence()函数对批量输入进行填充和排序。如下图所示,一个padding数据张量,一个描述数据张量batchsize的张量,一个描述数据张量的原始序号张量。原始输入数据至此,LSTM的输入已经准备好了。LSTM的计算过程如下图所示。批量计算输入张量,跳过零值计算。LSTM对于输入计算的计算步骤更加深入。LSTM的计算优化如下图17所示。计算公式中的矩阵乘法部分,并在公式之间进行融合。如下图所示,将原来的4次矩阵乘法转换为1次矩阵乘法,使用AVX512指令进行数值计算和多线程并行优化,实现高效的LSTM算子。其中,数值计算是指矩阵乘法和后续的逐元素元素运算。对于矩阵乘法部分,本方案使用oneDNN库进行计算。该库具有高效的AVX512GEMM实现。对于elementwise元素操作,本方案采用AVX512指令集进行算子融合,提高了数据在缓存中的命中率。LSTM计算融合[8]3.3推理后端CustomBackendIntel自定义后端[9],作为Blade的软件后端,强力加速模型量化和稀疏推理性能,主要包括三个层次的优化。首先,使用PrimitiveCache策略优化内存。其次,进行图融合优化。最后,在算子层面,实现了一个包含稀疏和量化算子的高效算子库。IntelCustomBackendArchitectureDiagram低精度量化、稀疏化、量化等高速算子受益于Intel?DLBoost加速指令集,如VNNI指令集。VNNI指令介绍上图为VNNI指令。使用三个AVX512BW指令可以加速8位。VPMADDUBSW先将两对8bits组成的数组相乘并相加得到16bits的数据。VPMADDWD将相邻数据相加得到32bitsData,最后VPADDD加上一个常数,这三个函数可以组成一个AVX512_VNNI,这条指令可以用来加速推理中的矩阵乘法。除了图融合,CustomBackend还提供了图融合。比如矩阵乘法后,不是输出一个中间状态的临时Tensor,而是直接运行后面的指令,即后面一项的postop与前面的operator融合。减少数据移动以减少运行时间。下图就是一个例子。红框中的算子融合后,可以消除额外的数据移动,形成新的算子。图FusionMemoryOptimization内存分配和释放会与操作系统通信,导致运行时延迟增加。为了减少这部分开销,CustomBackend增加了PrimitiveCache的设计,用于缓存创建的Primitive,使得Primitive不能被系统回收,减少下次调用的创建开销。同时对耗时的算子建立缓存机制,加速算子的运行,如下图:访问量大大减少。从而大大提高了性能。4.整体性能展示我们在地址搜索服务中选取了两种典型的模型结构来验证上述优化方案的效果。测试环境如下:服务器型号:阿里云ecs.g7.large,2个vCPU测试CPU型号:Intel?Xeon?Platinum8369BCPU@2.70GHz测试CPU核心数:1vCPUPyTorch版本:1.9.0+cpuonnx版本:1.11.0onnxruntimeversion:1.11.14.1ESIMESIM[6]是专为自然语言推理设计的LSTM增强版,其推理开销主要来自模型中的LSTM结构。Blade使用英特尔数据中心软件团队开发的高性能通用LSTM算子对其进行加速,替代了PyTorch模块中默认的LSTM(Baseline)。本次测试的ESIM包含两个LSTM结构。单算子优化前后的表现如表所示:LSTMstructureinputshapeoptimizationbeforeRToptimizationAfterRToptimizationLSTM-A7x2000.199ms0.066ms+3.02x202x2000.914ms0.307ms+2.98xLSTM-B70x500.266ms0.098ms+2.71x202x500.804ms0.209ms+3.85xLSTM单算子优化推理性能优化前后ESIM端到端推理速度如表所示,优化前后模型准确率保持不变。模型结构ESIM[6]ESIM[6]+Blade算子优化加速比RT6.3ms3.4ms+1.85xESIM优化前后模型推理性能4.2BERTBERT[7]近年来在自然语言处理(NLP)、计算机视觉(CV)等领域被广泛采用。Blade对该结构有编译优化(FP32)、量化(INT8)等多种方法。在速度测试中,测试数据的shape固定为10x53,各种后端和各种优化方式的速度表现如下表所示。可以看出,经过blade编译优化或INT8量化后的模型推理速度优于libtorch和onnxruntime,推理后端为IntelCustomBackend&BladeDisc。值得注意的是,量化加速后的4层BERT速度是2层BERT的1.5倍,这意味着在提速的同时,业务可以使用更大的模型来获得更好的业务精度。在地址BERT推理性能展示精度方面,我们基于CCKS2021中文NLP地址关联任务[5]展示了相关模型的性能,如下表所示。达摩院地址组自研的4层BERT的macroF1准确率高于标准的12层BERT-base。Blade编译优化可以做到无损精度,BladeCompression量化训练后真实量化模型的精度略高于原始浮点模型。模型结构宏F1(越高越好)12-layerBERT-base77.24address-4-layerBERT78.72(+1.48)address-4-layerBERT+Blade编译优化78.72(+1.48)address-4-layerBERT+Blade量化78.85(+1.61)解决BERT相关精度结果
