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的部署模型, 把整个流程串一遍啦 😉

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【STM32】串口助手接受数据是乱码如何解决

第一步 首先判断自己使用的串口助手和工程配置的波特率是否相同,一般都是115200 第二步 如果不是上一条的问题,继续排查,检查时钟问题 打开工程,找到此文件(stm32f10x.h)的这个位置,如工程中未添加,可以从…

centos安装hadoop启动问题解决方案

1、出现了问题localhost: ERROR: JAVA_HOME is not set and could not be found. *解决方案尝试: 修改hadoop-env.sh(在etc/hadoop) sudo gedit /usr/local/hadoop/etc/hadoop/hadoop-env.sh 将原本的JAVA_HOME 替换为绝对路径就可以了 #expo…

Leetcode 144. 二叉树的前序遍历

题目描述:给定一个二叉树的根节点 root ,返回 它的 前序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root [] 输出:[] 示例 3: 输入&…

关于C语言调用Python,PyImport_ImportModule函数的简介

函数原型:PyObject *PyImport_ImportModule(const char *name) 用于加载编译目标的文件 这个模块必须为.py文件,因为说直白点就是通过Python3 xxxx.py能够通过编译的东西

项目管理【引论二】项目管理的逻辑

系列文章目录 【引论一】项目管理的意义 【引论二】项目管理的逻辑 一、项目管理的目标 项目管理的目标是在规定的时间内,在批准的预算内,完成事先确定的工作范围内的工作,并且达到预期的质量性能要求。 1.1 时间、成本和质量之间的关系 1…

力扣226.翻转二叉树(二叉树的先序遍历)

文章目录 题目描述思路复杂度Code 题目描述 思路 利用二叉树的先序遍历,每次递归遍历时将当前节点的左右子节点交换即可 复杂度 时间复杂度: O ( n ) O(n) O(n);其中 n n n为树节点的个数 空间复杂度: O ( h e i g h ) O(heigh) O(heigh);其…

嵌入式学习第二十七天!(TCP并发模型)

TCP并发模型: 1. TCP多线程模型: 缺点:创建线程会带来资源开销,能够实现的并发量比较有限。 2. IO模型: 1. 阻塞IO: 没有数据到来时,可以让任务挂起,节省CPU资源开销,提…

案例分析篇01:软件架构设计考点架构风格及质量属性(2024年软考高级系统架构设计师冲刺知识点总结系列文章)

专栏系列文章推荐: 2024高级系统架构设计师备考资料(高频考点&真题&经验)https://blog.csdn.net/seeker1994/category_12601310.html 【历年案例分析真题考点汇总】与【专栏文章案例分析高频考点目录】(2024年软考高级系统架构设计师冲刺知识点总结-案例分析篇-…

【SpringCloud微服务实战01】Eureka 注册中心

前言 在 Eureka 架构中,微服务角色有两类: EurekaServer :服务端,注册中心 记录服务信息 心跳监控 EurekaClient :客户端 Provider :服务提供者,例如案例中的 user-service 注册自己的信息到 EurekaS…

解决vue项目,运行npm install安装报缺少c++库问题

项目是前后端分离架构,前端使用的是vue框架,在部署前端项目时,需要下载安装一些基础的镜像配置,包括一些预处理,但是在使用npm install和yarn install命令时出现了如下错误,查阅资料总结如下: …

WPF(2)命令绑定

效果是&#xff1a;当TextBox控件的Text属性为空时show按钮不可用&#xff0c;有值时show按钮可用 项目结构 界面代码 <Window x:Class"WpfApp1.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://sc…

Flutter ios一键三连脚本

flutter运行ios时总得执行三个命令,中间还得等待&#xff0c;有没有脚本自动执行 ## ios 执行命令 - flutter clean - flutter pub get - cd ios - pod install有&#xff0c;项目根目录创建shell 文件夹&#xff0c;新建setup.sh setup.sh里面放如下代码 #!/bin/bash# ios …

ffmpeg解码和渲染理解

ffmpeg解码和渲染理解 ffmpeg视频解码步骤 FFmpeg 是一个功能强大的跨平台多媒体处理工具&#xff0c;包含了音视频编解码、封装/解封装、过滤器等功能。下面是一般情况下使用 FFmpeg 进行视频解码的步骤&#xff1a; 初始化 FFmpeg 库&#xff1a;首先需要初始化 FFmpeg 库&a…

【Sql】数据库的三范式?MySQL数据库引擎有?InnoDB与MyISAM的区别

目录 数据库的三范式&#xff1f; MySQL数据库引擎有&#xff1f; InnoDB与MyISAM的区别 数据库的三范式&#xff1f; 第一范式&#xff1a;是数据库最基本的要求&#xff0c;列不可再分 第二范式&#xff1a;行可以唯一区分&#xff0c;主键约束 第三范式&#xff1a;是在…

【深度学习笔记】7_4 动量法momentum

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 7.4 动量法 在7.2节&#xff08;梯度下降和随机梯度下降&#xff09;中我们提到&#xff0c;目标函数有关自变量的梯度代表了目标函数…

【ArcGIS】栅格数据进行标准化(归一化)处理

栅格数据进行标准化&#xff08;归一化&#xff09;处理 方法1&#xff1a;栅格计算器方法2&#xff1a;模糊分析参考 栅格数据进行标准化(归一化)处理 方法1&#xff1a;栅格计算器 栅格计算器&#xff08;Raster Calculator&#xff09; 方法2&#xff1a;模糊分析 空间…

Python实现图片(合并)转PDF

在日常的工作和学习过程当中,我相信很多人遇到过这样一个很普通的需求,就是将某一个图片转为PDF或者是将多个图片合并到一个PDF文件。但是,在苦苦搜寻一圈之后发现要么要下载软件,下载了还要注册,注册了还要VIP,甚至SVIP才能实现这样的需求! 今天,我带大家把这个功能打…

2024年华为HCIA-DATACOM新增题库(H12-811)

801、[单选题]178/832、在系统视图下键入什么命令可以切换到用户视图? A quit B souter C system-view D user-view 试题答案&#xff1a;A 试题解析&#xff1a;在系统视图下键入quit命令退出到用户视图。因此答案选A。 802、[单选题]“网络管理员在三层交换机上创建了V…

Kubernetes | 起源 | 组件详解

起源 起源&#xff1a; Kubernetes&#xff08;常简称为K8s&#xff09;起源于Google内部的Borg项目&#xff0c;是一个开源的容器编排引擎&#xff0c;于2014年首次对外发布。 Google Borg Google Borg 是 Google 内部开发和使用的大规模集群管理系统&#xff0c;用于管理和运…

Jmeter+Ant+Git/SVN+Jenkins实现持续集成接口测试,一文精通(二)

前言 上篇内容已经介绍接口测试流程以及了解如何用jmeter接口测试&#xff0c;本篇将介绍如何在实战中应用 一、Jmeter接口关联 1.使用正则表达式实现接口关联&#xff08;可以作用于任意值&#xff09; 如果说一个请求里面有多次请求服务器。 2.使用Jsonpath表达式实现接口关…