全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用模型服務網格進行多模型推理服務

更新時間:Jun 30, 2024

當您需要同時運行多個機器學習模型並進行推理時,可以使用模型服務網格部署和管理多模型推理服務。模型服務網格基於KServe ModelMesh實現,針對大容量、高密度和頻繁變化的模型用例進行了最佳化,可以智能地將模型載入到記憶體中或從記憶體中卸載,以在響應性和計算之間取得平衡,簡化多模型推理服務的部署和營運,提高推理效率和效能。

前提條件

說明

本文使用ASM入口網關作為叢集網關,網關名稱為預設的ingressgateway,開放8008連接埠,協議為HTTP。

功能介紹

模型服務網格提供了以下功能:

功能

說明

緩衝管理

  • Pod作為根據使用頻率和最近訪問時間自動進行最佳化和管理。

  • 根據使用頻率和當前請求量,載入和卸載模型的副本。

智能放置和載入

  • 模型放置通過Pod之間的緩衝壽命和請求負載來平衡。

  • 使用隊列來處理並行存取模型載入,並最大限度地減少對運行時流量的影響。

彈性

失敗的模型載入會在不同的Pod中自動重試。

操作簡便性

自動和無縫地處理滾動模型更新。

步驟一:在ASM中開啟ModelMesh功能

  1. 登入ASM控制台,在左側導覽列,選擇服務網格 > 網格管理

  2. 網格管理頁面,單擊目標執行個體名稱,然後在左側導覽列,選擇生態整合中心 > KServe on ASM

  3. KServe on ASM頁面,單擊安裝模型服務網格, 開啟ModelMesh功能。

    注意:KServe依賴於CertManager,安裝KServe會自動安裝CertManager組件。如需使用自建CertManager,請關閉在叢集中自動安裝CertManager組件

  4. 等待幾分鐘就緒之後, 在ACK叢集對應的KubeConfig環境下,執行以下命令,確認ServingRuntime資源是否可用。

  5. kubectl get servingruntimes -n modelmesh-serving

    預期輸出:

    NAME                DISABLED   MODELTYPE     CONTAINERS   AGE
    mlserver-1.x                   sklearn       mlserver     1m
    ovms-1.x                       openvino_ir   ovms         1m
    torchserve-0.x                 pytorch-mar   torchserve   1m
    triton-2.x                     keras         triton       1m

    ServingRuntime定義為一個或多個特定模型格式提供服務的Pod模板,根據部署的模型的架構,會自動提供相應的Pod。

    目前預設包含的運行時及支援的模型格式如下。詳細資料,請參見supported-model-formats。如果這些模型伺服器不能滿足您的所有特定要求,可以自訂模型運行時。具體操作,請參見使用模型服務網格自訂模型運行時

    模型服務運行時

    支援的模型架構

    mlserver-1.x

    sklearn、xgboost、lightgbm

    ovms-1.x

    openvino_ir、onnx

    torchserve-0.x

    pytorch-mar

    triton-2.x

    tensorflow、pytorch、onnx、tensorrt

步驟二:配置ASM環境

  1. 從Kubernetes叢集同步命名空間到ASM中, 具體操作,請參見從資料平面叢集同步自動注入標籤至ASM執行個體。 同步之後, 確認命名空間modelmesh-serving已經存在。

  2. 建立入口網關規則。

    1. 使用以下內容,建立grpc-gateway.yaml。

      展開查看grpc-gateway.yaml

      apiVersion: networking.istio.io/v1beta1
      kind: Gateway
      metadata:
        name: grpc-gateway
        namespace: modelmesh-serving
      spec:
        selector:
          istio: ingressgateway
        servers:
          - hosts:
              - '*'
            port:
              name: grpc
              number: 8008
              protocol: GRPC
      
    2. 在ASM叢集(執行個體)對應的KubeConfig環境下,執行以下命令,建立網關規則。

      kubectl apply -f grpc-gateway.yaml
  3. 建立虛擬服務。

    1. 使用以下內容,建立vs-modelmesh-serving-service.yaml。

      展開查看vs-modelmesh-serving-service.yaml

      apiVersion: networking.istio.io/v1beta1
      kind: VirtualService
      metadata:
        name: vs-modelmesh-serving-service
        namespace: modelmesh-serving
      spec:
        gateways:
          - grpc-gateway
        hosts:
          - '*'
        http:
          - match:
              - port: 8008
            name: default
            route:
              - destination:
                  host: modelmesh-serving
                  port:
                    number: 8033
      
    2. 在ASM叢集(執行個體)對應的KubeConfig環境下,執行以下命令,建立虛擬服務。

      kubectl apply -f vs-modelmesh-serving-service.yaml
  4. 配置gRPCJSON轉碼器。

    1. 使用以下內容,建立grpcjsontranscoder-for-kservepredictv2.yaml。

      apiVersion: istio.alibabacloud.com/v1beta1
      kind: ASMGrpcJsonTranscoder
      metadata:
        name: grpcjsontranscoder-for-kservepredictv2
        namespace: istio-system
      spec:
        builtinProtoDescriptor: kserve_predict_v2
        isGateway: true
        portNumber: 8008
        workloadSelector:
          labels:
            istio: ingressgateway
    2. 在ASM叢集(執行個體)對應的KubeConfig環境下,執行以下命令,部署gRPC-Json-Transcoder。

      kubectl apply -f grpcjsontranscoder-for-kservepredictv2.yaml
    3. 使用以下內容,建立grpcjsontranscoder-increasebufferlimit.yaml,設定per_connection_buffer_limit_bytes,以提升響應的大小。

      展開查看grpcjsontranscoder-increasebufferlimit.yaml

      apiVersion: networking.istio.io/v1alpha3
      kind: EnvoyFilter
      metadata:
        labels:
          asm-system: "true"
          manager: asm-voyage
          provider: asm
        name: grpcjsontranscoder-increasebufferlimit
        namespace: istio-system
      spec:
        configPatches:
        - applyTo: LISTENER
          match:
            context: GATEWAY
            listener:
              portNumber: 8008
            proxy:
              proxyVersion: ^1.*
          patch:
            operation: MERGE
            value:
              per_connection_buffer_limit_bytes: 100000000
        workloadSelector:
          labels:
            istio: ingressgateway
      
    4. 在ASM叢集(執行個體)對應的KubeConfig環境下,執行以下命令,部署EnvoyFilter。

      kubectl apply -f grpcjsontranscoder-increasebufferlimit.yaml

步驟三:部署模型樣本

  1. 建立儲存類StorageClass。更多資訊,請參見使用NAS動態儲存裝置卷

    1. 登入Container Service管理主控台,在左側導覽列選擇叢集

    2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇儲存 > 儲存類

    3. 儲存類頁面右上方,單擊建立,配置如下資訊,然後建立

      Dingtalk_20231107170754.png

  2. 建立儲存聲明PVC。

    1. 使用以下內容,建立儲存聲明my-models-pvc.yaml。

      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: my-models-pvc
        namespace: modelmesh-serving
      spec:
        accessModes:
          - ReadWriteMany
        resources:
          requests:
            storage: 1Gi
        storageClassName: alibabacloud-cnfs-nas
        volumeMode: Filesystem
    2. 在ACK叢集對應的KubeConfig環境下,執行以下命令,建立儲存聲明。

      kubectl apply -f my-models-pvc.yaml
    3. 執行以下命令,查看modelmesh-serving命名空間下的PVC。

      kubectl get pvc -n modelmesh-serving

      預期輸出:

      NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS            AGE
      my-models-pvc    Bound    nas-379c32e1-c0ef-43f3-8277-9eb4606b53f8   1Gi        RWX            alibabacloud-cnfs-nas   2h
  3. 建立Pod以訪問PVC。

    為了使用新的PVC,需要將其作為卷安裝到Kubernetes Pod,然後使用該Pod將模型檔案上傳到持久卷。

    1. 使用以下內容,建立pvc-access.yaml。

      以下YAML表示建立一個pvc-access Pod,並要求Kubernetes控制器通過指定“my-models-pvc”來聲明之前請求的PVC。

      apiVersion: v1
      kind: Pod
      metadata:
        name: "pvc-access"
      spec:
        containers:
          - name: main
            image: ubuntu
            command: ["/bin/sh", "-ec", "sleep 10000"]
            volumeMounts:
              - name: "my-pvc"
                mountPath: "/mnt/models"
        volumes:
          - name: "my-pvc"
            persistentVolumeClaim:
              claimName: "my-models-pvc"
    2. 在ACK叢集對應的KubeConfig環境下,執行以下命令,建立Pod。

      kubectl apply  -n modelmesh-serving  -f pvc-access.yaml
    3. 確認pvc-access Pod處於運行狀態。

      kubectl get pods -n modelmesh-serving | grep pvc-access

      預期輸出:

      pvc-access             1/1     Running   0          51m
  4. 將模型儲存在持久卷上。

    將AI模型添加到儲存卷中。本文將使用scikit-learn訓練的MNIST手寫數字字元識別模型。您可以從kserve/modelmesh-minio-examples倉庫下載mnist-svm.joblib模型檔案的副本。

    1. 在ACK叢集對應的KubeConfig環境下,執行以下命令,將mnist-svm.joblib模型檔案複製到pvc-access Pod的/mnt/models檔案夾中。

      kubectl -n modelmesh-serving cp mnist-svm.joblib pvc-access:/mnt/models/
    2. 執行以下命令,確認Model已經載入成功。

      kubectl -n modelmesh-serving exec -it pvc-access -- ls -alr /mnt/models/

      預期輸出:

      -rw-r--r-- 1  501 staff 344817 Oct 30 11:23 mnist-svm.joblib
  5. 部署推理服務。

    1. 使用以下內容,建立sklearn-mnist.yaml。

      展開查看sklearn-mnist.yaml

      apiVersion: serving.kserve.io/v1beta1
      kind: InferenceService
      metadata:
        name: sklearn-mnist
        namespace: modelmesh-serving
        annotations:
          serving.kserve.io/deploymentMode: ModelMesh
      spec:
        predictor:
          model:
            modelFormat:
              name: sklearn
            storage:
              parameters:
                type: pvc
                name: my-models-pvc
              path: mnist-svm.joblib
    2. 在ACK叢集對應的KubeConfig環境下,執行以下命令,部署sklearn-mnist推理服務。

      kubectl apply -f sklearn-mnist.yaml
    3. 等待幾十秒後(時間取決於鏡像拉取速度),執行以下命令,查看sklearn-mnist推理服務是否部署成功。

      kubectl get isvc -n modelmesh-serving

      預期輸出:

      NAME            URL                                               READY
      sklearn-mnist   grpc://modelmesh-serving.modelmesh-serving:8033   True
  6. 運行推理服務。

    使用curl命令發送推理請求到sklearn-mnist模型。資料數組表示待分類的數位影像掃描中64個像素的灰階值。

    MODEL_NAME="sklearn-mnist"
    ASM_GW_IP="ASM網關IP地址"
    curl -X POST -k "http://${ASM_GW_IP}:8008/v2/models/${MODEL_NAME}/infer" -d '{"inputs": [{"name": "predict", "shape": [1, 64], "datatype": "FP32", "contents": {"fp32_contents": [0.0, 0.0, 1.0, 11.0, 14.0, 15.0, 3.0, 0.0, 0.0, 1.0, 13.0, 16.0, 12.0, 16.0, 8.0, 0.0, 0.0, 8.0, 16.0, 4.0, 6.0, 16.0, 5.0, 0.0, 0.0, 5.0, 15.0, 11.0, 13.0, 14.0, 0.0, 0.0, 0.0, 0.0, 2.0, 12.0, 16.0, 13.0, 0.0, 0.0, 0.0, 0.0, 0.0, 13.0, 16.0, 16.0, 6.0, 0.0, 0.0, 0.0, 0.0, 16.0, 16.0, 16.0, 7.0, 0.0, 0.0, 0.0, 0.0, 11.0, 13.0, 12.0, 1.0, 0.0]}}]}'

    JSON響應如下,表示推斷掃描的數字是8

    {
     "modelName": "sklearn-mnist__isvc-3c10c62d34",
     "outputs": [
      {
       "name": "predict",
       "datatype": "INT64",
       "shape": [
        "1",
        "1"
       ],
       "contents": {
        "int64Contents": [
         "8"
        ]
       }
      }
     ]
    }

相關文檔

  • 當您遇到多模型部署時存在差異化運行時環境需求,或者需要最佳化模型推理效率、控制資源分派的問題時,可以使用模型服務網格自訂模型運行時,通過精細配置運行環境,確保每個模型都能在最適宜的條件下執行。具體操作,請參見使用模型服務網格自訂模型運行時

  • 當您需要處理大量自然語言資料或希望建立複雜的語言理解系統時,可以將大語言模型轉化為推理服務。具體操作,請參見將大語言模型轉化為推理服務

  • 當您的Pod在運行時出現異常,請參見Pod異常問題排查