技术解读:英特尔x86平台上,AI能力是如何进行演进的? 作者  黄文欢   策划  凌敏  人工智能的发展为社会各个领域带来了无限可能,但这些应用都需要很强的计算性能和优化... 

人工智能的发展为社会各个领域带来了无限可能,但这些应用都需要很强的计算性能和优化来提供准确、及时的结果。人工智能模型复杂性的增长速度是飞速的,大约三年前,像ELMo这样的自然语言模型只有9400万个参数,而今年最大的模型达到了超过1万亿个参数。

AVX-512VNNI:主要用于卷积神经网络的快速乘法累加。

AVX-512BF16:用于更快计算的低精度BFloat16浮点数。

图2.利用基础AVX512vs.利用AVX512VNNI做向量乘加

BFloat16(BF16)主要思想是提供16位浮点格式,其动态范围与标准IEEE-FP32相同,但精度较FP32变低。相当于指数区和FP32保持了相同的8位,并将FP32分数字段的小数区缩减到到了7位。大多数情况下,用户在进行神经网络计算时,BF16格式与FP32一样准确,但是以一半的位数完成任务。因此,与32位相比,采用BF16吞吐量可以翻倍,内存需求可以减半。此外,fp32到bf16的转化,相对于fp32到fp16的转化更加简单。

图3.BFloat16数据类型介绍

部署生态系统

2.1深度神经网络库OneDNN

帮助开发人员创建高性能深度学习框架。

支持Linux、Windows和macOS。

该底层库围绕四个概念建立:

原语(Primitive):是一个封装了特定计算过程的函数对象,特定计算过程如前向卷积,LSTM反向计算等。可以通过原语的属性来控制原语表达更复杂的融合操作,例如前向卷积和ReLU的融合。这里需要注意的是创建原语是重量级操作,最好的方式是一次创建、重复使用。或者可以通过缓存具有相同参数的原语来减少原语创建成本。

引擎(Engine):是计算设备的抽象,包括CPU,特定GPU卡等。创建的大多数原语是在一个特定引擎上执行计算,引擎类似于异构计算的host和device概念的统一,是可执行计算的设备的抽象。

流(Stream):是绑定到特定引擎的执行上下文的封装。

内存对象(memory):封装了分配给特定引擎的内存句柄、tensor的维度、数据类型、数据排布等信息。内存对象在执行期间被传递给原语进行处理。可以通过内存描述符(memory::desc)创建内存对象。

图4.OneDNN关系图

优势:

支持关键数据类型:float32、float16、bfloat16和int8。

实现了丰富的操作:convolution,matrixmultiplication,pooling,batchnormalization,activationfunctions,recurrentneuralnetwork(RNN)cells,andlongshort-termmemory(LSTM)cells。

2.2优化深度学习框架:TensorFlow,PyTorch

深度学习框架通过高级编程接口为数据科学家、AI开发人员和研究人员提供模块,以构建、训练、验证和部署模型。

1)在算子优化部分,将默认的(Eigen)内核替换为(使用oneDNN)高度优化的内核,OneDNN优化了一系列TensorFlow操作。OneDNN库是开源的,在构建TensorFlow时自动下载。

算子融合

算子融合是一个常见的性能优化方法,在融合之前,每个算子计算前后都需要把数据从内存读到缓存,再从缓存写回到内存。而融合之后,可以避免算子之间内存读写从而提高性能。

图5.算子融合

所以在做算子融合的时候本质上便是把多个Tensor整合到一个Node下。虽然只是简单的算子融合,但是在计算过程中可以提高速度。

布局传播

在布局传播方面,数据布局是会很大程度影响性能的,因此,我们需要做到:

顺序访问;尽可能在最内层的循环中进行迭代,提高向量利用率;尽可能的重用数据,例如卷积层中的权重。

通常,对于CPU上的某些张量操作,原生TensorFlow数据格式并不是最有效的数据布局。对于TensorFlow中的tensor,所有OneDNN中的算子使用都是高度优化的数据布局。在这种情况下,我们插入一个从TensorFlow原生格式到内部格式的数据布局转换操作,在CPU上执行操作,并将操作输出转换回TensorFlow原生格式。需要注意的是我们应该避免冗余的转化开销。而这些转换会带来性能开销,因此带来的挑战在于如何避免不必要的转换。所以,我们应该采用布局传播方式,布局传播就是用于识别出相邻的互逆reorder,并消除它们,从而减少了无效的操作。也就是最右边的这张图中的结构。

图6.布局传播

查找子图,这个子图中所有算子都有OneDNN支持

在这样的子图的边界上,引入数据布局转换

IPEX可以作为Python程序中的模块进行加载,也可以作为C++程序的C++库链接。用户可以通过导入intel_extension_for_pytorch在脚本中动态启用这些优化。

优化扩展包IPEX中所包含的优化有:

图优化:IPEX支持常用的算子融合,如Conv2D+ReLU,Linear+ReLU等。算子融合带来的好处以透明的方式传递给用户。IPEX支持FP32和BF16融合模式,以及INT8融合模式。

Runtime优化:为用户提供了多个PyTorch前端API,以便对线程运行时进行更细粒度的控制。

通过Python前端模块MultiStreamModule进行多流推理。

从Python和C++前端生成异步任务。

从Python和C++前端为OpenMP线程配置核心绑定。

2.3优化工具INC

图8.INC基础架构图

可以看到,这个工具支持自动的精度驱动的调优策略,帮助用户快速找到最佳量化模型。这些调优策略包括贝叶斯/MSE/TPE…

对于量化部分,模型量化主要是通过降低模型中tensor和weights精度的手段,从而减少计算需求和数据存储与传输需求,来达到加速的目的。主要方法分两派:一是训练后量化(Post-trainingQuantization),二是量化感知训练(Quantization-AwareTraining)。

INC工具支持

训练后静态量化(Post-trainingStaticQuatization)

训练后动态量化(PosttrainingdynamicQuatization)

量化感知训练(Quantization-awaretraining)

对于剪枝部分,深度学习网络模型从卷积层到全连接层存在着大量冗余的参数,大量神经元激活值趋近于0,将这些神经元去除后可以表现出同样的模型表达能力,这种情况被称为过参数化,而对应的技术则被称为模型剪枝。INC中采用多种剪枝算法,如非结构化剪枝(Magnitude-based基于幅度剪枝),结构化剪枝(Gradientsensitivity梯度敏感剪枝),生成具有预定义稀疏性目标的剪枝模型。

以在TensorFlow上的使用举例,用户模型可以是savedmodel、ckpt、pb各种形式,通过INC工具运行后,得到一个优化后的模型,依然为之前的用户模型格式,可以在Tensorflow上使用,相较于原始模型来说获得更好的性能效果。

图9.INC性能表现

这是在150+个业内常用的模型,使用INC工作后的评估结果。这些模型涉及各个领域,包括图像分类中常用的ResNet、GoogLeNet、Inception,目标检测中常用的Mobilenet、Yolo、FasterRCNN,推荐中常用的Wide&deep、DLRM,自然语言处理中常用的bert等。这张图展现的是int8相对于fp32的性能结果比较。横轴为相应的精度改变,纵轴为Int8与fp32相比在实时latency的提升。可以看到几何平均提升达到2.3倍。

3.1性能优化方法

在推理的性能优化方面,工作可归成四类:算子优化、图优化、模型压缩和部署优化。

算子优化:算子优化中微架构优化的主要焦点是如何充分利用好微架构的内置加速器的能力去最大化算子的性能。OneDNN底层库就可以帮大家很好的做这部分的优化。

模型压缩:如果还需要额外的性能增益,这时候需要考虑模型压缩方案。模型压缩(Compression)主要手段有:模型量化、剪枝和模型蒸馏。工程师们也可以通过刚刚介绍的INC压缩工具来便捷的使用到这些压缩方案。

部署优化:主要通过调整模型在部署时的资源分配和调度的参数来进一步优化性能。

在TensorFlow中,“前端”负责图描述,“后端”负责算子的执行。因此,我们可以将模型从原始BERT模型转换为前端带有BERTop的新模型,并将新的BERT内核实现注册到后端。因此,我们不需要重新安装TensorFlow框架。我们只需要加载实现BERT代码的动态库即可,并通过oneAPI深度神经网络库(oneDNN)等高性能工具,来提升性能。

图10.BERT模型优化方案

对于优化实现,我们分析BERT图进行层融合和张量融合。这张图显示了12层BERT中的一层细节。

在这个案例中,又可以进行横向融合和纵向融合。关于横向融合,我们可以看到三个张量,即查询query、键key和值value,都需要进行MatMul和BiasAdd操作。我们可以把这些操作融合为一个操作,即QKVMatMul和BiasAdd。关于纵向融合,可以参照下图。

图11.新BERT模型实现

为了减少内存访问,我们将FP32权重转换为BF16权重,像下图中右边的图结构所示。我们将FP32权重转换为BF16权重并将BF16权重缓存在BF16MatMulop中以供重用,并在每次执行时并行的将FP32输入转换为BF16输入。

图12.BFloat16优化方案

在这样的转化下,我们可以使用bfloat16的点积计算MatMulop,可以看到输入为BF16类型,输出为fp32类型。这些实现是利用了oneDNN的支持。因此,我们只需要创建一个新的BF16MatMulop来替换优化的FP32解决方案(Baseline)MatMulop,然后我们就可以实现BF16与FP32优化相比带来的性能提升。

对于BF16优化方案,通过简单的运算替换来提高性能,可以保持尽可能高的精度。对于BiasAdd操作,我们仍然保持FP32操作,以减少精度损失。

最后是一个优化后方案的性能和进度评估结果,为了比较优化后的FP32Bert和优化后的BF16Bert的性能差异,我们将batchsize设为1,tokensize设为128,这也符合实际的线上业务。输入是MRPC数据集。以延时为21.70毫秒的FP32解决方案为基准,可以看到优化的BF16解决方案与基线相比,延迟为11.83毫秒,端到端的性能提升达到了1.83倍,并且没有Accuracy的损失。

THE END
1.模拟试题第六套及答案解析新浪教育23.北京农业大学的教授在河北省推广柿树剪枝技术时,为了说服当地的群众,教授把一块柿树园一劈为二,除自然条件相同外,其他的条件包括施肥、灭虫、浇水、除草等也都相同,其中的一块柿树剪枝,而另一块不剪枝。到收获季节,剪枝的一块柿子的产量比不剪枝的多三成以上。这下农民信服了,先进的剪枝技术很快地推广开来。 https://edu.sina.com.cn/exam/2006-10-08/140856290.html
2.(六)从零开始学人工智能搜索:对抗搜索在这里,我们借用剪枝技术消除搜索树的很大一部分,应用到一棵标准的极小极大值树上,它剪裁掉那些不可能影响最后决策的分支,仍然可以返回和极小极大值算法同样的结果。 我们先来理解一下,怎么样的搜索是没有必要的,假设我们限定了搜索深度为3,我们从头开始搜索,如下: ...https://www.jianshu.com/p/f48e0191c2ee
3.说法错误的是:()A.αα-β剪枝使用到了宽度优先算法 B. Alpha Go问世,将深度学习、价值网络、蒙特卡洛树搜索技术融合,战胜人类顶尖棋手 C. α-β剪枝在很长一段时间里都是棋类算法的代表,取得一系列成就 D. 蒙特卡洛树搜索”方式,以“信心上限决策”打分,使计算机围棋能力得到质的提升。为后续方法奠定基础 点击查看答案进入小程序搜...https://m.ppkao.com/wangke/daan/97f2a2f807b043468e1bcd845afd67aa
1.深度学习中的剪枝算法以及具体应用嘲稀疏剪枝深度学习中的剪枝(Pruning)算法是一种通过减少神经网络中不重要或冗余部分来提升计算效率和减少模型尺寸的技术。剪枝不仅可以提高模型的推理速度,还能降低内存占用,特别是在资源受限的环境中,如移动设备或嵌入式设备。剪枝的核心思想是“去除”对模型输出影响较小的参数(如权重、神经元等),从而优化网络结构。 https://blog.csdn.net/m0_45276337/article/details/143588383
2.剪枝java是啥意思什么是剪枝算法小鱼儿的技术博客剪枝优化 剪枝算法概述 基本概念: 在搜索算法中优化中,剪枝,就是通过某种判断,避免一些不必要的遍历过程,形象的说,就是剪去了搜索树中的某些“枝条”,故称剪枝。应用剪枝优化的核心问题是设计剪枝判断方法,即确定哪些枝条应当舍弃,哪些枝条应当保留的方法。 https://blog.51cto.com/u_12205/11088448
3.一年两茬茄子是怎么种出来的?2018~2020年种什么品种好?掌握这些...剪枝再生技术夏季高温季节,正值露地茄子大量上市,大棚越冬茄子开始出现生长不良、产量降低、品质不佳,市场价格快速下跌。按照“预防为主,综合防治”的植保方针,坚持以“农业防 茄子是餐桌上比较常见的一种蔬菜,因营养价值高且价格便宜而被广泛食用,目前大部分地区都有种植,而在种植的区域中,大部分地区都是一年一茬,...https://nync.guiyang.gov.cn/xwdt/kjzc/202002/t20200220_50327638.html
4.葡萄树冬季怎么整形修剪?葡萄冬季修剪技术要点介绍葡萄冬季修剪技术要点介绍 导读:到了冬天,种植葡萄的果农们就要开始准备为自家的葡萄整形修剪以及葡萄冬季的合理施肥。葡萄树的冬季管理是葡萄生产的一个重要环节,此间应重点做好整形修剪,清园杀菌,深翻、施肥与冬灌和防寒等项工作。 到了冬天,种植葡萄的果农们就要开始准备为自家的葡萄整形修剪以及葡萄冬季的合理施肥...https://m.cnhnb.com/xt/article-43441.html
5.GPT4大模型硬核解读,看完成半个专家第二种模型压缩方法是剪枝(pruning),即删除GPT-4的网络元素,包括从单个权重(非结构化剪枝)到更高粒度的组件如权重矩阵的通道。这种方法在视觉和较小规模的语言模型中有效,也是很多框架(Framework)上自带的功能。 第三种模型压缩方法是稀疏化。例如奥地利科学技术研究所(ISTA)提出的SparseGPT可以将GPT系列模型单次剪枝...https://m.36kr.com/p/2196628560234373
6.人工智能经典习题集及各章总结(期末考试必备)江阴雨辰互联第二阶段(50年代中~60年代中) 通用方法时代 第三阶段(60年代中~80年代初) 知识工程时代 第四阶段(80年代中~90年代初) 新的神经元网络时代 第五阶段(90年代初~现在) 海量信息处理与网络时代 2.人工智能研究的基本内容是什么? 解:基本内容是:搜索技术、知识表示、规划方法、机器学习、认知科学、自然语言理解...https://www.yc00.com/xiaochengxu/1690506190a360936.html
7.目标检测究竟发展到了什么程度?CVHub带你聊一聊目标检测发展的...目标检测的发展脉络可以划分为两个周期:传统目标检测算法时期(1998年-2014年)和基于深度学习的目标检测算法时期(2014年-至今)。而基于深度学习的目标检测算法又发展成了两条技术路线:Anchor based方法(一阶段,二阶段)和Anchor free方法。下图2-1展示了从2001年至2021年目标检测领域中,目标检测发展路线图。 https://cloud.tencent.com/developer/article/1842152
8.关于植树节植树的作文(通用63篇)爸爸对我说:“首先必须掌握剪枝技术。”“那,什么是剪枝技术?”“剪枝技术就是树苗在栽培之前,要先根据树苗的大小,枝丫的多少进行修剪。把多余的细枝都剪去,这样就能减少树苗对营养的需求,便于生根发芽。来,把这几根剪了,就可以了。”“哦,我知道啦。”我拿起剪刀,按照爸爸指示剪下了几根没有用处的枝丫。就...https://www.ruiwen.com/zuowen/zhishujie/4363043.html