当您遇到多模型部署时存在差异化运行时环境需求,或者需要优化模型推理效率、控制资源分配的问题时,可以使用模型服务网格自定义模型运行时,通过精细配置运行环境,确保每个模型都能在最适宜的条件下执行,提升服务质量、降低成本,并简化复杂模型的运维管理工作。本文介绍如何使用ModelMesh Serving自定义模型运行时。
前提条件
已添加集群到ASM实例,且ASM实例版本为1.18.0.134及以上。
功能介绍
ModelMesh默认集成了以下模型服务器运行环境。
模型服务器 | 开发公司/社区 | 适用框架 | 功能特点 |
Triton Inference Server | NVIDIA | TensorFlow、PyTorch、TensorRT、ONNX等 | 高性能、可扩展、低延迟推理服务,提供管理和监控工具。 |
MLServer | Seldon | SKLearn、XGBoost、LightGBM等 | 统一接口和框架,支持多种框架和高级功能。 |
OpenVINO Model Server | Intel | OpenVINO、ONNX等 | 利用英特尔硬件加速技术,支持多种框架。 |
TorchServe | PyTorch社区 | PyTorch(包含eager模式) | 轻量级、可扩展的PyTorch模型服务器。 |
如果以上模型服务器无法满足您的特定要求,例如需要处理推理的自定义逻辑,或者您的模型所需的框架不在上述支持列表中,可以自定义服务运行时来进行扩展支撑。
步骤一:自定义服务运行时
命名空间范围的ServingRuntime和集群范围的ClusterServingRuntime定义为一个或多个特定模型格式提供服务的Pod模板。它们包括了运行时的容器镜像、支持的模型格式列表等关键信息。运行时的其他配置可以通过Spec中的环境变量传递。
ServingRuntime CRD具有较好的灵活性和可扩展性。您可以自定义可重用的运行时,而无需修改ModelMesh控制器代码或控制器命名空间中的其他资源。您可以轻松构建一个自定义运行时,以支持您所需的框架。
要创建自定义的Serving Runtime,您可以构建一个支持所需框架的新容器镜像,然后创建一个使用该镜像的ServingRuntime资源。如果所需运行时的框架使用Python绑定,则特别容易实现。您可以使用MLServer的扩展点来添加额外的框架。MLServer提供了一种服务接口,ModelMesh Serving则作为将其集成为ServingRuntime的桥梁。
构建基于Python的自定义Serving Runtime的步骤如下。
实现一个继承自MLServer的MLModel类。
MLServer可以通过添加MLModel类的实现进行扩展,主要包括
load()
和predict()
两个函数。您可以根据具体需求,在load()
函数中加载您的模型,并在predict()
函数中执行预测操作。您也可以通过MLServer文档查看MLModel类的实现示例。将模型类和依赖项打包到一个容器镜像中。
实现模型类之后,您需要将其依赖项(包括MLServer)打包到一个支持ServingRuntime资源的镜像中。MLServer提供了一个有用的辅助程序,可以使用
mlserver build
命令来构建镜像。具体操作,请参见Building a custom image。使用该镜像创建新的ServingRuntime资源。
使用以下内容,创建一个新的ServingRuntime资源,并将其指向您刚创建的镜像。
字段
说明
{{CUSTOM-RUNTIME-NAME}}
运行时的名称,例如my-model-server-0.x。
{{MODEL-FORMAT-NAMES}}
该运行时将支持的模型格式列表,例如支持模型自定义格式my-model。在部署该格式的模型时,ModelMesh会查找这些格式并找到合适的运行时环境。
{{CUSTOM-IMAGE-NAME}}
步骤2创建的镜像。
执行以下命令,创建ServingRuntime资源。
kubectl apply -f ${实际YAML名称}.yaml
创建完成后,您可以在ModelMesh部署中看到新的自定义运行时。
步骤二:部署模型
为了使用新创建的运行时部署模型,您需要创建一个InferenceService资源来提供模型服务。该资源是 KServe和ModelMesh用于管理模型的主要接口,代表了模型在推理中的逻辑端点。
使用以下内容,创建一个InferenceService资源来提供模型服务。
在YAML中,InferenceService命名为
my-model-sample
,并声明其模型格式为my-model
,与之前创建的示例自定义运行时使用相同的格式。同时,还传递了一个可选字段runtime
,明确告诉ModelMesh使用my-model-server-0.x运行时来部署此模型。最后,storage
字段指向模型所在的位置,本示例使用ModelMesh Serving的快速入门指南部署的localMinIO实例。执行以下命令,部署InferenceService资源。
kubectl apply -f ${实际YAML名称}.yaml