本文首先介绍下AI推理引擎在AI系统中的位置,顺便带大家回忆下AI系统的框架知识。
最早介绍AI算法:AI系统-2AI算法介绍 的时候提到到训练和推理两个过程:
- 训练(training)可以类比成在学校中学习。神经网络和大多数人一样,为了完成一项工作,需要接受教育。教育学习的内容就是数据集,学习的方法就是算法,经过反复的各种花样的学习,最后形成在大脑中的经验知识就是模型。
- 推理(Inference)就是利用训练好的模型,对一个新的数据进行处理,输出智能的结果。例如图片识别、对话等,属于实战应用。
首先带大家找下推理引擎在AI系统中的位置,其他的同理:
上图是AI系统,其中有AI训练推理框架,如下图:
红色箭头指向的就是AI推理引擎,其是基于AI编译器做的工作,AI推理引擎里面是运行时,里面又包含了AI调度器,如下图:
AI Runtime也只是在运行时来组织AI任务,而这些Task在编译的时候就确定了,会在NPU运算的时候体现。上图中的Stream和Task是推理引擎的工作,下面的Block是调度器的工作。可以参考文章:# AI系统-30从NPU调度器到AI推理引擎
AI推理引擎负责将中间表达形式的模型转换为可执行的指令序列,并将其部署到目标设备上执行。执行引擎不仅仅涉及模型的加载与执行两个基本步骤,还深入涵盖了多种策略和技术,以优化资源利用、提升运行效率,确保在多样化的硬件平台上都能实现高性能表现。
1. 推理系统介绍
1.1 训练和推理流程介绍
训练过程通过设定数据处理方式,并设计合适的网络模型结构以及损失函数和优化算法,在此基础上将数据集以小批量(mini-batch)反复进行前向计算并计算损失,然后反向计算梯度利用特定的优化函数来更新模型,来使得损失函数达到最优的结果。训练过程最重要的就是梯度的计算和反向传播。
而推理就是在训练好的模型结构和参数基础上,做一次前向传播得到模型输出的过程。相对于训练而言,推理不涉及梯度和损失优化。推理的最终目标是将训练好的模型部署生产环境中。真正让 AI 能够运用起来。推理引擎可以将神经网络模型部署到云(Cloud)端或者边缘(Edge)端,并服务用户的请求。模型训练过程好比是传统软件工程中的代码开发的过程,而开发完的代码势必要打包,部署给用户使用,那么推理系统就负责应对模型部署的生命周期中遇到的挑战和问题。
当推理系统将完成训练的模型进行部署,并在服务时还需要考虑设计和提供负载均衡,请求调度,加速优化,多副本和生命周期管理等支持。相比 AI 框架等为训练而设计的系统,推理系统不仅关注低延迟,高吞吐,可靠性等设计目标,同时受到资源,服务等级协议(Service-Level Agreement),功耗等约束。
1.2 推理引擎概念
推理系统,是一个专门用于部署神经网络模型,执行推理预测任务的 AI 系统。它类似于传统的 Web 服务或移动端应用系统,但专注于 AI 模型的部署与运行。推理系统会加载模型到内存,并进行版本管理,确保新版本能够顺利上线,旧版本能够安全回滚。此外,它还会对输入数据进行批量尺寸(Batch Size)的动态优化,以提高处理效率。通过提供服务接口(如 HTTP、gRPC 等),推理系统使得客户端能够方便地调用模型进行推理预测。同时,推理系统还可以作为一个微服务,在数据中心中与其他微服务协同工作,共同完成复杂的请求处理任务。
推理引擎,则是推理系统中的重要组成部分,它主要负责 AI 模型的加载与执行。推理引擎可分为调度与执行两层,聚焦于 Runtime 执行部分和 Kernel 算子内核层,为不同的硬件提供更加高效、快捷的执行引擎。它可以看作是一个基础软件,提供了一组 API,使得开发者能够在特定的加速器平台(如 CPU、GPU 和 TPU)上轻松地进行推理任务。目前市场上已有多种推理引擎,如字节跳动的 LightSeq、Meta AI 的 AITemplate、英伟达的 TensorRT,以及华为的 MindSpore Lite 和腾讯的 NCNN 等。
对于端侧推理系统:
- 模型小型化、轻量化是至关重要的环节
- 推理系统作为类似于传统 Web 服务的存在,需要高效响应用户请求并维持高标准的服务等级协议,如响应时间低于 100ms 等。为了实现这一目标,离线优化压缩在端侧推理引擎中发挥着至关重要的作用。
- 推理引擎的在线部署和优化是确保 AI 模型能够在实际应用中高效运行的关键环节。
1.3 推理引擎部署
除了云端的部署,神经网络模型的另一大场景就是边缘(Edge)部署,随着越来越多的物联网设备智能化,越来越多的移动端系统中开始部署神经网络模型。移动端部署应用常常有以下场景:智能设备,智慧城市,智能工业互联网,智慧办公室等。
方式一:边缘设备计算
第一种就是纯粹在边缘里面去做一个推理的,包括在手机、耳机还有手环上面,去做一个简单的推理,如下图所示。许多研究工作都集中在如何减少深度学习在资源受限的设备上执行时的延迟。
在这里,我们描述了在高效硬件和 DNN 模型设计方面的主要优化:
- 模型设计:在为资源受限的设备设计 DNN 模型时,机器学习研究人员往往侧重于设计 DNN 模型中参数量较少的模型,从而减少内存和执行延迟,同时保持较高的准确性。这些模型包括 MobileNets, SqueezeNet 等。
- 模型压缩:通过模型量化、剪枝和知识蒸馏等压缩手段对模型进行压缩。
- 硬件:设计针对神经网络的专用芯片。
方式二:安全计算 + 卸载云端
将模型部署于数据中心,边缘侧通过安全通信协议将请求发送到云端,云端推理返回结果,相当于将计算卸载(Offloading)到云端。这种方式好处是利用云端运行提升模型安全性,适合部署端侧无法部署的大模型。完全卸载到云端有可能违背实时性的需求。过渡方法是可以将模型切片,移动端和边缘端各有部分模型切片。
方式三:边缘设备 + 云端服务器
卸载方式是利用深度学习的结构特点,将一部分层切分放置在设备端进行计算,其他放置在云端,这种方式也被称作深度学习切片。这种方式一定程度上能够比方式二降低延迟,由于其利用了边缘设备的算力,但是与云端通信和计算还是会带来额外开销。这种方式的动机是,经过前几层的计算后,中间结果变得非常少。
使用这种方式部署很多时候是由于有一些数据是不出端的,用户对这些数据的隐私的保护要求非常严格。例如相册的推荐,华为相册中对人像、事物、美食做了归类,这种归类数据是不出端的,用户对这些数据的隐私要求非常高。这个时候会做一个小模型,在端内做一个简单的决策,这个小模型会通过大模型对大量的数据进行训练,训练完之后再推过来。
方式四:分布式计算
上述方法主要考虑将计算从终端设备卸载到其他更强大的设备(如边缘服务器或云)。另一种工作是从分布式计算的角度考虑问题。此类工作从分布式系统角度抽象问题,AI 计算在多个辅助边缘设备上切片,例如,MoDNN[17] 和 DeepThings[18] 通过细粒度的切片策略,将模型切片部署在设备,例如,树莓派和安卓手机,进行执行。切片策略根据设备计算能力,内存约束。在运行期,DeepThings 输入数据通过负载均衡策略进行调度,MoDNN 抽象了一层类 MapReduce 计算模型进行调度。
方式五:跨设备卸载
最后一种方式是利用 DNN 独特的层的结构,让一些层在边缘设备上计算,一些层由边缘服务器或云端计算。这种方法可以通过利用其他边缘设备的计算周期来潜在地提供延迟减少,但是还需要注意的是,在 DNN 分区点传递中间结果的延迟会影响总体的收益。
1.4 NVIDIA Triton 推理服务
NVIDIA Triton Inference Server(简称 Triton)是一个高性能、可扩展的开源推理框架,由英伟达等公司推出。Triton 旨在为用户提供云和边缘推理的部署解决方案,支持多种神经网络模型和框架。
Triton 的主要特点包括:
- 高性能:通过优化模型加载、执行和卸载的流程,Triton 显著提高了推理性能。
- 可扩展性:支持水平扩展和垂直扩展,能够适应不同的计算资源和负载需求。
- 多框架支持:兼容 TensorFlow、PyTorch、ONNX 等主流 AI 框架。
- 模型优化:集成 TensorRT 等优化工具,进一步提升模型推理性能。
- 灵活性:提供灵活的部署选项,支持公有云、私有云和边缘设备。
- 安全性:支持安全传输和访问控制,保障推理服务的安全性。
作为一个强大的推理框架,Triton 能够满足多样化的 AI 应用需求,帮助企业和开发者构建高效、可靠的推理服务。Triton 还拥有活跃的开源社区,提供了丰富的文档、示例和工具,帮助开发者快速上手和部署推理服务。
2. 推理引擎架构
2.1 设计目标
推理引擎,作为 AI 和机器学习领域的重要组成部分,其设计目标在于提供一个灵活、高效且易于使用的平台,用于部署和运行已经训练好的模型,完成从数据输入到预测输出的全过程。推理引擎拥有轻量、通用、易用和高效四个特点:
-
轻量:
- 资源占用少:轻量级推理引擎设计时会注重减少对计算资源(如 CPU、内存)的需求,使其能在低功耗设备上运行,如移动端设备、边缘计算节点等。
- 体积小:引擎本身的代码库和依赖较小,便于快速部署和更新,减少存储空间需求。
- 快速启动:启动速度快,能够迅速进入工作状态,这对于需要即时响应的应用场景尤为重要。
-
通用:
- 多模型支持:支持广泛的机器学习和神经网络模型格式,包括但不限于 TensorFlow、PyTorch、ONNX 等,确保了不同框架训练的模型都能被兼容和部署。
- 跨平台能力:推理引擎能够在多种操作系统和硬件平台上运行,无论是 Linux、Windows 还是嵌入式系统,都能保证服务的连续性和一致性。
- 广泛应用领域:适用于图像识别、语音处理、自然语言处理等多个领域,满足不同行业和场景的 AI 应用需求。
-
易用:
- 简化部署流程:提供简洁的 API 和工具链,使得用户无需深入了解底层技术细节即可快速部署模型。
- 可视化工具:很多推理引擎会配套图形界面或 Web 管理面板,便于用户监控模型性能、调整参数和管理服务。
- 文档与社区支持:良好的文档资料和活跃的开发者社区,可以帮助新用户快速上手,解决遇到的技术问题。
-
高效:
- 高性能推理:通过优化算法、并行计算、硬件加速(如 GPU、TPU)等方式,最大化提升推理速度,降低延迟。
- 资源管理:动态调整计算资源分配,根据负载自动扩缩容,确保高吞吐量的同时,也保持资源使用效率。
- 模型优化:支持模型压缩、量化等技术,减小模型体积,提高推理效率,尤其适合资源受限环境。
其中,"易用"与"高效"两大特性尤为关键,它们直接关系到技术解决方案的普及度与实际成效。一方面,易用性确保了技术的可接近性,加速了 AI 解决方案从概念验证到生产环境的转化过程,是推动 AI 技术从实验室走向广泛商用的桥梁。另一方面,高效性关乎推理速度和延迟,还涉及到资源的有效管理与优化,不仅是技术实力的体现,也是实现商业价值最大化的关键所在。
2.2 整体架构
推理引擎作为 AI 应用的核心组件,其架构设计直接关系到模型在实际部署环境中的效率、灵活性和资源利用率。整体架构可以细分为优化阶段和运行阶段,每个阶段都包含了一系列关键技术以确保模型能够高效、准确地运行于目标设备上
优化阶段聚焦于将训练好的模型转换并优化成适合部署的形式:
- 模型转换工具负责将模型从研究阶段的格式转换为高效执行的格式,并进行图优化,减少计算负担。
- 模型压缩通过技术如剪枝、量化、知识蒸馏等减小模型大小,使之更适用于资源有限的环境。
- 端侧学习允许模型在部署后继续学习和适应新数据,无需返回服务器重新训练,提升了模型在特定场景或用户个性化需求下的表现。
- 其他组件包括 Benchmarking 工具,用于性能评测和调优指导,以及应用演示(App Demos),服务于模型能力展示与实战反馈收集,共同助力模型的高效部署与持续优化。
运行阶段确保模型在目标设备上的高效执行:
- 调度层管理模型加载、资源分配及任务调度,根据设备情况灵活安排计算任务。
- 执行层直接执行模型计算,针对不同硬件优化运算逻辑,有效利用 CPU、GPU 等资源。
首先,推理引擎需要处理来自不同 AI 框架的模型,比如 MindSpore、TensorFlow、PyTorch 或者 PaddlePaddle。这些框架训练得到的模型将被送至模型转换工具,进行格式转换,以适配推理引擎的特定格式。
转换后得到的推理模型,需要进行压缩处理。压缩模型是推理引擎中常见的步骤,因为未压缩的模型在实际应用中很少见。压缩后的模型,接下来需要进行环境准备,这一步骤涉及大量的配置工作,包括大小核的调度、模型文档的获取等,确保模型能够在正确的环境中运行。
完成环境准备后,推理引擎会进行开发和编译,生成用于执行推理的进程。这个推理进程是实际执行推理任务的核心组件,它依赖于推理引擎提供的 API,为用户提供模块或任务开发所需的接口。
开发工程师会按照这个流程进行工作,开发完成后,推理引擎将执行推理任务,使其在运行时(Runtime)中运行。此时,推理引擎的执行依赖于输入和输出的结果,这涉及到在线执行的部分。
开发推理程序是一个复杂的过程,涉及到模型的加载、配置、数据预处理、推理执行以及结果的后处理等多个步骤。上图仅简单提供一个示例,介绍如何开发一个推理程序。
2.3 技术挑战
2.3.1 需求复杂性与程序大小
随着 AI 应用领域的不断拓宽,模型的多样性和复杂度急剧增加,这给推理引擎提出了首个挑战:如何在有限的程序大小内实现对广泛模型的支持。AI 模型通常由成千上万的算子构成,涵盖了从基础的矩阵运算到复杂的卷积、递归网络等,而推理引擎必须设计出一套精简而又强大的算子集,用以模拟这些多样化的运算。这意味着引擎开发团队需要不断创新,通过算法优化、算子融合等技术,以少量的核心算子实现对各类模型的高效支持,同时还要考虑程序的可扩展性,以便未来容纳更多新型模型的接入,这无疑是一项既考验技术深度又考验策略智慧的任务。
应对 AI 推理引擎在需求复杂性与程序大小之间权衡的挑战,可以采取一系列综合策略和技术革新,确保在满足日益增长的模型复杂性需求的同时,保持程序的高效和精简:
- 模块化与插件化设计:设计高度模块化的架构,使得每个模块专注于处理特定类型的计算或操作。这样不仅可以使核心程序保持精简,还能通过插件形式轻松添加或替换模块来支持新的模型或算子,增强系统的灵活性和可扩展性。
- 算子优化与融合:深入分析模型中的算子,通过算法优化减少计算冗余,提高单个算子的执行效率。算子融合技术则是将多个连续且兼容的算子合并为一个,减少数据搬运和内存访问次数,从而在不增加程序大小的前提下提升运行速度。
- 动态编译与代码生成:利用即时(JIT)编译或者静态编译时的优化技术,根据输入模型的具体结构动态生成最优化的执行代码。这种方法可以针对特定模型定制化生成执行逻辑,避免了通用解决方案带来的额外开销,有效平衡了性能与代码体积。
2.3.2 算力需求与资源碎片化
AI 模型的运行离不开强大的计算资源支持,尤其是面对诸如图像识别、自然语言处理等高计算量任务时。然而,实际应用场景中计算资源往往是碎片化的,从高性能服务器到低功耗的移动设备,算力和内存资源差异巨大。推理引擎需要在这片资源的“拼图”中寻找最优解,既要保证模型的高效执行,又要适应各类硬件环境。这要求引擎具备出色的适配能力,包括但不限于硬件加速技术的运用(如 GPU、NPU 加速)、动态调整算法策略以适应不同计算单元,以及智能的资源调度算法,以确保在有限的资源下也能发挥出最大的算力效能。
应对 AI 推理引擎在算力需求与资源碎片化之间的矛盾,也有一些新兴的技术方案,实现灵活应对算力需求,实现高效、低耗的模型推理,满足不同场景下的应用需求:
- 模型分层与多级缓存:将模型拆分为不同的计算层,每层根据其计算特性和资源需求部署在最适合的硬件上。采用多级缓存策略,减少跨硬件的数据传输延迟,提高整体执行效率。
- 自适应推理技术:开发自适应推理算法,根据当前设备的硬件配置动态调整模型的精度与计算复杂度。例如,在资源有限的设备上运行轻量级模型或进行模型裁剪,而在资源丰富的环境中则加载完整模型以追求更高精度。
- 异构计算整合:充分利用异构计算资源,通过有效的任务分解和负载均衡机制,将计算密集型任务分配给高性能硬件(如 GPU),而将控制流和轻量级计算留给 CPU,实现整体性能的最大化。
- 动态资源调度:设计智能的资源调度算法,实时监控系统资源状态和任务队列,动态调整任务优先级和资源分配,确保高优先级或时间敏感型任务得到及时处理。
- 边缘计算与分布式推理:利用边缘计算将部分计算任务从云端转移到靠近数据产生的边缘设备上,减少数据传输延迟。对于特别复杂的模型,可以采用分布式推理技术,将模型分割并在多台设备上并行计算,最后汇总结果。
2.3.3 执行效率与模型精度
在追求高速推理的同时,保持模型预测的准确性是另一个核心挑战。一方面,为了提高执行效率,模型压缩、量化技术常被采用,这虽然能显著减少模型体积、加快推理速度,但可能以牺牲部分精度为代价。另一方面,业务场景往往对模型的精度有着严格要求,特别是在医疗诊断、金融风险评估等领域,任何微小的精度损失都可能导致重大后果。因此,推理引擎在设计上必须巧妙平衡这两方面的需求,通过算法优化、混合精度推理、以及对特定模型结构的定制优化等策略,力求在不明显影响模型精度的前提下,实现推理效率的最大化。这不仅是一个技术挑战,也是对工程实践智慧的考验,需要不断地试错、优化与迭代,以找到最合适的平衡点。
应对 AI 推理引擎在执行效率与模型精度的双重要求,则可以使用以下的关键策略,满足多样化业务场景的严苛要求:
- 知识蒸馏:通过知识蒸馏技术,用一个大而精确的教师模型去训练一个较小的学生模型,让学生模型在保持较高精度的同时拥有更快的推理速度。这种方法可以在不直接牺牲模型精度的前提下,实现模型的小型化和效率提升。
- 量化与微调:虽然量化技术会降低模型的精度,但通过细致的量化方案选择(如对敏感层采取不同的量化策略)和后续的微调步骤,可以在很大程度上恢复丢失的精度。微调过程可以让模型在量化后的新精度水平上重新学习,优化权重,最小化精度损失。
- 模型剪枝与稀疏化:通过对模型进行剪枝,移除对最终预测贡献较小的权重或神经元,减少计算量。同时,利用稀疏计算技术进一步减少计算负担,许多现代硬件已支持高效的稀疏矩阵运算。精心设计的剪枝策略可以大幅降低计算需求而不显著影响模型表现。
- 缓存与预计算策略:对频繁访问的数据或计算结果进行缓存,减少重复计算,特别是在循环或递归模型中。预计算某些静态或几乎不变的特征,进一步加速推理流程。
其他: 对算法优化及推理引擎有兴趣的,可以参考:infrasys-ai.github.io/aisystem-do…
下面截图下目录:
有兴趣的自取:infrasys-ai.github.io/aisystem-do…
B站:space.bilibili.com/517221395?s…