AI推理加速原理解析与工程理论分享 | Q选举

21小时前 (01:21:46)阅读1回复0
丸子
丸子
  • 管理员
  • 注册排名9
  • 经验值112085
  • 级别管理员
  • 主题22417
  • 回复0
楼主

本文整理自同名线上分享,是 12 月份「百度百舸 - 云原生 AI」手艺公开课的第三期。

此次分享将端到端阐发 AI 推理过程以及痛点,介绍业界典型的推理加速构想和详细计划,并介绍百度智能云在那方面的一些理论功效。

本次分享我们将介绍若何加速 AI 推理过程。内容次要包罗四部门:

第一部门,端到端的阐发 AI 推理的过程以及那个过程中的痛点;

第二部门,我们将介绍业界典型的推理加速构想及详细计划;

第三部门,介绍百度百舸平台的 AI 推理加速套件 AIAK-Inference 的加速计划;

最初一部门,我们则将通过 demo 的体例,演示 AIAK-Inference 的利用体例及加速效果。

AI 推理的痛点

AI 推理是将用户输进的数据,通过操练好的模子产生有价值信息的过程。详细的是将操练好的 AI 模子摆设到供给算力的硬件上,并通过 等接口对外供给办事。

AI推理加速原理解析与工程理论分享 | Q保举

那个过程的参与者次要有 2 类人,一类是 AI 算法工程师,他们期看能将本身研发的模子高效的摆设到线上,并为模子最末的效果负责。别的一类人则是根底架构工程师,他们负责治理异构算力集群,并为集群的资本操纵效率负责。那两类人群的痛点别离如下:

对 AI 算法工程师来说,他们期看本身操练的复杂模子能够更快的供给办事。而关于根底架构工程师来说,他们则期看能够将价格高贵的 GPU 资本发扬出更好的效能。那两类问题都需要处理。

AI推理加速原理解析与工程理论分享 | Q保举

展开全文

假设我们从端到端的视角再来阐发下整个 AI 推理过程,会发现那两类用户的痛点目前没有得到很好的处理。

用户对 GPU 的利用初始于营业系统,用户根据营业需求搭建模子,并为最末模子的效果负责。

营业系统构建完成后,会从资本治理系统中申请资本,而资本治理器则会将 GPU 卡分配给营业系统,那个治理器只会为资本分配率负责,而不会关心资本分配后的营业利用效率。

用户在申请到资本后,会通过 AI 框架施行模子的计算过程。AI 框架更专注为用户供给易用的模子构建接口,而不会为营业的推理效率和资本操纵率负责。

最初 AI 框架在利用异构硬件算力时,只能利用根底的加速包或东西,而不会专门连系营业特征停止优化。总的来看,整个过程中没有专门的东西为 GPU 算力的操纵效率负责。

为此,我们需要 AI 推理加速,针对用户操练好的模子,停止针对性的加速,缩短营业推理时间,同时提拔资本操纵率。

AI推理加速原理解析与工程理论分享 | Q保举

推理加速的业界处理计划

为了系统性的阐发和停止推理加速计划,我们起首需要可以定义推理加速的优化目标。为此我们先简单回忆下 GPU 的硬件架构和施行形式。

从硬件上看,GPU 的强大算力来源于多 SM 处置器,每个 SM 中包罗多个 ALU 计算单位和专有的 Tensor Core 处置单位。对 GPU 来说,当所有 SM 上的所有计算单位都在停止计算时,我们认为其算力得到了足够的发扬。

AI推理加速原理解析与工程理论分享 | Q保举

GPU 无法本身独立工做,其工做使命仍是由 CPU 停止触发的。

整体的工做流程能够看做是 CPU 将需要施行的计算使命异步的交给 GPU,GPU 拿到使命后,会将 Kernel 调度到响应的 SM 上,而 SM 内部的线程则会根据使命的描述停止施行。当 CPU 不倡议新的使命时,则 GPU 的处置单位就处在闲暇形态。

AI推理加速原理解析与工程理论分享 | Q保举

通过那两个层面的阐发,我们晓得要想将 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 推理加速的牵引目标。

AI推理加速原理解析与工程理论分享 | Q保举

有了牵引目标,连系模子施行的流程,我们就能够在逻辑上将优化计划分为三类:

第一类优化是模子精简类,即在模子实正施行之前就对模子的计算量停止精简,从而提拔推理速度。那部门业界常见的优化标的目的包罗量化、减枝、蒸馏和 NAS 等;

第二类和第三类则是当模子已经交由推理引擎在 GPU 上施行时,若何更好的提拔 GPU 的操纵效率。

我们由 SM 操纵率公式做一个近似能够导出那两类优化计划,别离是尽可能让 GPU 上有计算使命和单个计算使命在 GPU 上施行效率更高。那两类优化计划常见的手段别离是算子合成和单算子优化。

AI推理加速原理解析与工程理论分享 | Q保举

接下来别离介绍那三类优化计划。

在模子精简上,凡是各人会摘用量化、减枝和蒸馏等手段。

简单来说,量化就是将模子中的计算类型停止压缩,从而降低计算量。常见的手段包罗离线量化和量化操练两类。

离线量化是指在模子操练完成后,离线的对计算算子停止量化,那种计划凡是易用性较好,对算法开发人员几乎通明,但对模子精度会有必然缺失;

量化操练则是在模子操练过程中就展现插进量化相关的操做,如许凡是会有更好的精度,但需要算法开发同窗预备相关数据。

AI推理加速原理解析与工程理论分享 | Q保举

而减枝则是通过将模子中对成果影响较小的一些计算停止移除,从而降低计算量。

AI推理加速原理解析与工程理论分享 | Q保举

蒸馏则凡是是将一个复杂的大模子通过降维的常识传递层,将大模子中的复杂计算,削减为效果相当的更小规模的计算,从而实现降低计算量,提拔推理效率的效果。下图中是百度文心 3.0 大模子常识蒸馏的过程。

那些模子精简的计划,因为涉及到对精度的影响,凡是需要算法工程师介进,协同优化。

AI推理加速原理解析与工程理论分享 | Q保举

第二类优化则是算子合成,算子合成望文生义是指将多个计算算子合并成一个大算子的过程。

例如关于 BERT Base 那个模子,颠末 PyTorch 原生 jit 编译生成的 Torch 图中有 800 多个小算子,那些小算子会带来 2 类问题:一是那些算子凡是施行过程较短,因而会形成大量的 GPU 闲暇时间;二是因为差别的使命之间还有数据的依靠,因而也会带来额外的访存开销。

AI推理加速原理解析与工程理论分享 | Q保举

目前针对算子合成,业界凡是会摘用手写或主动化生成的体例发现可合成的形式,并供给合成后的算子。例如针对 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 个摆布。

AI推理加速原理解析与工程理论分享 | Q保举

第三类优化则是单算子优化。单算子优化是根据单个算子,连系计算形式和硬件架构特征,调整 GPU 核函数的实现办法,从而提拔详细算子的施行效率。单算子优化中,最典范的例子就是对通用矩阵乘(GEMM)的优化。下图是 NVIDIA Cutlass 库对 GEMM 操做的笼统:

Cutlass 连系 GPU Global Memory、Shared Memory、Register File 那几层存储架构和 block、warp、thread 和 tensor core 那几层计算笼统,设想了一系列计算模板,并供给相关可优化参数(切分大小等),便利开发者开发高性能的 GEMM 实现。

以上就是业界常见的几类 AI 推理加速的办法和业界的一些处理计划。接下来我们重点介绍下 AIAK-Inference 是若何站在巨人的肩膀上,供给性能更好的推理加速计划。

AI推理加速原理解析与工程理论分享 | Q保举

AIAK-Inference 推理加速套件简介

AIAK-Inference 是百度智能云提出的 AI 推理加速套件,是百度百舸整体计划中的一部门。

AIAK-Inference 旨在优化在百度智能云上摘购的 GPU 等异构算力的推理效率,降低推理延迟,提拔推理吞吐。只要通过百度百舸计划供给的 GPU 算力,都能够利用 AIAK-Inference 停止推理加速。

AI推理加速原理解析与工程理论分享 | Q保举

AIAK-Inference 的整体架构如下图所示,整体分为 4 个条理,别离处理的问题如下:

图接进:处理多框架动态图 / 静态图捕获问题,将动态图转换为推理友好的静态图;

后端笼统:撑持将业界多种优化计划同一整合,通过计时的体例抉择更优的加速后端;

详细加速后端,撑持业界多种开源加速后端,包罗飞桨供给的 FastDeploy 等;此外还有一套自研加速后端,通过图优化、图转换和加速运行时三部门对模子停止整体的推理加速;

算子库:除了使能业界更优的常见计算算子库,还针对详细场景的重点计算形式停止定造化开发,供给场景加速的算子库。

AI推理加速原理解析与工程理论分享 | Q保举

与业界其他计划比拟,AIAK-Inference 次要有 2 大特征,第一个是博摘寡长,撑持多种优化后端的无缝接进,并通过计时选优的办法将效果最初的加速后端提赐与用户;第二则是深出场景,针对重点场景的计算形式,通过 AIAK-OP 算子库停止专有加速。

AIAK-Inference 的加速原理也类似第二节讨论的业界常见计划,次要从图精简、算子合成、算子优化几个层面展开

在图精简上,AIAK-Inference 除了兼容社区常见的量化、减枝、蒸馏、NAS 等计划,还供给一些数学等价代换、死代码移除等精度无算的图精简操做;

在算子合成上,AIAK-Inference 撑持访存密集型算子合成、GEMM/Conv 长尾运算合成和背靠背 GEMM 合成等多种合成战略;

而针对详细的单个算子,AIAK-Inference 则通过调度、访存、模板化优化等构想,实现了一系列高性能场景化算子。

AI推理加速原理解析与工程理论分享 | Q保举

详细举几个例子,关于单算子优化,我们通过 ncu 东西发现我们生成的 Conv 算子施行时有 20% 的访存指令浪费,通过将访存操做聚合,削减访存操做,最末模子端到端性能提拔 3%。

算子合成上,我们针对 NLP、CV 场景开发了响应的重点合成算子(如 FMHA、YoloBox 等),并在通用场景针对卷积 + 长尾操做生成了一系列合成算子。

AI推理加速原理解析与工程理论分享 | Q保举

除了那些之外,我们还紧跟社区生态,正在开发适配 PyTorch 2.0 编译生态的 Dynamo 编译 Backend;在算子生成方面,我们也开发了一套针对模板的主动化算子生成计划。

以上就是 AIAK-Inference 推理加速套件的整体介绍,我们接下来看看若何在百度智能云上利用推理加速套件。

AI推理加速原理解析与工程理论分享 | Q保举

利用 AIAK-Inference 推理加速套件

起首整体介绍下 AIAK-Inference 推理加速套件在 AI 推理流程中的位置。

如下图所示,AIAK-Inference 是通过优化推理模子停止推理加速的。详细的说,算法工程师本来停止模子摆设,是将 Torch/SavedModel 等操练好的模子通过 Inference Server 停止摆设。

而 AIAK-Inference 则是在摆设之前增加一个流程,通过开发一个核心只要 1 行代码的优化脚本,通过 aiak_inference.compile 优化接口,对 Torch/SavedModel 等模子停止优化,并返回优化后的模子。

用户能够将优化后的模子仍然摆设到 Inference Server 上,摆设无感的停止加速。总结下来就是优化代码离线化革新,营业摆设零代码侵略。

AI推理加速原理解析与工程理论分享 | Q保举

领会了整体利用体例后,我们来详细操做一下。起首为了利用 AIAK-Inference 推理加速套件,需要停止情况预备。AIAK-Inference 供给加速镜像和 wheel 包两种安拆办法,无论哪种计划,用户只需要下载对应的镜像或安拆 wheel 包,即可完成情况预备。

AI推理加速原理解析与工程理论分享 | Q保举

情况预备完成后,只需要开发适才演示的一个优化脚本,即可完成模子的优化。接下来以 ResNet50 模子为例,停止一个完全流程的演示。

AIAK Inference 操做演示视频

本次演示中利用了 2 个脚本,别离是 infer.py 和 optimize.py。此中 infer.py 是模仿用户摆设的脚本,简单看下代码能够看到,那个脚本次要是加载模子,停止 100 次预热操做,然后施行 1000 次推理,并在 CPU 侧完成计时。

AI推理加速原理解析与工程理论分享 | Q保举

简单施行那个脚本,能够看到 FP32 精度下,BS=1 的 ResNet50 在 T4 平台上,推理均匀延迟是 6.73ms。

接下来利用 AIAK-Inference 对模子停止优化。那里我们利用 optimize.py 脚本,其代码如下:

AI推理加速原理解析与工程理论分享 | Q保举

整体代码十分简单,加载模子,挪用 aiak_inference.optimize 接口停止优化,并将优化后的模子停止保留。那里为了演示我将优化后的模子保留成与优化前模子同名的模子。

有了优化后的模子,我们什么都不做改动,再次施行 infer.py(即模仿营业摆设代码零改动),能够看到模子推理耗时大幅降低,只需要 3.54ms。

从而能够看出利用 AIAK-Inference 能够通过简单的脚本对模子停止通明优化,优化后的模子在推理效率上有大幅提拔。

除了适才演示的单个模子,AIAK-Inference 还在多个模子上验证了效果。下表是 6 个典型 CV 类模子,能够看到推理延迟别离降低 40%~90%。

AI推理加速原理解析与工程理论分享 | Q保举

以上就是今天禀享的全数内容,谢谢各人。

转发自:百度智能云手艺站 公家号

0
回帖

AI推理加速原理解析与工程理论分享 | Q选举 期待您的回复!

取消
载入表情清单……
载入颜色清单……
插入网络图片

取消确定

图片上传中
编辑器信息
提示信息