triton作为一个NVIDIA开源的商用级别的服务框架,个人认为很好用而且很稳定,API接口的变化也不大,我从2020年的20.06切换到2022年的22.06,两个大版本切换,一些涉及到代码的工程变动很少,稍微修改修改就可以直接复用,很方便。
本系列讲解的版本也是基于22.06。
本系列讲解重点是结合实际的应用场景以及源码分析,以及写一些triton周边的插件、集成等。非速成,适合同样喜欢深入的小伙伴。
什么是triton inference server?
肯定很多人想知道triton干啥的,学习这个有啥用?这里简单解释一下:
- triton可以充当服务框架去部署你的深度学习模型,其他用户可以通过http或者grpc去请求,相当于你用flask搭了个服务供别人请求,当然相比flask的性能高很多了
- triton也可以摘出C-API充当多线程推理服务框架,去除http和grpc部分,适合本地部署多模型,比如你有很多模型要部署,然后分时段调用,或者有pipeline,有了triton就省去你处理显存、内存和线程的麻烦
注意,还有一个同名的
triton是GPU编程语言,类似于TVM的TVMscript,需要区分,这篇文章中的triton指的是triton inference server
借用官方的图,triton的使用场景结构如下:
涉及到运维部分,我也不是很懂,抛去K8S后,结构清爽了些:
triton的一些优点
通过上述的两个结构图,可以大概知道triton的一些功能和特点:
- 支持HTTP/GRPC
- 支持多backend,TensorRT、libtorch、onnx、paddle、tvm啥的都支持,也可以自己custom,所以理论上所有backend都可以支持
- 单GPU、多GPU都可以支持,CPU也支持
- 模型可以在CPU层面并行执行
- 很多基本的服务框架的功能都有,模型管理比如热加载、模型版本切换、动态batch,类似于之前的tensorflow server
- 开源,可以自定义修改,很多问题可以直接issue,官方回复及时
- NVIDIA官方出品,对NVIDIA系列GPU比较友好,也是大厂购买NVIDIA云服务器推荐使用的框架
- 很多公司都在用triton,真的很多,不管是互联网大厂还是NVIDIA的竞品都在用,用户多代表啥不用我多说了吧
如何学习triton
两年前开始学习的时候,官方资料比较匮乏, 只能通过看源码来熟悉triton的使用方式,所幸知乎上有个关于TensorRT serving不错的教程,跟着看了几篇大致了解了triton的框架结构。那会triton叫做TensorRT serving,专门针对TensorRT设计的服务器框架,后来才变为triton,支持其他推理后端的。
现在triton的教程比较多了,官方的docs写着比较详细,还有issue中各种用例可以参考,B站上也有
视频教程,比两年前的生态要好了不少。
当然,最重要的,还是上手使用,然后看源码, 然后客制化。
源码学习
从triton的源码中可以学到:
- C++各种高级语法
- 设计模式
- 不同backend(libtorch、TensorRT、onnxruntime等)如何正确创建推理端,如何多线程推理
- C++多线程编程/互斥/队列
- API接口暴露/SDK设计
- CMAKE高级用法
等等等等,不列举了,对于程序员来说,好的源码就是好的学习资料。当然,也可以看老潘的文章哈。
triton系列教程计划
triton相关系列也会写一些文章,目前大概规划是这些:
- 什么是triton以及triton入门、triton编译、triton运行
- triton管理模型、调度模型的方式
- triton的backend介绍、自定义backend
- 自定义客户端,python和c++
- 高级特性、优先级、rate limiter等等
编译和安装
一般来说,如果想快速使用triton,直接使用官方的镜像最快。 但是官方镜像有个尴尬点,那就是编译好的镜像需要的环境一般都是最新的,和你的不一定一致 !
比如22.09版本的镜像需要的显卡驱动为520及以上,如果想满足自己的显卡驱动,就需要自行编译了。 官方也提供了使用镜像的快速使用方法:
# 第一步,创建 model repository
git clone -b r22.09 https://github.com/triton-inference-server/server.git
cd server/docs/examples
./fetch_models.sh
# 第二步,从 NGC Triton container 中拉取最新的镜像并启动
docker run --gpus=1 --rm --net=host -v ${PWD}/model_repository:/models nvcr.io/nvidia/tritonserver:22.09-py3 tritonserver --model-repository=/models
# 第三步,发送
# In a separate console, launch the image_client example from the NGC Triton SDK container
docker run -it --rm --net=host nvcr.io/nvidia/tritonserver:22.09-py3-sdk
/workspace/install/bin/image_client -m densenet_onnx -c 3 -s INCEPTION /workspace/images/mug.jpg
# Inference should return the following
Image '/workspace/images/mug.jpg':
15.346230 (504) = COFFEE MUG
13.224326 (968) = CUP
10.422965 (505) = COFFEEPOT
triton官方仓库
两年前的triton只有一个大仓库,tensorrt_backend也默认在triton主仓库中,但是现在tensorrt_backend被拆分出来了,很显然triton除了支持tensorrt还支持很多其他的后端,我们可以自定义使用很多后端。
现在是目前的triton包含的一些仓库:
- [server] triton服务外层框架,包含了http收发请求,服务内存分配等一些功能代码
- [core] triton主框架,如果处理请求、后端管理、模型调度啥的全在这里
- [common] 通用工具,没啥好说的,打日志的代码在这里
- [