【AI】推理系统和推理引擎的整体架构

2023-09-14 17:01:34

本文主要是对 B 站 Up 主 ZOMI酱 推理系统系列视频 的理解,可以认为是重点笔记。

一、深度学习模型的全生命周期

相信很多人和我一样,刚看到深度学习模型中的推理系统或推理引擎时是一头雾水,因为学习 DL 时通常关注于模型的设计和训练。下图是深度学习模型的全生命周期图,主要分为两大类任务,训练任务和推理任务。

  • 训练任务:通常需要执行数小时、数天,一般配置较大的 batch size 以实现较大的吞吐量,训练模型直到指定的准确度或错误率。
  • 推理任务:执行 7 x 24 小时服务,此时模型已稳定无需训练,服务于真实数据进行推理预测,一般 batch size 较小。

训练过程通过设计合适的 AI 模型以及损失函数、优化算法等,前向传播并计算损失函数,反向计算梯度,利用优化函数来更新模型,最终目标是使损失函数最小。推理过程是在训练好的模型上,进行一次前向传播得到输出,最终目标是将模型部署在生产环境中

推理任务相比训练任务的挑战有如下几点:

  1. 模型被部署为长期运行的服务(需要稳定可靠);
  2. 推理时有更苛刻的资源约束(需要在有限算力下服务);
  3. 部署的设备型号更加多样,意味着设备架构多样(需要具有通用性)。

二、推理系统架构

推理系统的作用可以理解为提供一个服务,服务的形式可以是 C/S 架构,也可以是微服务架构;服务的内容可以是推荐感兴趣的文章,也可以是精准投放广告。因此,推荐系统的输入应通过 HTTP 或 gRPC 等请求发送,输出则根据业务需要进行定义。下图是推荐系统的架构图,请求响应与处理、监控和调度队列应该是高性能系统的常见组成部分,而推理系统的关键在于模型管理推理引擎。模型管理可以选择合适的 AI 模型执行推理任务,推理引擎则将各个任务合理分配给各种处理单元(xPU)进行处理。

推理系统的设计通常需要从以下几点考虑:低延迟、高吞吐、准确性、高效率和扩展性。

三、推理引擎架构

下图是推理引擎架构图,推理引擎本身也可以认为是一个基础软件,它提供了一组 API 用于在特定平台(如 CPU、GPU 和 VPU)上进行推理任务。英特尔的 OpenVINO 这样定义推理引擎:

(OpenVINO)推理引擎是一组 C++ 库,提供通用 API,可在您选择的平台(CPU、GPU 或 VPU)上提供推理解决方案。使用推理引擎 API 读取中间表示(IR)、设置输入和输出格式并在设备上执行模型。 虽然 C++ 库是主要实现,但 C 库和 Python bindings(通过 Python 调用 C/C++ 库)也可用。

隐藏在推理引擎的 API 下有许多功能可以实现,如同 Linux 提供的 API 一样,通过暴露的编程接口可以配置网络、管理文件、实现算法等。推理引擎首先要实现的是模型格式转换,深度学习框架多种多样,包括流行的 PyTorch、TensorFlow,以及 Keras、mxnet 等,因此需要转换它们的数据格式以便后续处理。模型压缩的目的是将一个大模型压缩为精简的小模型,由于端侧设备(移动端、桌面端、嵌入式等)的算力有限,参数很多的深度神经网络必须经过压缩才能部署,常用的方法在架构图中也有体现,包括知识蒸馏、剪枝、二值化等。架构中的 Runtime 部分就是实际的推理执行,而 Kernel 则是在具体的设备上进行运算。

推理引擎架构的每一层都有各自的问题,从上到下可以总结出如下问题:

  1. 如何对不同深度学习框架进行模型转换?(模型转换部分)
  2. 如何加快调度和执行?(Runtime 部分)
  3. 如何提高算子的性能?(Kernel 部分)
  4. 如何利用边缘设备/端侧设备算力?(设备部分)
更多推荐

TCP详解之重传机制

TCP详解之重传机制TCP实现可靠传输的方式之一,是通过序列号与确认应答。在TCP中,当发送端的数据到达接收主机时,接收端主机会返回一个确认应答消息,表示已收到消息。但在错综复杂的网络,并不一定能如上图那么顺利能正常的数据传输,万一数据在传输过程中丢失了呢?所以TCP针对数据包丢失的情况,会用重传机制解决。接下来说说常

【C++】C++11(列表初始化和右值引用)

前言:C++的发展其实并不是一蹴而就的,他经历了很多阶段,本章开始,我们将进入C++11的学习。我们大致来看一下C++的发展历程:当然在这些之中还发行了其他的版本,C++还在不断的向后发展。但是:现在公司主流使用还是C++98和C++11。相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新

尚硅谷wepack课程学习笔记

为什么需要使用打包工具?开发时使用的框架、es6语法、less等浏览器无法识别。需要经过编译成浏览器能识别的css、js才可以运行。打包工具可以帮我们编译,号可以做代码压缩、兼容处理、性能优化。常见的打包工具有什么?vite、webpack、glup、gruntwebapck最基本的使用?是一个静态资源打包工具,以一个

@Valid注解的作用及@Valid注解与@Validated的区别

1.@Valid注解导入依赖<dependency><groupId>javax.validation</groupId><artifactId>validation-api</artifactId></dependency><dependency><groupId>org.hibernate.validator</g

面试官:你是怎么理解ES6中Proxy的?使用场景?

🎬岸边的风:个人主页🔥个人专栏:《VUE》《javaScript》⛺️生活的理想,就是为了理想的生活!目录一、介绍二、用法参数handler解析Reflectget()set()deleteProperty()取消代理三、使用场景一、介绍定义:用于定义基本操作的自定义行为本质:修改的是程序默认形为,就形同于在编程语

ConfigMaps-1

文章目录主要内容一.使用YAML文件创建1.在data节点创建了一些键值:代码如下(示例):2.解释二.使用命令行创建1.创建了一个名为person的键值:代码如下(示例):2.解释3.创建了一个index.html文件,然后用--from-file来引用代码如下(示例):4.解释总结主要内容使用YAML文件创建使用命

Python 缓存库

文章目录缓存库缓存库的类型Python中有用的缓存库Python中的Redis缓存库Python中的lru_cache库Python中的其他缓存库总结缓存是一种可以存储数据以供快速访问的内存类型。它是一个小而快速的内存,用于保存经常访问的数据。缓存是至关重要的,因为它可以通过减少系统访问缓慢的主存储器的次数来提高系统性

【从入门到起飞】JavaAPI—System,Runtime,Object,Objects类

🎊专栏【JavaSE】🍔喜欢的诗句:更喜岷山千里雪三军过后尽开颜。🎆音乐分享【如愿】🎄欢迎并且感谢大家指出小吉的问题🥰文章目录🍔System类⭐exit()⭐currentTimeMillis()🎄用处⭐arraycopy()🍔Runtime类⭐创建对象⭐exit()⭐availableProcesso

写一篇nginx配置指南

nginx.conf配置找到Nginx的安装目录下的nginx.conf文件,该文件负责Nginx的基础功能配置。配置文件概述Nginx的主配置文件(conf/nginx.conf)按以下结构组织:配置块功能描述全局块与Nginx运行相关的全局设置events块与网络连接有关的设置http块代理、缓存、日志、虚拟主机等

【计算机网络】网络编程接口 Socket API 解读(6)

Socket是网络协议栈暴露给编程人员的API,相比复杂的计算机网络协议,API对关键操作和配置数据进行了抽象,简化了程序编程。本文讲述的socket内容源自Linuxman。本文主要对各API进行详细介绍,从而更好的理解socket编程。recvrecv()遵循POSIX.1-20081.库标准c库,libc,-lc

Ubuntu 安装 CUDA 与 CUDNN GPU加速引擎

一、NVIDIA(英伟达)显卡驱动安装NVIDIA显卡驱动可以通过指令sudoaptpurgenvidia*删除以前安装的NVIDIA驱动版本,重新安装。1.1.关闭系统自带驱动nouveau注意!在安装NVIDIA驱动以前需要禁止系统自带显卡驱动nouveau:可以先通过指令lsmod|grepnouveau查看no

热文推荐