本文整理自同名线上分享,是 12 月份「百度百舸 - 云原生 AI」手艺公开课的第三期。
此次分享将端到端阐发 AI 推理过程以及痛点,介绍业界典型的推理加速构想和详细计划,并介绍百度智能云在那方面的一些理论功效。
本次分享我们将介绍若何加速 AI 推理过程。内容次要包罗四部门:
第一部门,端到端的阐发 AI 推理的过程以及那个过程中的痛点;
第二部门,我们将介绍业界典型的推理加速构想及详细计划;
第三部门,介绍百度百舸平台的 AI 推理加速套件 AIAK-Inference 的加速计划;
最初一部门,我们则将通过 demo 的体例,演示 AIAK-Inference 的利用体例及加速效果。
AI 推理的痛点
AI 推理是将用户输进的数据,通过操练好的模子产生有价值信息的过程。详细的是将操练好的 AI 模子摆设到供给算力的硬件上,并通过 等接口对外供给办事。
那个过程的参与者次要有 2 类人,一类是 AI 算法工程师,他们期看能将本身研发的模子高效的摆设到线上,并为模子最末的效果负责。别的一类人则是根底架构工程师,他们负责治理异构算力集群,并为集群的资本操纵效率负责。那两类人群的痛点别离如下:
对 AI 算法工程师来说,他们期看本身操练的复杂模子能够更快的供给办事。而关于根底架构工程师来说,他们则期看能够将价格高贵的 GPU 资本发扬出更好的效能。那两类问题都需要处理。
展开全文
假设我们从端到端的视角再来阐发下整个 AI 推理过程,会发现那两类用户的痛点目前没有得到很好的处理。
用户对 GPU 的利用初始于营业系统,用户根据营业需求搭建模子,并为最末模子的效果负责。
营业系统构建完成后,会从资本治理系统中申请资本,而资本治理器则会将 GPU 卡分配给营业系统,那个治理器只会为资本分配率负责,而不会关心资本分配后的营业利用效率。
用户在申请到资本后,会通过 AI 框架施行模子的计算过程。AI 框架更专注为用户供给易用的模子构建接口,而不会为营业的推理效率和资本操纵率负责。
最初 AI 框架在利用异构硬件算力时,只能利用根底的加速包或东西,而不会专门连系营业特征停止优化。总的来看,整个过程中没有专门的东西为 GPU 算力的操纵效率负责。
为此,我们需要 AI 推理加速,针对用户操练好的模子,停止针对性的加速,缩短营业推理时间,同时提拔资本操纵率。
推理加速的业界处理计划
为了系统性的阐发和停止推理加速计划,我们起首需要可以定义推理加速的优化目标。为此我们先简单回忆下 GPU 的硬件架构和施行形式。
从硬件上看,GPU 的强大算力来源于多 SM 处置器,每个 SM 中包罗多个 ALU 计算单位和专有的 Tensor Core 处置单位。对 GPU 来说,当所有 SM 上的所有计算单位都在停止计算时,我们认为其算力得到了足够的发扬。
GPU 无法本身独立工做,其工做使命仍是由 CPU 停止触发的。
整体的工做流程能够看做是 CPU 将需要施行的计算使命异步的交给 GPU,GPU 拿到使命后,会将 Kernel 调度到响应的 SM 上,而 SM 内部的线程则会根据使命的描述停止施行。当 CPU 不倡议新的使命时,则 GPU 的处置单位就处在闲暇形态。
通过那两个层面的阐发,我们晓得要想将 GPU 的算力足够发扬,其核心就是连结 GPU 上有使命,同时对单个 GPU 计算使命,使其能够尽量足够的用好 SM 处置器。
针对那两个层面的利用情状,NVIDIA 供给了响应的牵引目标 GPU 操纵率和 SM 操纵率:GPU 操纵率被定义为在摘样间隔内,GPU 上有使命在施行的时间。而 SM 操纵率则被定义为在摘样间隔内,每个 SM 有 warp 活泼时间的均匀值。
我们能够通过 2 个 case 来比力下那两个目标的差别。鄙人图的 case 1 中,因为 CPU 异步发射使命到 GPU 上,GPU 很快就处置完了,于是就呈现了期待下一个使命的空隙。在那种情状下,根据定义,GPU 操纵率比力低,SM 操纵率也相对较低。两个目标都能反响那种情状没有足够操纵 GPU 资本。
针对下图的第二个 case,关于某一个 Kernel 来说,因为计算实现、参数设置装备摆设等一系列问题,它只利用了 1 个 SM 处置器,而剩下的 3 个 SM 处置器(假设只要 4 个 SM 处置器)闲暇。
关于那种情状,因为 GPU 上有 Kernel 在施行,在那个时间段内 GPU 操纵率仍然是 100%,但 SM 操纵率只要 25%。能够看到那种场景下,SM 操纵率能够反响计算使命效率不高的问题,而 GPU 操纵率则无法反响此类问题。
因而我们认为 SM 操纵率能够更精巧的反响 GPU 算力发扬情状。 因而我们把 SM 操纵率当做 AI 推理加速的牵引目标。
有了牵引目标,连系模子施行的流程,我们就能够在逻辑上将优化计划分为三类:
第一类优化是模子精简类,即在模子实正施行之前就对模子的计算量停止精简,从而提拔推理速度。那部门业界常见的优化标的目的包罗量化、减枝、蒸馏和 NAS 等;
第二类和第三类则是当模子已经交由推理引擎在 GPU 上施行时,若何更好的提拔 GPU 的操纵效率。
我们由 SM 操纵率公式做一个近似能够导出那两类优化计划,别离是尽可能让 GPU 上有计算使命和单个计算使命在 GPU 上施行效率更高。那两类优化计划常见的手段别离是算子合成和单算子优化。
接下来别离介绍那三类优化计划。
在模子精简上,凡是各人会摘用量化、减枝和蒸馏等手段。
简单来说,量化就是将模子中的计算类型停止压缩,从而降低计算量。常见的手段包罗离线量化和量化操练两类。
离线量化是指在模子操练完成后,离线的对计算算子停止量化,那种计划凡是易用性较好,对算法开发人员几乎通明,但对模子精度会有必然缺失;
量化操练则是在模子操练过程中就展现插进量化相关的操做,如许凡是会有更好的精度,但需要算法开发同窗预备相关数据。
而减枝则是通过将模子中对成果影响较小的一些计算停止移除,从而降低计算量。
蒸馏则凡是是将一个复杂的大模子通过降维的常识传递层,将大模子中的复杂计算,削减为效果相当的更小规模的计算,从而实现降低计算量,提拔推理效率的效果。下图中是百度文心 3.0 大模子常识蒸馏的过程。
那些模子精简的计划,因为涉及到对精度的影响,凡是需要算法工程师介进,协同优化。
第二类优化则是算子合成,算子合成望文生义是指将多个计算算子合并成一个大算子的过程。
例如关于 BERT Base 那个模子,颠末 PyTorch 原生 jit 编译生成的 Torch 图中有 800 多个小算子,那些小算子会带来 2 类问题:一是那些算子凡是施行过程较短,因而会形成大量的 GPU 闲暇时间;二是因为差别的使命之间还有数据的依靠,因而也会带来额外的访存开销。
目前针对算子合成,业界凡是会摘用手写或主动化生成的体例发现可合成的形式,并供给合成后的算子。例如针对 Transformer 构造,NVIDIA 开发了 FasterTransformer 那个库,此中包罗针对多种 Transformer 类构造模子的详细合成算子。
例如下图中,针对 batch GEMM Q x K、Softmax、batch GEMM for QK x V 和长尾的 transpose 等操做,FasterTransformer 供给 Fused Multi-head Attention 等合成后算子。BERT Base 在颠末 FasterTransformer 的算子合成优化后,数量能够降到 100 个摆布。
第三类优化则是单算子优化。单算子优化是根据单个算子,连系计算形式和硬件架构特征,调整 GPU 核函数的实现办法,从而提拔详细算子的施行效率。单算子优化中,最典范的例子就是对通用矩阵乘(GEMM)的优化。下图是 NVIDIA Cutlass 库对 GEMM 操做的笼统:
Cutlass 连系 GPU Global Memory、Shared Memory、Register File 那几层存储架构和 block、warp、thread 和 tensor core 那几层计算笼统,设想了一系列计算模板,并供给相关可优化参数(切分大小等),便利开发者开发高性能的 GEMM 实现。
以上就是业界常见的几类 AI 推理加速的办法和业界的一些处理计划。接下来我们重点介绍下 AIAK-Inference 是若何站在巨人的肩膀上,供给性能更好的推理加速计划。
AIAK-Inference 推理加速套件简介
AIAK-Inference 是百度智能云提出的 AI 推理加速套件,是百度百舸整体计划中的一部门。
AIAK-Inference 旨在优化在百度智能云上摘购的 GPU 等异构算力的推理效率,降低推理延迟,提拔推理吞吐。只要通过百度百舸计划供给的 GPU 算力,都能够利用 AIAK-Inference 停止推理加速。
AIAK-Inference 的整体架构如下图所示,整体分为 4 个条理,别离处理的问题如下:
图接进:处理多框架动态图 / 静态图捕获问题,将动态图转换为推理友好的静态图;
后端笼统:撑持将业界多种优化计划同一整合,通过计时的体例抉择更优的加速后端;
详细加速后端,撑持业界多种开源加速后端,包罗飞桨供给的 FastDeploy 等;此外还有一套自研加速后端,通过图优化、图转换和加速运行时三部门对模子停止整体的推理加速;
算子库:除了使能业界更优的常见计算算子库,还针对详细场景的重点计算形式停止定造化开发,供给场景加速的算子库。
与业界其他计划比拟,AIAK-Inference 次要有 2 大特征,第一个是博摘寡长,撑持多种优化后端的无缝接进,并通过计时选优的办法将效果最初的加速后端提赐与用户;第二则是深出场景,针对重点场景的计算形式,通过 AIAK-OP 算子库停止专有加速。
AIAK-Inference 的加速原理也类似第二节讨论的业界常见计划,次要从图精简、算子合成、算子优化几个层面展开
在图精简上,AIAK-Inference 除了兼容社区常见的量化、减枝、蒸馏、NAS 等计划,还供给一些数学等价代换、死代码移除等精度无算的图精简操做;
在算子合成上,AIAK-Inference 撑持访存密集型算子合成、GEMM/Conv 长尾运算合成和背靠背 GEMM 合成等多种合成战略;
而针对详细的单个算子,AIAK-Inference 则通过调度、访存、模板化优化等构想,实现了一系列高性能场景化算子。
详细举几个例子,关于单算子优化,我们通过 ncu 东西发现我们生成的 Conv 算子施行时有 20% 的访存指令浪费,通过将访存操做聚合,削减访存操做,最末模子端到端性能提拔 3%。
算子合成上,我们针对 NLP、CV 场景开发了响应的重点合成算子(如 FMHA、YoloBox 等),并在通用场景针对卷积 + 长尾操做生成了一系列合成算子。
除了那些之外,我们还紧跟社区生态,正在开发适配 PyTorch 2.0 编译生态的 Dynamo 编译 Backend;在算子生成方面,我们也开发了一套针对模板的主动化算子生成计划。
以上就是 AIAK-Inference 推理加速套件的整体介绍,我们接下来看看若何在百度智能云上利用推理加速套件。
利用 AIAK-Inference 推理加速套件
起首整体介绍下 AIAK-Inference 推理加速套件在 AI 推理流程中的位置。
如下图所示,AIAK-Inference 是通过优化推理模子停止推理加速的。详细的说,算法工程师本来停止模子摆设,是将 Torch/SavedModel 等操练好的模子通过 Inference Server 停止摆设。
而 AIAK-Inference 则是在摆设之前增加一个流程,通过开发一个核心只要 1 行代码的优化脚本,通过 aiak_inference.compile 优化接口,对 Torch/SavedModel 等模子停止优化,并返回优化后的模子。
用户能够将优化后的模子仍然摆设到 Inference Server 上,摆设无感的停止加速。总结下来就是优化代码离线化革新,营业摆设零代码侵略。
领会了整体利用体例后,我们来详细操做一下。起首为了利用 AIAK-Inference 推理加速套件,需要停止情况预备。AIAK-Inference 供给加速镜像和 wheel 包两种安拆办法,无论哪种计划,用户只需要下载对应的镜像或安拆 wheel 包,即可完成情况预备。
情况预备完成后,只需要开发适才演示的一个优化脚本,即可完成模子的优化。接下来以 ResNet50 模子为例,停止一个完全流程的演示。
AIAK Inference 操做演示视频
本次演示中利用了 2 个脚本,别离是 infer.py 和 optimize.py。此中 infer.py 是模仿用户摆设的脚本,简单看下代码能够看到,那个脚本次要是加载模子,停止 100 次预热操做,然后施行 1000 次推理,并在 CPU 侧完成计时。
简单施行那个脚本,能够看到 FP32 精度下,BS=1 的 ResNet50 在 T4 平台上,推理均匀延迟是 6.73ms。
接下来利用 AIAK-Inference 对模子停止优化。那里我们利用 optimize.py 脚本,其代码如下:
整体代码十分简单,加载模子,挪用 aiak_inference.optimize 接口停止优化,并将优化后的模子停止保留。那里为了演示我将优化后的模子保留成与优化前模子同名的模子。
有了优化后的模子,我们什么都不做改动,再次施行 infer.py(即模仿营业摆设代码零改动),能够看到模子推理耗时大幅降低,只需要 3.54ms。
从而能够看出利用 AIAK-Inference 能够通过简单的脚本对模子停止通明优化,优化后的模子在推理效率上有大幅提拔。
除了适才演示的单个模子,AIAK-Inference 还在多个模子上验证了效果。下表是 6 个典型 CV 类模子,能够看到推理延迟别离降低 40%~90%。
以上就是今天禀享的全数内容,谢谢各人。
转发自:百度智能云手艺站 公家号