【译】 英伟达Triton推理服务(一)Triton Architecture - 知乎 (zhihu.com)
NVIDIA Triton 助力蚂蚁集团打造新一代推理引擎 - 知乎 (zhihu.com)
以上图片展示的是Triton Inference Server的高层级的架构。其中Model Respository 是一个基于文件系统的模型仓库,Triton通过仓库中的模型进行推理。推理服务的requests请求通过HTTP/REST,或GRPC,或者C API进行调用,然后发送到每个对应的模型调度器scheduler。Triton 实现了多种调度与攒batch算法,这些调度和算法可以通过对每个模型的配置来运行。每一个模型的调度器对服务请求进行推理前的攒batch(可选的),并将请求根据不同的模型类型(例如Tensort Engine, tensorflow 模型)传递给后端(backend)相应的推理引擎进行推理。后端使用攒好batch的作为输入进行推理,然后产生请求对应的输出。这些输出最终被返回。
Triton支持后端C API,使得Triton可方便的被拓展。Triton既可拓展预处理与后处理,也甚至可以拓展一种新的深度学习框架作为后端。
在Triton中使用的模型,能够被专用的模型管理API进行访问或者控制,这些API可以是HTTP/REST或GRPC,或者C API。
Triton很方便就能够被其他应用框架集成,例如Kubernets。
模型的并发执行
Triton框架能够在同样的系统中并行的执行一个模型的多个实例,或者多个模型。这些系统中通常可能没有GPU,或者有一个甚至多个GPU。
每个模型,默认只会执行1个实例。即同时只能有1个request或者batch在其上执行。可以配置成多个实例,这样这个模型的多个实例就能并行执行(同时占用更多GPU或CPU)。
有状态模型
支持无状态模型和有状态模型。
无状态模型:各个request是独立的,可以分发给不同的模型实例。
有状态模型:同属于1个序列的requests,只能分发给同一个模型实例。
集成模型
一个集成模型(ensemble models)代表着一个pipeline,这个pipeline可以有一个或多个模型,并且这些模型的输入和输出之间时有连接关系的。集成模型用于封装一个多模型的推理过程,例如“数据预处理->推理->数据后处理”。使用集成模型的目的在于节省中间过程的张量的传输(client和Triton Server之间的网络传输),并最大限度减少必须发送到Triton的请求数量。
集成调度器(ensemble scheduler)必须用于集成模型,无论集成种的模型使用何种调度器。“一个”集成模型并不是一个真实的模型。实际上它规定了集成模型中各个模型之间的数据流向,这个数据流向以 “ModelEnsembling::Step”的形式定义在模型配置中。调度器在每一个“step”收集输出的tensors,并将这些tensors以输入的形式供下游模型使用。尽管如此,集成模型在外部来看被视作单个模型。
在蚂蚁集团的应用
蚂蚁集团选择采用 NVIDIA Triton 推理服务器,以解决新场景下模型推理引擎面临的挑战。
NVIDIA Triton 是一款开源软件,对于所有推理模式都可以简化模型在任一框架中以及任何 GPU 或 CPU 上的运行方式,从而在生产环境中使用 AI。Triton 支持多模型ensemble,以及 TensorFlow、PyTorch、ONNX 等多种深度学习模型框架,可以很好的支持多模型联合推理的场景,构建起视频、图片、语音、文本整个推理服务过程,大大降低多个模型服务的开发和维护成本。
Dynamic-batch 和 Multi-stream,以及对 TensorRT 的支持,同时配合 T4 的 GPU,将整体推理服务的吞吐能力大幅提升 2.4 倍,延迟降低 20%,既满足了业务的低延时需求,成本也降低了 50%。
NVIDIA DALI 是 GPU 加速的数据增强和图像加载库,能够与面向 MxNet、TensorFlow 和 PyTorch 的直接插件轻松实现框架整合,可优化深度学习框架的数据管道,解决当今计算机视觉深度学习应用的性能瓶颈问题。蚂蚁集团利用其图像预处理能力结合到 Triton 的 DALI backend,替换掉原来的解码、resize 等操作,端到端性能提升 20% 。
Metrics 和 Perf Analysis 有很强大的能力,可以快速定位开发调试,甚至是线上问题,对于开发和定位问题的效率有很大提升。
借助NVIDIA Triton 推理框架,配合 DALI 的图像预处理能力,以及 T4 GPU,多模型推理性能整体提升 2.4 倍,帮助蚂蚁业务在多模态业务场景中,以更低的成本构建了高性能的推理服务,同时更低的延迟降低了整条系统链路的响应时间,优化了用户体验。