AI推理加速原理解析与工程实践分享
本文整理自同名线上分享,是 12 月份「百度百舸 - 云原生 AI」技术公开课的第三期。
这次分享将端到端分析 AI 推理过程以及痛点,介绍业界典型的推理加速思路和具体方案,并介绍百度智能云在这方面的一些实践成果。
在上一期分享中我们介绍了关于 AI 训练加速的原理和实践,本次分享我们将介绍如何加速 AI 推理过程。内容主要包括四部分:
第一部分,端到端的分析 AI 推理的过程以及这个过程中的痛点;
第二部分,我们将介绍业界典型的推理加速思路及具体方案;
第三部分,介绍百度百舸平台的 AI 推理加速套件 AIAK-Inference 的加速方案;
最后一部分,我们则将通过 demo 的方式,演示 AIAK-Inference 的使用方式及加速效果。
一、AI推理的痛点
GEEK TALK
AI 推理是将用户输入的数据,通过训练好的模型产生有价值信息的过程。具体的是将训练好的 AI 模型部署到提供算力的硬件上,并通过 HTTP/RPC 等接口对外提供服务。
这个过程的参与者主要有两类人,一类是 AI 算法工程师,他们希望能将自己研发的模型高效的部署到线上,并为模型最终的效果负责。另外一类人则是基础架构工程师,他们负责管理异构算力集群,并为集群的资源利用效率负责。
这两类人群的痛点分别如下:
对 AI 算法工程师来说,他们希望自己训练的复杂模型可以更快的提供服务。而对于基础架构工程师来说,他们则希望可以将价格昂贵的 GPU 资源发挥出最好的效能。
如果我们从端到端的视角再来分析下整个 AI 推理过程,会发现这两类用户的痛点目前没有得到很好的解决。
用户对 GPU 的使用初始于业务系统,用户根据业务需求搭建模型,并为最终模型的效果负责。
业务系统构建完成后,会从资源管理系统中申请资源,而资源管理器则会将 GPU 卡分配给业务系统,这个管理器只会为资源分配率负责,而不会关心资源分配后的业务使用效率。
用户在申请到资源后,会通过 AI 框架执行模型的计算过程。AI 框架更专注为用户提供易用的模型构建接口,而不会为业务的推理效率和资源利用率负责。
最后 AI 框架在使用异构硬件算力时,只能使用基础的加速包或工具,而不会专门结合业务特点进行优化。总的来看,整个过程中没有专门的工具为 GPU 算力的利用效率负责。
为此,我们需要 AI 推理加速,针对用户训练好的模型进行针对性的加速,缩短业务推理时间,同时提升资源利用率。
二、推理加速的业界解决方案
GEEK TALK
为了系统性的分析和进行推理加速方案,我们首先需要能够定义推理加速的优化目标。为此我们先简单回顾下 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 上执行效率更高。这两类优化方案常见的手段分别是算子融合和单算子优化。
离线量化是指在模型训练完成后,离线的对计算算子进行量化,这种方案通常易用性较好,对算法开发人员几乎透明,但对模型精度会有一定损失; 量化训练则是在模型训练过程中就显示插入量化相关的操作,这样通常会有更好的精度,但需要算法开发同学准备相关数据。
三、AIAK-Inference推理加速套件简介
GEEK TALK
AIAK-Inference 是百度智能云提出的 AI 推理加速套件,是百度百舸整体方案中的一部分。
图接入:解决多框架动态图/静态图捕获问题,将动态图转换为推理友好的静态图; 后端抽象:支持将业界多种优化方案统一整合,通过计时的方式选择最优的加速后端; 具体加速后端,支持业界多种开源加速后端,包括飞桨提供的 FastDeploy 等;此外还有一套自研加速后端,通过图优化、图转换和加速运行时三部分对模型进行整体的推理加速; 算子库:除了使能业界最优的常见计算算子库,还针对具体场景的重点计算模式进行定制化开发,提供场景加速的算子库。
在图精简上,AIAK-Inference 除了兼容社区常见的量化、减枝、蒸馏、NAS 等方案,还提供一些数学等价代换、死代码移除等精度无算的图精简操作; 在算子融合上,AIAK-Inference 支持访存密集型算子融合、GEMM/Conv 长尾运算融合和背靠背 GEMM 融合等多种融合策略; 而针对具体的单个算子,AIAK-Inference 则通过调度、访存、模板化优化等思路,实现了一系列高性能场景化算子。
四、使用AIAK-Inference推理加速套餐
GEEK TALK