全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用模型服務網格自訂模型運行時

更新時間:Jun 30, 2024

當您遇到多模型部署時存在差異化運行時環境需求,或者需要最佳化模型推理效率、控制資源分派的問題時,可以使用模型服務網格自訂模型運行時,通過精細配置運行環境,確保每個模型都能在最適宜的條件下執行,提升服務品質、降低成本,並簡化複雜模型的營運管理工作。本文介紹如何使用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