使用模型服务网格自定义模型运行时

当您遇到多模型部署时存在差异化运行时环境需求,或者需要优化模型推理效率、控制资源分配的问题时,可以使用模型服务网格自定义模型运行时,通过精细配置运行环境,确保每个模型都能在最适宜的条件下执行,提升服务质量、降低成本,并简化复杂模型的运维管理工作。本文介绍如何使用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的步骤如下。

  1. 实现一个继承自MLServer的MLModel类。

    MLServer可以通过添加MLModel类的实现进行扩展,主要包括load()predict()两个函数。您可以根据具体需求,在load()函数中加载您的模型,并在predict()函数中执行预测操作。您也可以通过MLServer文档查看MLModel类的实现示例。

  2. 将模型类和依赖项打包到一个容器镜像中。

    实现模型类之后,您需要将其依赖项(包括MLServer)打包到一个支持ServingRuntime资源的镜像中。MLServer提供了一个有用的辅助程序,可以使用mlserver build命令来构建镜像。具体操作,请参见Building a custom image

  3. 使用该镜像创建新的ServingRuntime资源。

    1. 使用以下内容,创建一个新的ServingRuntime资源,并将其指向您刚创建的镜像。

      展开查看YAML

      apiVersion: serving.kserve.io/v1alpha1
      kind: ServingRuntime
      metadata:
        name: {{CUSTOM-RUNTIME-NAME}}
      spec:
        supportedModelFormats:
          - name: {{MODEL-FORMAT-NAMES}}
            version: "1"
            autoSelect: true
        multiModel: true
        grpcDataEndpoint: port:8001
        grpcEndpoint: port:8085
        containers:
          - name: mlserver
            image: {{CUSTOM-IMAGE-NAME}}
            env:
              - name: MLSERVER_MODELS_DIR
                value: "/models/_mlserver_models/"
              - name: MLSERVER_GRPC_PORT
                value: "8001"
              - name: MLSERVER_HTTP_PORT
                value: "8002"
              - name: MLSERVER_LOAD_MODELS_AT_STARTUP
                value: "false"
              - name: MLSERVER_MODEL_NAME
                value: dummy-model
              - name: MLSERVER_HOST
                value: "127.0.0.1"
              - name: MLSERVER_GRPC_MAX_MESSAGE_LENGTH
                value: "-1"
            resources:
              requests:
                cpu: 500m
                memory: 1Gi
              limits:
                cpu: "5"
                memory: 1Gi
        builtInAdapter:
          serverType: mlserver
          runtimeManagementPort: 8001
          memBufferBytes: 134217728
          modelLoadingTimeoutMillis: 90000

      字段

      说明

      {{CUSTOM-RUNTIME-NAME}}

      运行时的名称,例如my-model-server-0.x。

      {{MODEL-FORMAT-NAMES}}

      该运行时将支持的模型格式列表,例如支持模型自定义格式my-model。在部署该格式的模型时,ModelMesh会查找这些格式并找到合适的运行时环境。

      {{CUSTOM-IMAGE-NAME}}

      步骤2创建的镜像。

    2. 执行以下命令,创建ServingRuntime资源。

      kubectl apply -f ${实际YAML名称}.yaml

      创建完成后,您可以在ModelMesh部署中看到新的自定义运行时。

步骤二:部署模型

为了使用新创建的运行时部署模型,您需要创建一个InferenceService资源来提供模型服务。该资源是 KServe和ModelMesh用于管理模型的主要接口,代表了模型在推理中的逻辑端点。

  1. 使用以下内容,创建一个InferenceService资源来提供模型服务。

    展开查看YAML

    apiVersion: serving.kserve.io/v1beta1
    kind: InferenceService
    metadata:
      name: my-model-sample
      namespace: modelmesh-serving
      annotations:
        serving.kserve.io/deploymentMode: ModelMesh
    spec:
      predictor:
        model:
          modelFormat:
            name: my-model
          runtime: my-model-server
          storage:
            key: localMinIO
            path: sklearn/mnist-svm.joblib
    

    在YAML中,InferenceService命名为my-model-sample,并声明其模型格式为my-model,与之前创建的示例自定义运行时使用相同的格式。同时,还传递了一个可选字段runtime,明确告诉ModelMesh使用my-model-server-0.x运行时来部署此模型。最后,storage字段指向模型所在的位置,本示例使用ModelMesh Serving的快速入门指南部署的localMinIO实例。

  2. 执行以下命令,部署InferenceService资源。

    kubectl apply -f ${实际YAML名称}.yaml