相关文章推荐
沉着的沙滩裤  ·  【feign】SpringCloud ...·  7 月前    · 
发财的移动电源  ·  javascript - ...·  1 年前    · 
光明磊落的熊猫  ·  clion bazel 配置-掘金·  1 年前    · 

机器学习推理服务部署方案概览

机器学习模型的部署可以分成两个方面:一是在移动端/设备端的部署,比较偏嵌入式;另一个是云端/服务端,和其他云端服务的部署比较相似,但是也有自己的特点。比如:

1)对GPU等异构硬件的需求。

2)除服务本身,一般还有请求的前处理/后处理的逻辑。在更加复杂的场景下,可能还会涉及到模型与模型间的关联。比如在 OCR 场景中,有时需要一个模型先对图片进行悬正(就是把图片摆正),再把悬正好的输出作为接下来的模型的输入,进行下一步的处理。模型与模型,模型与前处理后处理逻辑等组成一个有向无环的推理图(DAG)。

这里主要关注后者。

云端/服务端模型部署也分为两类:一种是主要着力于 解决推理性能问题 ,提高推理速度的框架。这一类里有诸如Tensorflow社区的tensorflow serving、NVIDIA基于TensorRT的Triton(原TensorRT Serving),微软的onnx-runtime等。这一类框架基本都是基于C++实现的。将模型转化为某一特定形式(转化的过程中可能伴有一些优化的操作), 再以C++运行时载入,向外暴露RestFul/RPC接口,对外提供服务。在实际生产环境中使用这类模型服务部署框架,通常需要围绕模型服务自行实现 模型自动发布,模型灰度发布,模型版本管理,服务监控,线上流量复制 等一系列功能,工程量较大。

另一类框架主要着眼于 对模型部署过程中的整个模型的生命周期进行管理,降低模型部署的工程量 。这一类框架有seldon、kf-serving等。这类框架提供了模型部署过程中的一整套功能,在实际模型部署落地时的工程量很小。但是性能一般不如前一类框架。

下面对业界主流的机器学习模型部署框架做一个简单的调研梳理。为了行文简洁,在本文中,我们将第一种框架称为 模型服务器 ,只负责将模型封装为RestFul/RPC服务。第二种框架我们称为 模型部署平台 ,包括以模型服务为核心的一整套工程化解决方案。

模型服务器

模型服务器主要负责封装模型前向计算过程并以服务的形式暴露。因此,在模型服务器中主要关注以下几个方面:

  • 请求处理性能:服务器的实现方式(C++/Java/Python)
  • 前向计算性能:调用推理引擎的接口(C++/Python),推理引擎的性能
  • 异构硬件支持:CPU/GPU
  • 请求处理方式:serial/batch
  • 模型并发:多模型,多模型版本并发
  • 模型格式:单一模型格式/多种模型格式
  • 通信协议:Restful/GRPC

TF-Serving

TF-Serving是Tensorflow社区推出的模型服务部署框架,原生支持Tensorflow模型的部署,但是也支持扩展支持其他格式的机器学习模型。

TF-Serving全部采用C++进行实现,直接调用tensorflow runtime 的C++接口进行模型的前向推理计算,因此请求处理性能上表现良好。但是TF-Serving直接使用Tensorflow作为推理引擎,也没有针对推理计算的特点对模型做特别的优化,因此在推理计算引擎的性能

表现上不如针对推理场景做过特别优化的计算引擎,如TensorRT。


TF-Serving架构图

主要特性

  • Can serve multiple models, or multiple versions of the same model simultaneously
  • Exposes both gRPC as well as HTTP inference endpoints
  • Allows deployment of new model versions without changing any client code
  • Supports canarying new versions and A/B testing experimental models
  • Adds minimal latency to inference time due to efficient, low-overhead implementation
  • Features a scheduler that groups individual inference requests into batches for joint execution on GPU, with configurable latency controls
  • Supports many servables: Tensorflow models, embeddings, vocabularies, feature transformations and even non-Tensorflow-based machine learning models

Multi-model-server

Multi-model-server是aws推出的针对模型部署的模型服务器,可以做到跨机器学习框架。

HTTP Server部分基于Java服务框架Netty实现,server部分性能和C++实现基本对齐。但是推理计算时直接调用相应运行框架的python接口,不如C++接口高效。

另外,用户需要自定义预处理,推理,后处理handler。虽然一方面增加了灵活性,支持跨平台特性,但是易用性不足。

主要特性

  • Rest API
  • ONNX model export: Support for models from a wide range of deep learning frameworks
  • automatically scale backend workers to the number equal to available vCPUs (if you run on CPU instance) or to the number of available GPUs (if you run on GPU instance)
  • Custom Services
  • Serving Multiple Models
  • Batch Inference
  • Logging and Metrics

TorchServe

TorchServe是Pytorch社区推出的用于部署Pytorch模型的推理服务框架,其实是基于Multi-model-server框架添加了针对Torch的特性发展而来,可以看作Multi-model-server的一个fork分支,不过多叙述。



总体上看,TorchServe和multi-model-server在实现方式和性能表现上都不够成熟。具体内容可参考讨论帖: zhihu.com/question/3897

Triton

Triton是Nvidia发布的高性能推理服务框架,支持多种推理引擎后端,如TensorFlow, TensorRT, PyTorch, ONNX 等。Server采用C++实现,并采用C++ API调用推理计算引擎,保障了请求处理的性能表现。在推理计算方面,Triton支持多模型并发,动态batch等功能,能够提高GPU的使用率,改善推理服务的性能。

Triton不仅支持单模型部署,也支持多模型ensemble,可以很好的支持多模型联合推理的场景,构建起视频、图片、语音、文本整个推理服务过程,大大降低多个模型服务的开发和维护成本。



主要特性

  • Multiple deep-learning frameworks. Triton can manage any number and mix of models (limited by system disk and memory resources). Triton supports TensorRT, TensorFlow GraphDef, TensorFlow SavedModel, ONNX, PyTorch TorchScript and OpenVINO model formats. Both TensorFlow 1.x and TensorFlow 2.x are supported. Triton also supports TensorFlow-TensorRT and ONNX-TensorRT integrated models.
  • Concurrent model execution. Multiple models (or multiple instances of the same model) can run simultaneously on the same GPU or on multiple GPUs.
  • Dynamic batching. For models that support batching, Triton implements multiple scheduling and batching algorithms that combine individual inference requests together to improve inference throughput. These scheduling and batching decisions are transparent to the client requesting inference.
  • Extensible backends. In addition to deep-learning frameworks, Triton provides a backend API that allows Triton to be extended with any model execution logic implemented in Python or C++, while still benefiting from the CPU and GPU support, concurrent execution, dynamic batching and other features provided by Triton.
  • Model pipelines. Triton ensembles represents a pipeline of one or more models and the connection of input and output tensors between those models. A single inference request to an ensemble will trigger the execution of the entire pipeline.
  • HTTP/REST and GRPC inference protocols based on the community developed KFServing protocol.
  • A C API allows Triton to be linked directly into your application for edge and other in-process use cases.
  • Metrics indicating GPU utilization, server throughput, and server latency. The metrics are provided in Prometheus data format.

BentoML

BentoML提供了一种部署不同格式模型服务的 统一标准格式 ,核心逻辑是封装不同框架的前向推理过程,并以服务的形式暴露。

BentoML server采用Python Flask实现,并且调用框架前向推理全部通过Python API,在推理请求处理的性能上不占优势。



主要特性

  • Support multiple ML frameworks including PyTorch, TensorFlow, Scikit-Learn, XGBoost, and many more
  • Containerized model server for production deployment with Docker, Kubernetes, OpenShift, AWS ECS, Azure, GCP GKE, etc
  • Adaptive micro-batching for optimal online serving performance
  • Discover and package all dependencies automatically, including PyPI, conda packages and local python modules
  • Serve compositions of multiple models
  • Serve multiple endpoints in one model server
  • Serve any Python code along with trained models
  • Automatically generate REST API spec in Swagger/OpenAPI format
  • Prediction logging and feedback logging endpoint
  • Health check endpoint and Prometheus /metrics endpoint for monitoring

模型部署平台

模型部署平台的定位是model orchestration framework,将模型服务器容器化封装之后,在K8S平台上进行调度。这类框架有Seldon Core和KF-Serving。

Seldon Core

Seldon Core目前是在 Kubernetes 上运行机器学习推理负载方面最受欢迎的项目之一,是构建在Kubernetes上的机器学习模型部署的一整套解决方案。

模型服务器

前文介绍的模型服务器只是Seldon Core的一个组成部分。Seldon Core有很多预装备的模型服务器,如TF-Serving Server, Triton Server, XGBoost Server, SKLearn Server等。Seldon Core也支持用户自定义Server,扩展性好。通过这种机制,Seldon Core可以支持所有主流的机器学习模型的部署。



推理图

Seldon Core既可以支持单模型的简单部署场景,也支持复杂的推理图的部署场景。如下图所示,在图中的第二个复杂的推理图,一共展示了四个特殊的模型服务的步骤组成的工作流。首先是 Explanation,它负责进行模型的解释。接下来是异常值检测,然后是特征转换 Transformer,最后是通过一个 Router,将流量路由到 A,B,C 三个模型中表现最好的模型中。



主要组件

为了支持复杂推理图的构建,Seldon Core抽象了5个组件:

  • Model
  • Router
  • Combiner
  • Transformer
  • Output_Transformer



其中 Model 是模型,提供 REST 和 gRPC 服务。值得一提的是,Seldon Core 的模型是进行了封装的,提供的是封装后的 API,其输入和输出的格式都是统一的。

Router 是一个路由组件,但是除了路由功能之外,其还接受来自各个路由的节点的 reward feedback(激励反馈),支持实现多臂老虎机的逻辑。

Combiner 是一个跟 Router 类似的组件,区别在于它不是路由到某个节点,而是将其下所有的节点的输出进行结合,输出一个结合后的唯一的返回。

Transformer 和 Output_Transformer 是类似的组件,负责做输入与输出的转换,可以理解为是预处理和后处理的过程。

使用的时候,用户可以可以编写SeldonDeployment配置文件来构建推理图,如下图所示:


推理图构建好之后,当推理请求到来的时候,由orchestrator组件接收请求,再根据用户指定的推理图,进行请求的转发,如下图所示。



主要特性

除了推理图功能外,Seldon Core还支持很多其他的功能,如:

  • Advanced Metrics
  • Request Logging
  • Explainers
  • Outlier Detectors
  • A/B Tests
  • Canaries and more.


参考资料

zhuanlan.zhihu.com/p/14

docs.seldon.io/projects

Kubeflow/KF-Serving


KF-Serving是Kubeflow社区提供的构建在Kubernetes之上的推理服务解决方案。其主要开发人员中也有Seldon Core的核心开发人员,所以KF-Serving的很多设计理念都有Seldon Core的影子。




模型服务器

KF-Serving支持Tensorflow, Triton, XGBoost, SKLearn, ONNX, Pytorch等预置的模型服务器,同时也支持用户自定义服务器,因此KF-Serving可以支持所有主流机器学习模型的服务部署。

主要组件

像Seldon Core一样,KF-Serving也支持推理图模式,不过相对于Seldon Core,其推理图简化了很多,只有三个组件:

  • Transformer
  • Explainer(使用Seldon Alibi)
  • Predictor


其中 Transformer 支持对模型的预处理/后处理,为可选组件,无内置实现。

Expainer 支持对模型的解释,内置有 Seldon 开源的模型解释库 Alibi 支持,同样为可选组件。

Predictor 为真正的模型服务,为必需组件,内置有 TF,ONNX,Caffe 等格式的支持。


并且KF-Serving专注于单模型的服务部署,不像Seldon支持包含多个模型的复杂推理图。在KF-serving中,多模型部署的支持交给模型服务器负责,如Triton。





正因为KF-Serving做了很大程度的简化,所以去掉了负责流量编排的orchestrator组件,而改用SDK注入的方式处理流量在不同模块间的转发,需要侵入用户代码。


主要特性

  • Provide a Kubernetes Custom Resource Definition for serving ML models on arbitrary frameworks.
  • Encapsulate the complexity of autoscaling, networking, health checking, and server configuration to bring cutting edge serving features like GPU autoscaling, scale to zero, and canary rollouts to your ML deployments.
  • Enable a simple, pluggable, and complete story for your production ML inference server by providing prediction, pre-processing, post-processing and explainability out of the box.

Seldon Core和KF-Serving都是构建在K8S之上的推理服务解决方案,并且很多设计理念相似。以下是这两个解决方案的特性对比:



可见kf-serving和seldon core在功能上有很多相似的地方,而且从kf-serving road map来看,kf-serving也在计划添加route, combiner等功能,其功能设计和seldon core越来越接近了。

参考资料

kubeflow.org/docs/compo

kubeflow.org/docs/exter

github.com/kubeflow/kfs

发布于 2022-01-04 11:57