LLM推理框架Triton Inference Server学习条记(一): Triton Inference Serve ...

打印 上一主题 下一主题

主题 989|帖子 989|积分 2967

官方文档查阅: 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支持的底子功能:

  • 支持多框架类型的模子(TensorRT, ONNX engine, TF, Pytorch,自定义),原因是triton与backends是解耦的, 可以实现多类框架的backends,通过在设置文件中指定模子要用的backends之后, triton就根据指定去调对应的backends推理(backends那篇文章中会详细整理到)。
  • Triton可GPU/CPU推理,做到了推理的异构计算
  • 可以多实例推理(GPU并行, 提升服从)
  • HTTP、GRPC的请求支持
  • 集成k8s体系和体系安全性查抄,监控,许多根本的服务框架的功能都有,模子管理比如热加载、模子版本切换、动态batch,雷同于之前的tensorflow server
  • 做到了模子同一管理,加载更新
  • 开源,可以自定义修改,许多题目可以直接issue,官方回复及时
  • 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大类模子:

  • 单一的, 没有相互依靠,无状态的模子,比如CV的相关模子
    这类模子可以优化下推理服务请求的调理方式, 比如支持动态batch大概是default scheduler(均匀分配打batch) ,打batch的好处是, 可以把请求队列内里的用户请求, 多个请求打成一个batch去给到模子推理, 提高GPU的使用率

  • 单一的, 有状态的模子(NLP, 当前状态需依靠前面的状态)
    调理的时候,每个推理请求要映射到同一个instance上去,因为前后有依靠关系, 这内里也有两种方式:

    • direct: 映射到同一个instance上去, 在同一个instance的内部不打batch
    • Oldest: 映射到同一个instance上去, 在同一个instance的内部打batch


  • 模子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的摆设模子, 把整个流程串一遍啦

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

悠扬随风

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表