LLM推理框架Triton Inference Server学习笔记(一): Triton Inference Server整体架构初识

官方文档查阅: TritonInferenceServer文档

1. 写在前面

这篇文章开始进行大语言模型(Large Language Model, LLM)的学习笔记整理,这次想从Triton Inference Server框架开始,因为最近工作上用到了一些大模型部署方面的知识, 所以就快速补充了些,大模型这块, 属于是从用户使用触发,先把模型部署上来, 把整个业务流程走顺,让用户先能用起来,然后再深入到模型本身的细节中去哈哈。

Triton Inference Server是Nvida开源的机器学习推理引擎,提供了非常多实用的功能帮助我们快速落地AI模型到生产环境以提供业务使用(我们如果训练出来了一个大语言模型, 要怎么部署成一个服务, 开放给广大用户去进行使用)。当人手资源受限或开发时间不足的情况下,没有能力自研一套机器学习推理引擎,可以选择这套工具提高我们的模型部署效率。

这次学习是跟着B站上的这个课程学习的, 原理模块讲的很不错, 比直接看官方文档要亲民很多,不过这里面的实践代码没有开放出来,全程跟完一遍之后,如果不动手操作,记忆不太深刻。 所以我就想借着这个学习机会, 把里面的内容都亲自实操一下, 记录一些坑并顺便补充扩展内容,先理解基本原理,并掌握基本的部署流程,入门之后, 再去看官方文档的细节就会容易很多啦。

Triton Inference Server系列计划用3-4篇文章进行学习,本篇是该系列的第一章,也就是理论部分, 需要先对整个Triton Inference Server架构做一个初识, 从宏观上先了解下这是个啥? 是干什么的? 设计理念是啥? 为什么要用它?等

主要内容:

  • Triton Inference Server整体架构(what)
  • Triton Inference Server设计理念(how)
  • Triton Inference Server优势总结(why)

Ok, let’s go!

2. Triton Inference Server整体架构

Triton Inference Server是Nvida开源的机器学习推理引擎,提供了非常多实用的功能帮助我们快速落地AI模型到生产环境以提供业务使用, 可以很方便的解决我们模型的服务部署问题。

工作流程大概是这样:我们训练出深度模型之后, 借助这个框架,可以很方便的部署一个模型服务, 类似于用flask或者fast框架搭建的那种后端服务, 用户把要推理的数据通过http或者grpc请求发给我们的服务, 我们接收到之后,给到模型推理,把推理结果返回给用户。 这样,我们就算把我们研制模型落地了。

整体架构如下:

在这里插入图片描述
推理架构: client + server, 其实比较清晰, client不用多讲, 准备好数据给服务发请求就好, 主要说一下服务端,整个服务从大面上看,一般会部署到k8s集群上,因为既然开放出去, 肯定不是只有一台机器推理了,我们会有多台机器,每台机器上又会有多张卡一块进行推理。 而k8s是一个容器化的管理工具,我们每个小的服务启动,生命周期维护,弹性扩容等,需要有一个管理系统运维自动化的工具, 下面介绍一些关键的模块:

  • 容器组(load balancer): 解负载均衡问题,客户端过来的请求,怎么有效均匀分配给后端的推理服务,达到高效利用资源, 平衡推理请求的压力效果
  • 模型仓库管理(Model repository persistent volume): 管理我们训练出来的模型, 这里会支持很多类型的主流模型,比如pytorch, tf, onnx等等
  • metrics service: 监督每个推理节点,负责每个推理节点的安全性检查(每个推理服务是否正常,延迟,吞吐,GPU利用率等)
  • 推理核心(triton server): 负责推理部分(每个节点启动1或者多个triton inference server进行模型推理),Triton Inference Server的定位是整个推理架构服务器端的一部分, 工作在单个节点上进行推理服务

所以, 基于上面宏观架构, 先弄清楚几个概念:

  • K8s集群:带有多台机器,多张GPU卡的容器化管理工具,负责保证整个推理服务的启动,生命周期等维护,机器的相关扩容等, 负责整个推理服务集群的调度
  • triton server: 整个推理架构服务器端的一部分, 工作在单个节点上进行推理服务
  • TensorRT引擎: 这个东西我特意查了下,详细内容看这篇文章, TensorRT是可以在NVIDIA各种GPU硬件平台下运行的一个C++推理框架,我们可以把Pytorch、TF或者其他框架训练好的模型,转化为TensorRT的格式,然后利用TensorRT推理引擎去运行我们这个模型,可以有效提升模型在英伟达GPU上运行的速度。

这三者,从概念上来看,由大入小。下面抛开掉k8s集群,再看一下整体的架构图,稍微深入下细节:
在这里插入图片描述
这样图就能比较清晰的看清楚triton server的整个工作流程了,首先,是用户给服务发送http请求或者grpc请求, 然后服务接收到请求,会放到一个队列里面, 当然,load balancer会针对队列里面的请求做一些推理优化,比如把几个小的batch合并成一个大batch给到模型等, 做完优化之后,就可以去模型仓库里面调指定的模型去推理。这些模型有各种格式的。 模型推理完结果,会把输出返回给客户端。 整个过程用,健康检查系统会监控模型的工作状态, 吞吐和GPU利用率等。

通过这张图,整理下Triton支持的基础功能:

  1. 支持多框架类型的模型(TensorRT, ONNX engine, TF, Pytorch,自定义),原因是triton与backends是解耦的, 可以实现多类框架的backends,通过在配置文件中指定模型要用的backends之后, triton就根据指定去调对应的backends推理(backends那篇文章中会详细整理到)。
  2. Triton可GPU/CPU推理,做到了推理的异构计算
  3. 可以多实例推理(GPU并行, 提升效率)
  4. HTTP、GRPC的请求支持
  5. 集成k8s系统和系统安全性检查,监控,很多基本的服务框架的功能都有,模型管理比如热加载、模型版本切换、动态batch,类似于之前的tensorflow server
  6. 做到了模型统一管理,加载更新
  7. 开源,可以自定义修改,很多问题可以直接issue,官方回复及时
  8. NGG支持(NGC可以理解是NV的一个官方软件仓库,里面有好多编译好的软件、docker镜像等,我们可以下载之后一键运行triton server)

3.Triton Inference Server设计理念

上面的内容大概能理解trition inference server是个啥, 是在怎么工作的了,下面从启发性的角度思考下,假设我们要做一个这样的推理服务,应该怎么去设计呢?

3.1 推理服务的生命周期

第一个角度,就是整个推理服务的生命周期, 我们的模型肯定会有很多类型, 我们针对每种类型的模型,怎么去支持? 需要有不同的backends的方式,即通过backends的方式, 支持多种框架类型的模型,做到Backends的解耦和,比如pytorch的模型, backends要用pytorch, tf的模型,backends要用tf,通用功能设计:

  • backends的管理(load等)
  • 模型的管理(load, 更新状态)
  • 多instance的推理管理, 要能做到多线程推理的并发
  • 推理服务请求的分发与调度
  • 推理服务的生命周期管理(推理请求管理和推理响应的管理等)
  • 支持多请求协议(HTTP和GRPC请求等)

3.2 模型优化的角度

模型本身不仅有框架实现方式的区别, 自身场景也有一些区别,所以要从场景上,支持3大类模型:

  1. 单一的, 没有相互依赖,无状态的模型,比如CV的相关模型
    这类模型可以优化下推理服务请求的调度方式, 比如支持动态batch或者是default scheduler(均匀分配打batch) ,打batch的好处是, 可以把请求队列里面的用户请求, 多个请求打成一个batch去给到模型推理, 提高GPU的利用率
    在这里插入图片描述
  2. 单一的, 有状态的模型(NLP, 当前状态需依赖前面的状态)
    调度的时候,每个推理请求要映射到同一个instance上去,因为前后有依赖关系, 这里面也有两种方式:
    • direct: 映射到同一个instance上去, 在同一个instance的内部不打batch
    • Oldest: 映射到同一个instance上去, 在同一个instance的内部打batch
      在这里插入图片描述
  3. 模型pipeline
    不是一个模型了,而是多个模型的组合,后一个模型要依赖前一个模型的输出结果,比如cv任务的推理里面,我可能有一个预处理的模型,针对输入的图像做一些预处理操作, 然后再给到一个分类或者分割的模型, 最后可能还有个后处理的模型做后处理返回结果。

在这里插入图片描述
在调度上,每个模型有自己的调度方式。单模型多线程或者是多模型多线程等,类似于下面这个图
在这里插入图片描述

3.3 Backend的角度

Backends的角度要考虑两点:

  • Backend对推理服务本身进行解耦, 因为整个推理服务是用C++编译的, 解耦开之后,后面万一增加backends了,不用再编译整个triton服务了,只需要单独编译backends, 提供给triton需要的.so文件就可以了,这样会非常方便,类似于可插拔。
  • 用户可以自定义backend对数据推理作个性化
    • 需要实现triton的API, 告诉triton的推理过程
    • 这个需要看官方文档

4. Triton Inference Server优势总结

综上, 对整个triton inference server的优势总结, 上面的2部分整理了一些了:

  • 开源,bsd协议。
    • 社区方式管理,重构风险低;
    • 核心团队来自NV,对NVGPU的适配好;
    • 来自不同公司贡献的backend;
    • 可以促进新特性,提需求;
  • 支持多框架;
  • 使用的公司多,对NVIDIA系列GPU比较友好,也是大厂购买NVIDIA云服务器推荐使用的框架;
  • 通过customer backend解耦定制模型;
  • 基于多实例支持,GRPC和CUDA基于内存的优化,实现更好的性能;
  • 驾驶舱(监控)支持

反正牛就是完事了, 不过通过学习完之后使用的结果来看, 部署大模型确实是比较方便。

5. 小总

本文是LLM系列的第一篇文章, 从推理框架服务开始, 这篇文章比较简单,主要是Trition Inference Server的理论知识为主, 主要总结了下, trition inference server是啥? 包含哪些模块?大致上怎么工作的? 为什么要用它等等。

下一篇文章,我们就来stey by step的部署模型, 把整个流程串一遍啦 😉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/448568.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

记一次用Arthas排查Redis连接数增加问题(附:redis连接池优化)

手打不易,如果转摘,请注明出处! 注明原文:https://zhangxiaofan.blog.csdn.net/article/details/136493572 前言 有一次生产环境发包后,发现redis连接数变多了,由于改的代码比较多,不确定是哪…

下载、安装并配置 Node.js

文章目录 1. 下载2. 自定义安装3. 添加环境变量4. 验证5. 修改下载位置6. npm 换源7. 测试 ➡️➡️➡️来源:Simplilearn.com Node.js 是一个开源、跨平台的 JavaScript 运行时环境和库,用于在客户端浏览器之外运行 web 应用程序。 Ryan Dahl 在2009年开…

2024.3.11 C++作业

1、提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数要求使用C风格字符串完成 #include <iostream>using namespace std;int main() {char str[20];cout << "please enter the str:";gets(str);in…

YoloV7改进策略:Block改进|自研Block,涨点超猛|代码详解|附结构图

涨点效果 参考模型 参考的Block,如下图: 我对Block做了修改,修改后的结构图如下: 代码详解 from timm.models.layers import DropPathfrom torch import Tensor def channel_shuffle(x: Tensor, groups:

5G CA频段组合与带宽的射频标准

先来复习一下我们前面学习过的章节后缀所代表的含义&#xff1a; None Single CarrierA Carrier Aggregation (CA)B Dual-Connectivity (DC)C Supplement Uplink (SUL)D UL MIMOE V2XF Shared spectrum channel accessG Tx Diversity (TxD)I …

docker容器启动rabbitmq

docker容器启动rabbitmq 一、RabbitMQ部署1.1.在线拉取mq镜像1.2.运行mq容器1.3.访问mq 二、RabbitMQ的集群2.1.集群分类2.1.设置 /etc/hosts文件 endl 一、RabbitMQ部署 1.1.在线拉取mq镜像 # 在线拉取 docker pull rabbitmq:3-management1.2.运行mq容器 docker run \ -e R…

【Python】Python中的正则表达式

Python中的正则表达式 1.re模块使用入门 1.1 re.match 函数 函数定义&#xff1a; re.match 尝试从字符串的起始位置匹配一个模式&#xff0c;如果不是起始位置匹配成功的话&#xff0c;match() 就返回 none。 函数语法&#xff1a; re.match(pattern, string, flags0) …

全网最最最详细DataEase-V1部署前后端分离教程

前端代码准备 按照前端官方的介绍&#xff0c;推荐使用node.js 16版本左右的&#xff0c;由于V1的DataEase是使用的Vue2的项目工程&#xff0c;DataEase部署&#xff0c;前端node相关不应该太新。要是不知道如何去做的小伙伴可以看我的其中一篇博客文章&#xff0c; 如何使用…

Java源码项目基于springboot的江理工文档管理系统的设计与实现

大家好我是程序员阿存&#xff0c;在java圈的辛苦码农。辛辛苦苦板砖&#xff0c;今天要和大家聊的是一款Java源码项目基于springboot的江理工文档管理系统的设计与实现&#xff0c;项目源码以及部署相关请联系存哥&#xff0c;文末附上联系信息 。 项目源码&#xff1a;Java基…

103. Go单测系列3---mockey与convey综合实战

文章目录 前言断言mock整体使用方式&#xff1a;具体示例mock结构体方法mock普通函数序列化mock MySQL和Redis单测go-sqlmockminiredis F&Q1. 如何禁用内联和编译优化 前言 工作中&#xff0c;随着业务的快速发展&#xff0c;代码量级和复杂度也会随之快速增长&#xff0c…

GeoPy1.1 地理数据处理入门

原作者&#xff1a;Damon 高校教师&#xff0c;中科院 GIS 博士 本文为原文章基础上&#xff0c;加上自己以及GPT4.0的总结整理而来 原活动链接 目录 前言小练习&#xff1a;求一周的平均温度小练习&#xff1a;将文件夹下的文件路径都打印出来&#xff1a;小练习&#xff1a…

【微信小程序页面出现onReachBottom不触发的情况】

微信小程序页面出现onReachBottom不触发的情况 源代码的情况是 /** * 页面上拉触底事件的处理函数 */ onReachBottom() {console.log("-------"); },.page {height: 100vh;width: 100vw;overflow-x: hidden; }无法触发的原因是&#xff1a;height设置为100vh,会导…

轻松掌握锁冲突问题的排查方法——《OceanBase诊断系列》之八

1. 前言 OceanBase数据库通过两阶段封锁机制确保读写事务并发控制的正确性。在高冲突场景下&#xff0c;事务处理中经常会遇到行锁冲突的问题。然而&#xff0c;许多OceanBase用户对于何时发生锁冲突&#xff0c;锁冲突的表现如何&#xff0c;以及如何排查锁冲突的原因&#x…

Anaconda 的一些配置

Anaconda 安装及修改环境默认位置 https://blog.csdn.net/qq_54562136/article/details/128932352 最重要的一步&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;改文件夹权限 Anaconda创建、激活、退出、删除虚拟环境 修改pip install 默认安装路径

【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)

文章目录 题目思路解法 题目 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[3,4,5] 解释&#xff1a;链表只有一个中间…

数学与简单dp

1205. 买不到的数目 - AcWing题库 import java.util.*;public class Main{public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int m sc.nextInt();System.out.print((n - 1) * (m - 1) - 1);} } 1211. 蚂蚁感冒 - AcWing题库…

告别“死记硬背”,坐席助手让客服新手秒变大咖

在客服行业&#xff0c;新手客服人员常常面临着两大难题&#xff1a;一是需要死记硬背大量的标准答案&#xff0c;二是培训时间长&#xff0c;上岗速度慢。然而&#xff0c;随着科技的发展&#xff0c;这些问题正逐渐得到。今天&#xff0c;我们要为大家介绍一款革命性的客服工…

【考研数学】张宇《1000题》做不下来怎么办?

张宇1000题其实非常考察基础知识&#xff0c;如果你基础没有打好就直接开始刷的话会发现挺难刷下来的 1000题还是更适合在强化阶段来刷&#xff0c;刷早了把心态刷崩掉也没什么用... 基础不好或者0基础的还是建议从简单的1800开始刷起来 同时也要非常注意刷题方法&#xff0…

二叉树——501.二叉搜索树中的众数、 236. 二叉树的最近公共祖先

二叉搜索树中的众数 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 如果树中有不止一个众数&#xff0c;可以按 任意顺序 返回。 假定 BST …

网络、网络协议模型、UDP编程——计算机网络——day01

今天来到了网络编程&#xff0c;主要讲了网络、网络协议模型以及UDP编程 网络 网络主要是进行&#xff1a;数据传输和数据共享 网络协议模型 OSI协议模型应用层 实际发送的数据表示层 发送的数据是否加密会话层 是否建立会话连接传…