当前位置: 首页 > Linux

技术解读:AI能力在Intelx86平台上如何进化?(附PPT)

时间:2023-04-06 12:08:52 Linux

AI算力的指数级增长,意味着即使是1000倍的计算性能提升也可以轻松消耗掉,以解决日益复杂的用例。因此,需要通过软件生态系统的辅助来实现更好的性能。我们认为,构建人工智能软件生态系统是将人工智能和数据科学项目投入生产的关键。本文编译自龙蜥大讲堂技术直播第四期,龙蜥社区AISIG核心成员、IntelAI软件开发工程师黄文欢分享——用技术和实例讲解关键英特尔x86平台人工智能能力的演进。以下为龙力讲座技术直播回顾:人工智能的发展给社会各个领域带来了无限可能,但这些应用需要强大的计算性能和优化才能提供准确及时的结果。人工智能模型复杂性的增长率一直在飞速增长。大约三年前,像ELMo这样的自然语言模型只有9400万个参数,而今年最大的模型达到了超过1万亿个参数。1、Intelx86平台AI能力演进自Skylake以来,Intel将AVX的能力从AVX256升级到AVX512,能力翻倍,大大提升了深度学习训练和推理能力。一年后,CascadeLake引入了DLBoostVNNI,大大提高了INT8乘加吞吐量。自CooperLake以来,Intel在DLBoost指令集中加入了BFloat16(BF16),以进一步提升深度学习训练和推理性能。硬件总是在向前发展,AMX自SapphireRapids推出以来,将进一步提升VNNI和BF16从1D-vector到2D-matrix的能力。英特尔可扩展处理器通过英特尔DeepLearningBoost(英特尔?DLBoost)将嵌入式AI性能提升到一个新的水平。Intel的DeepLearningBoost(DLBoost)是x86-64上指令集架构功能的名称,旨在提高深度学习任务(例如训练和推理)的性能。DLBoost包括两套关键技术:AVX-512VNNI:主要用于卷积神经网络的快速乘法累加。AVX-512BF16:用于更快计算的低精度BFloat16浮点数。图1.Intelx86平台AI能力演进Intel?DLBoost–VNNIIntel深度学习加速包括AVX512VNNI,VNNI全称是vectorneuralnetworkinstruction,是标准Intel指令集AVX512的扩展。AVX512VNNI旨在加速基于卷积神经网络的算法。AVX512通过引入4条新指令来加速内部卷积神经网络循环。AVX512VNNI扩展背后的主要动机是观察到许多紧密循环需要重复将两个16位值或两个8位值相乘并将结果累加到32位累加器中。图2.使用基本AVX512与使用AVX512VNNI进行向量乘法和加法深度学习的核心计算可以简化为乘法和加法运算。在VNNI之前,我们需要使用基本AVX-512执行如图1中的向量乘加,对于16位,这可以使用两条指令VPMADDWD来实现,用于将两个16位对相乘并将它们相加,并且然后将VPADDD添加到累加值。使用基础AVX512需要3条指令,而VNNI可以在1个周期内完成。通过将三个指令融合为一个,可以最大化计算资源,提高缓存利用率并避免潜在的带宽瓶颈。因此,从这个意义上说,与非VNNI相比,VNNI将为INT8带来3倍的峰值计算提升。另外,由于一个AVX512寄存器可以容纳比FP32多4倍的INT8数据,因此比FP32能带来4倍的峰值计算提升。Intel?DLBoost–BFloat16BFloat16(BF16)的主要思想是提供一种16位浮点格式,其动态范围与标准IEEE-FP32相同,但精度低于FP32。相当于指数区和FP32保持相同的8位,而FP32分数域的小数区减少为7位。大多数时候,用户在进行神经网络计算时会发现BF16格式与FP32一样准确,但位数减少一半。因此,与32位相比,BF16的吞吐量可以翻倍,内存需求可以减半。另外,fp32到bf16的转换比fp32到fp16的转换更简单。图3.BFloat16数据类型简介英特尔?深度学习加速技术包括以下BFloat16指令:2.英特尔人工智能软件开发和部署生态系统随着人工智能应用在视觉、语音和推荐系统方面不断增长和多样化,英特尔的目标是它旨在提供一个卓越的AI开发和部署生态系统,让每个开发人员、数据科学家、研究人员和数据工程师尽可能无缝地使用它,以加速他们从边缘到云端的AI之旅。对于所有的软硬件优化和模型量化算法,我们都需要了解它们才能更好地利用它们。为了让每个用户都能轻松访问这些优化,英特尔提供了一个自上而下的全栈人工智能软件系统。对于不同需求的工程师,都可以在英特尔人工智能软件生态系统中找到合适的应用。对于想要开发自己的高性能应用或库的深度开发者,可以直接调用相关指令。对于想要摆脱框架开销的框架开发人员或AI工程师,可以直接使用OneDNN。对于已经有TensorFlow/PyTorch等AI框架训练模型的,Intel已经将大部分补丁上传开源,直接使用即可享受性能,或者进一步使用Intel对这些框架的扩展优化。对于那些想要追求更多推理特定优化的人,可以使用INC工具库。2.1深度神经网络库OneDNNOneDNN是一个开源、跨平台、高性能的库,包含深度学习应用程序的基本构建块。oneDNN基于英特尔平台,对深度神经网络进行运算级和指令集级优化。帮助开发人员创建高性能深度学习框架与Intelcpus和gpus相同的API,使用最好的技术来完成工作支持Linux、Windows和macOS底层库围绕四个概念构建:1.Primitives:它是一个函数对象封装了具体的计算过程,如前向卷积、LSTM逆向计算等。图元可以通过其属性控制来表达更复杂的融合操作,如前向卷积和ReLU的融合。这里需要注意的是,创建图元是一个重量级的操作,最好的方式是创建一次,重复使用。或者可以通过缓存具有相同参数的图元来降低图元创建成本。2.引擎:是计算设备的抽象,包括CPU、具体的GPU卡等,创建的原语大多是在具体的引擎上进行计算。引擎类似于异构计算的主机和设备概念的统一,是对可以执行计算的设备的抽象。3.流(Stream):是对特定引擎绑定的执行上下文的封装。4.内存对象(memory):封装了分配给特定引擎的内存句柄、张量的维度、数据类型、数据排列等信息。内存对象被传递给原语以在执行期间进行处理。可以通过内存描述符(memory::desc)创建内存对象。图4.OneDNN关系图优点:支持关键数据类型:float32、float16、bfloat16和int8实现丰富的操作:卷积、矩阵乘法、池化、批量归一化、激活函数、循环神经网络(RNN)单元和长短期记忆(LSTM)单元支持硬件指令的自动检测,提高神经网络在指定硬件上的执行速度,尤其是IntelCPU和GPU。2.2优化深度学习框架:TensorFlow、PyTorch深度学习框架通过高级编程接口为数据科学家、AI开发人员和研究人员提供构建、训练、验证和部署模型的模块。英特尔通过oneDNN库进行的软件优化为数个流行的深度学习框架带来了数量级的性能提升,并且大多数优化已上传到默认框架分发版中。但是,对于TensorFlow和PyTorch,我们还维护单独的英特尔扩展作为尚未上传的优化缓冲区。2.2.1Intel?OptimizationforTensorFlow*Intel对TensorFlow的优化主要包括以下三个方面:1)在operator优化部分,将默认(Eigen)kernel替换为高度优化的kernel(使用oneDNN),OneDNN优化A序列TensorFlow操作。OneDNN库是开源的,在构建TensorFlow时会自动下载。2)在图优化方面,图优化主要希望在不影响模型数值特性的情况下,通过图的变换来简化计算、资源开销、提升性能,因此是性能优化的首选方法之一。在英特尔?OptimizationforTensorFlow*中完成的图形优化包括运算符融合和布局传播。算子融合算子融合是一种常见的性能优化方法。在融合之前,每个算子在计算前后都需要从内存中读取数据到缓存中,再从缓存中将数据写回内存中。融合后可以避免算子之间的内存读写,提高性能。图5.Operatorfusion所以在做operatorfusion的时候,本质上就是把多个Tensor整合到一个Node上。虽然只是简单的算子融合,但是在计算过程中可以提高速度。布局传播在布局传播方面,数据布局会极大地影响性能。因此,我们需要做的是:顺序访问尽可能在最内层循环迭代,尽可能提高向量利用率和重用数据,例如WeightsinConvolutionalLayers通常,原生的TensorFlow数据格式并不是最高效的数据布局用于CPU上的某些张量运算。对于TensorFlow中的张量,OneDNN中的所有运算符都使用高度优化的数据布局。在这种情况下,我们插入一个从TensorFlow原生格式到内部格式的数据布局转换操作,在CPU上执行该操作,并将操作输出转换回TensorFlow原生格式。请注意,我们应该避免冗余的转换开销。这些转换会产生性能开销,因此面临的挑战是如何避免不必要的转换。因此,我们应该采用布局传播的方法,用于识别相邻的重新排序并消除它们,从而减少无效操作。那就是最右边图片中的结构。图6.布局传播在布局传播方面,英特尔?OptimizationforTensorFlow*中所做的优化是寻找子图。OneDNN支持此子图中的所有运算符。在此类子图的边界上引入了数据布局转换。3)在系统级优化方面,包括负载均衡和内存分配。对于负载均衡,我们知道线程模型参数设置不当会导致性能问题。因此,您可以参考TensorFLow中的相关文档,为模型正确设置参数。对于内存分配,TensorFlow中的神经网络算子会分配大量内存。但是TensoeFlow中默认的CPU分配器并不能很好的处理这种情况:频繁的alloc/dealloc会带来频繁的mmap/munmap。池分配器在英特尔?OptimizationforTensorFlow*中实施以解决此问题。2.2.2Intel?OptimizationforPyTorch*我们已将大部分优化上传到PyTorch社区版本,同时还保留了单独的Intel?PyTorch扩展包(Intel?ExtensionforPyTorch*(IPEX))作为上游Abuffer这些优化。图7.Intel?ExtensionforPyTorch*IPEX与Intel硬件上的社区版pytorch相比具有额外的性能提升。大多数优化最终将包含在社区PyTorch版本中,扩展包的目的是为英特尔硬件上的PyTorch带来最新的功能和优化,包括AVX512(VNNI)和英特尔?AMX。IPEX可以作为模块加载到Python程序中,也可以作为C++库链接到C++程序中。用户可以通过导入intel_extension_for_pytorch在他们的脚本中动态启用这些优化。优化扩展包IPEX包含的优化有:算子优化:为了提升性能,IPEX对算子进行了优化,实现了多个自定义算子。(通过ATen注册机制,一些ATen运算符被英特尔?ExtensionforPyTorch*中的优化版本所取代。)一些自定义运算符也针对几种流行的拓扑结构实施。比如MaskR-CNN中的ROIAlign和NMS。图优化:IPEX支持常用的算子融合,如Conv2D+ReLU、Linear+ReLU等,将算子融合的好处透明传递给用户。IPEX支持FP32和BF16融合模式,以及INT8融合模式运行时优化:为用户提供多种PyTorch前端API,用于更细粒度地控制线程运行时。它通过Python前端模块MultiStreamModule提供多流推理。从Python和C++前端生成异步任务。从Python和C++前端为OpenMP线程配置核心绑定。2.3优化工具INCINC称为Intel?NeuralCompressor。上的一个开源Python库,它为流行的网络压缩技术(如量化、剪枝和知识蒸馏)提供跨多个深度学习框架的统一接口。图8.INC基础架构图。可以看出,该工具支持自动精准驱动调优策略,帮助用户快速找到最佳量化模型。这些调优策略包括Bayesian/MSE/TPE……对于量化部分,模型量化主要是降低模型中张量和权重的精度,从而降低计算需求和数据存储和传输需求,达到加速的目的。主要有两种方法:一种是Post-trainingQuantization,另一种是Quantization-AwareTraining。INC工具支持训练后静态量化、训练后动态量化和量化感知训练。对于剪枝部分,深度学习网络模型从卷积层到全连接层存在大量冗余参数,大量神经元的激活值趋于0,去除这些神经元后,同一个模型表达能力得以体现。这种情况称为过参数化,对应的技术称为Prunethemodel。INC中使用了多种剪枝算法,如非结构化剪枝(Magnitude-basedpruning)、结构化剪枝(Gradientsensitivitygradient-sensitivepruning),生成具有预定义稀疏度目标的剪枝模型。同时,INC还支持知识蒸馏。模型蒸馏采用迁移学习的方法。它通过使用预训练的复杂模型(教师模型)的输出作为监督信号来训练另一个简单的网络(学生模型),最后使用学生模型进行推理。以在TensorFlow上的使用为例,用户模型可以有savedmodel、ckpt、pb等多种形式。通过INC工具运行后,得到一个优化后的模型,还是之前的用户模型格式,可以在Tensorflow上使用。获得比原始模型更好的性能结果。图9.INCPerformance这是在业界常用的150+个模型中使用INC工作后的评估结果。这些模型涉及各个领域,包括图像分类常用的ResNet、GoogLeNet、Inception、目标检测常用的Mobilenet、Yolo、FasterRCNN、Wide&deep、推荐常用的DLRM、自然语言处理常用的bert等。这张图显示int8与fp32相比的性能结果。横轴是对应的精度变化,纵轴是Int8相对于fp32的实时延迟提升。可以看出,几何平均提升达到了2.3倍。3.性能优化方法和案例分享3.1性能优化方法在推理性能优化方面,工作可以分为四类:算子优化、图优化、模型压缩和部署优化。算子优化:微架构优化在算子优化中的主要关注点是如何充分利用微架构内置的加速器能力来最大化算子性能。OneDNN底层库可以很好的帮你做好这部分的优化。图优化:主要通过子图变换和算子融合来减少计算量或其他系统开销(如内存访问开销),从而达到性能优化的目的。图优化主要希望在不影响模型数值特性的情况下,通过图变换来简化计算、资源开销、提升性能,因此是性能优化的首选方法之一。Intel对深度学习框架tensroflow、pytorch的优化包括这些图优化。模型压缩:如果需要额外的性能提升,则需要考虑模型压缩方案。模型压缩的主要手段有:模型量化、剪枝和模型蒸馏。工程师们也可以通过刚刚介绍的INC压缩工具轻松使用这些压缩方案。部署优化:主要是通过在部署过程中调整模型的资源分配和调度参数,进一步优化性能。3.2案例分享:Bfloat16优化提升阿里云BERT模型在第三代英特尔至强可扩展处理器上的性能BERT模型是自然语言处理中常用的模型。阿里云团队与英特尔工程师紧密合作,优化BERT推理性能。接下来,我们将逐步介绍我们是如何进行这些优化的。首先,在原始数据类型即fp32的情况下,我们首先使用“模型转换”将多层多操作复杂的BERT模型替换为单个BERT操作。为了在TensorFlow上实现高效的BERT操作,我们需要创建一个优化的内核,从而产生一个新的自定义BERT操作符。这是一个带有运算符融合和优化的实现。在TensorFlow中,“前端”负责图描述,“后端”负责算子执行。因此,我们可以将模型从原始的BERT模型转换为前端带有BERTops的新模型,并将新的BERT内核实现注册到后端。因此,我们不需要重新安装TensorFlow框架。我们只需要加载实现BERT代码的动态库,使用oneAPI深度神经网络库(oneDNN)等高性能工具来提升性能。图10.BERT模型优化方案对于优化实现,我们分析了层融合和张量融合的BERT图。此图显示了12层BERT中的一层细节。在这种情况下,可以再次进行水平融合和垂直融合。关于水平融合,我们可以看到三个张量,即query查询、keykey和valuevalue,都需要进行MatMul和BiasAdd操作。我们可以将这些操作合并为一个操作,即QKVMatMul和BiasAdd。垂直整合可以参考下图。图11.新的BERT模型实现接下来,当我们分析优化后的FP32BERT模型时,我们注意到推理过程中超过80%的运行时间花在了MatMul运算上。如何优化MatMul操作以减少延迟已成为最紧迫的挑战之一。我们都知道减少内存访问、优化缓存、增加并行度可以优化程序性能。随着第三代英特尔至强可扩展处理器的推出,使用最先推出的英特尔DLBoost的bfloat16指令,理论上可以将BF16的点积比FP32的点积加速2倍。英特尔?深度学习加速技术包括以下BFloat16指令:为了减少内存访问,我们将FP32权重转换为BF16权重,如下图右侧的图形结构所示。我们将FP32权重转换为BF16权重,并在BF16MatMul运算中缓存BF16权重以供重用,并在每次执行时将FP32输入并行转换为BF16输入。图12.BFloat16优化方案在这样的转换下,我们可以使用bfloat16的点积来计算MatMul运算,我们可以看到输入是BF16类型,输出是fp32类型。这些实现利用了oneDNN的支持。因此,我们只需要创建一个新的BF16MatMulop来替换优化后的FP32解(Baseline)MatMulop,就可以实现BF16相比FP32优化带来的性能提升。对于BF16优化方案,通过简单的运算代入来提升性能,可以保持尽可能高的精度。对于BiasAdd操作,我们仍然保持FP32操作以减少精度损失。最后是优化方案的性能和进度评估结果。为了比较优化后的FP32Bert和优化后的BF16Bert的性能差异,我们将batchsize设置为1,tokensize设置为128,这也符合业务上的实际情况。输入是MRPC数据集。以时延21.70毫秒的FP32方案为基准,可以看出优化后的BF16方案与baseline相比时延11.83毫秒,端到端性能提升1.83倍,无损失的准确性。关注本次直播视频回放已在龙蜥社区官网(首页-社区-视频)上线,直播PPT获取方式:关注龙蜥社区公众号,后台回复【龙蜥】课件]或[龙蜥视频回放]就是这样。相关链接地址:[1]DragonLizard社区AISIG地址:https://openanolis.cn/sig/AI_SIG[2]BERT模型更详细的性能描述内容链接:https://www.intel.com/content。..【3】oneDNN开源地址:https://github.com/oneapi-src...【4】IPEX开源地址:https://github.com/intel/inte...【5】INC开源地址:https://github.com/intel/neur...——完——加入龙蜥社区加入微信群:添加社区小助手-龙百合社区小龙(微信:openanolis_assis),注意【龙Lilis]你和我们在一起;加入钉钉群:扫描下方钉钉群二维码。欢迎开发者/用户加入OpenAnolis社区(OpenAnolis)进行交流,共同推动OpenAnolis社区的发展,共同打造活跃健康的开源操作系统生态!关于龙蜥社区龙蜥社区(OpenAnolis)是由企事业单位、高等院校、科研单位、非营利组织、个人在自愿、平等的基础上组成的非营利性开源社区。开源和协作。DragonLizard社区成立于2020年9月,旨在打造一个开源、中立、开放的Linux上游发行社区和创新平台。Anolis社区成立的短期目标是开发Anolis操作系统(AnolisOS)作为CentOS停摆的解决方案,并构建与国际主流Linux厂商兼容的社区发行版。中长期目标是探索打造面向未来的操作系统,建立统一的开源操作系统生态,孵化创新开源项目,繁荣开源生态。目前DragonLizardOS8.4已经发布,支持X86_64、Arm64、LoongArch架构,完美适配Intel、飞腾、海光、兆芯、鲲鹏、龙芯等芯片,提供全栈国密支持。欢迎下载:https://openanolis.cn/download加入我们,共同打造面向未来的开源操作系统!https://openanolis.cn