全部產品
Search
文件中心

Alibaba Cloud Service Mesh:使用KServe實現推理服務的金絲雀發布

更新時間:Jun 30, 2024

使用KServe實現推理服務的金絲雀發布,可以更好地管理和控制推理服務的部署過程,減少潛在錯誤和故障對使用者的影響,並確保推理服務的高可用性和穩定性。

功能介紹

KServe支援推理服務的金絲雀發布,它允許一個推理服務的新版本接收一部分流量。如果一個發布步驟失敗,金絲雀發布策略還可以復原到先前的修訂版。

在KServe中,最後一次成功發布的修訂版會接收100%的流量。canaryTrafficPercent欄位用於指定應該路由到新修訂版的流量百分比。根據canaryTrafficPercent的值,KServe會自動將流量分配給最後一次成功發布的修訂版和當前正在發布的修訂版。

當部署第一個修訂版的推理服務時,它將接收100%的流量。當部署多個修訂版時,例如步驟二,金絲雀發布策略配置為將10%的流量路由到新修訂版(LatestReadyRevision),90%的流量繼續流向之前的修訂版(LatestRolledoutRevision)。如果某個修訂版不健康或出現問題,流量將不會被路由到該修訂版,以確保穩定性和可靠性。

前提條件

已部署推理服務,且可以正常運行。具體操作,請參見ASM整合雲原生推理服務架構KServe

步驟一:查看推理服務的流量分配

前提條件的推理服務部署成功後,可以看到100%流量指向服務修訂版1的模型服務。

執行以下命令,查看sklearn-iris推理服務的相關資訊。

kubectl get isvc -n kserve-test sklearn-iris

預期輸出:

NAME           URL                                           READY   PREV   LATEST   PREVROLLEDOUTREVISION   LATESTREADYREVISION            AGE
sklearn-iris   http://sklearn-iris.kserve-test.example.com   True           100                              sklearn-iris-predictor-00001   79s

可以看到路由到LATEST列下的InferenceService的流量比例為100。

步驟二:使用金絲雀部署策略更新InferenceService

  1. 執行以下命令,將canaryTrafficPercent欄位添加到predictor組件,並更新storageUri來使用新的模型。

    kubectl apply -n kserve-test -f - <<EOF
    apiVersion: "serving.kserve.io/v1beta1"
    kind: "InferenceService"
    metadata:
      name: "sklearn-iris"
    spec:
      predictor:
        canaryTrafficPercent: 10
        model:
          modelFormat:
            name: sklearn
          storageUri: "gs://kfserving-examples/models/sklearn/1.0/model-2"
    EOF
    

    命令執行後,將更新sklearn-iris推理服務的配置。添加的canaryTrafficPercent欄位設定為10,表示將10%的流量分配給金絲雀模型(修訂版2),而其餘90%的流量將繼續指向之前的模型(修訂版1)。根據金絲雀發布的定義,流量將在最新就緒的修訂版2和之前推出的修訂版1之間進行分配。

  2. 執行以下命令,查看sklearn-iris推理服務的相關資訊。

    kubectl get isvc -n kserve-test sklearn-iris

    預期輸出:

    NAME           URL                                           READY   PREV   LATEST   PREVROLLEDOUTREVISION          LATESTREADYREVISION            AGE
    sklearn-iris   http://sklearn-iris.kserve-test.example.com   True    90     10       sklearn-iris-predictor-00001   sklearn-iris-predictor-00002   11m

    可以看到90%的流量指向了先前的模型服務(修訂版1),而10%的流量指向了當前的模型服務(修訂版2)。

  3. 執行以下命令,查看正在啟動並執行Pod資訊。

    kubectl get pod -n kserve-test

    預期輸出:

    NAME                                                       READY   STATUS    RESTARTS   AGE
    sklearn-iris-predictor-00001-deployment-7965bcc66-grdbq    2/2     Running   0          12m
    sklearn-iris-predictor-00002-deployment-6744dbbd8c-wfghv   2/2     Running   0          86s

    可以看到有兩個Pod分別為舊模型和新模型運行,並且有10%的流量路由到新模型。

    說明

    在Pod的名稱中,修訂版1的名稱中包含predictor-0001,修訂版2的名稱中包含predictor-0002

步驟三:切換到新版本

如果金絲雀模型運行良好並通過了驗證測試,您可以通過刪除canaryTrafficPercent欄位並重新應用InferenceService自訂資源來切換到新版本。

  1. 執行命令,刪除canaryTrafficPercent欄位並重新應用InferenceService自訂資源來切換到新版本。

    kubectl apply -n kserve-test -f - <<EOF
    apiVersion: "serving.kserve.io/v1beta1"
    kind: "InferenceService"
    metadata:
      name: "sklearn-iris"
    spec:
      predictor:
        model:
          modelFormat:
            name: sklearn
          storageUri: "gs://kfserving-examples/models/sklearn/1.0/model-2"
    EOF
    
  2. 執行以下命令,查看sklearn-iris推理服務的相關資訊。

    kubectl get isvc -n kserve-test sklearn-iris

    預期輸出:

    NAME           URL                                           READY   PREV   LATEST   PREVROLLEDOUTREVISION   LATESTREADYREVISION            AGE
    sklearn-iris   http://sklearn-iris.kserve-test.example.com   True           100                              sklearn-iris-predictor-00002   18m

    可以看到所有流量都路由新模型的修訂版2。

相關操作

復原到舊版本

您可以通過將當前模型服務(修訂版2)的canaryTrafficPercent設為0來復原到之前的模型服務(修訂版1)。設定後,將從修訂版2復原到修訂版1,並將修訂版2的流量減少到零。

  1. 執行以下命令,將模型服務(修訂版2)的流量設定為0%。

    kubectl apply -n kserve-test -f - <<EOF
    apiVersion: "serving.kserve.io/v1beta1"
    kind: "InferenceService"
    metadata:
      name: "sklearn-iris"
    spec:
      predictor:
        canaryTrafficPercent: 0
        model:
          modelFormat:
            name: sklearn
          storageUri: "gs://kfserving-examples/models/sklearn/1.0/model-2"
    EOF
    
  2. 執行以下命令,查看sklearn-iris推理服務的相關資訊。

    kubectl get isvc -n kserve-test sklearn-iris

    預期輸出:

    NAME           URL                                           READY   PREV   LATEST   PREVROLLEDOUTREVISION          LATESTREADYREVISION            AGE
    sklearn-iris   http://sklearn-iris.kserve-test.example.com   True    100    0        sklearn-iris-predictor-00001   sklearn-iris-predictor-00002   22m

    可以看到100%流量流向之前的模型服務(修訂版1)。

使用註解路由流量

您可以通過添加註解serving.kserve.io/enable-tag-routing來啟用基於標籤的路由,通過請求URL中的標籤明確地將流量路由到金絲雀模型(修訂版2)或舊模型(修訂版1)。

  1. 執行以下命令,應用金絲雀模型(修訂版2),並設定canaryTrafficPercent: 10serving.kserve.io/enable-tag-routing: "true"

    kubectl apply -n kserve-test -f - <<EOF
    apiVersion: "serving.kserve.io/v1beta1"
    kind: "InferenceService"
    metadata:
      name: "sklearn-iris"
      annotations:
        serving.kserve.io/enable-tag-routing: "true"
    spec:
      predictor:
        canaryTrafficPercent: 10
        model:
          modelFormat:
            name: sklearn
          storageUri: "gs://kfserving-examples/models/sklearn/1.0/model-2"
    EOF
    
  2. 執行以下命令,查看InferenceService的狀態。

    kubectl get isvc -n kserve-test sklearn-iris -oyaml
     ....
     status:
      address:
        url: http://sklearn-iris.kserve-test.svc.cluster.local
      components:
        predictor:
          address:
            url: http://sklearn-iris-predictor.kserve-test.svc.cluster.local
          latestCreatedRevision: sklearn-iris-predictor-00003
          latestReadyRevision: sklearn-iris-predictor-00003
          latestRolledoutRevision: sklearn-iris-predictor-00001
          previousRolledoutRevision: sklearn-iris-predictor-00001
          traffic:
          - latestRevision: true
            percent: 10
            revisionName: sklearn-iris-predictor-00003
            tag: latest
            url: http://latest-sklearn-iris-predictor.kserve-test.example.com
          - latestRevision: false
            percent: 90
            revisionName: sklearn-iris-predictor-00001
            tag: prev
            url: http://prev-sklearn-iris-predictor.kserve-test.example.com
          url: http://sklearn-iris-predictor.kserve-test.example.com
     
     ....

    可以看到有兩個URL,分別是金絲雀版本和之前舊版本的模型服務URL。通過在URL中添加latest-prev-來區分。

    金絲雀版本的URL是http://latest-sklearn-iris-predictor.kserve-test.example.com

    ,舊版本的URL是http://prev-sklearn-iris-predictor.kserve-test.example.com

  3. 執行以下命令,根據您想要訪問的特定版本,將相應的URL添加到請求中,調用InferenceService的服務並擷取預測結果。

    命令中,${INGRESS_HOST}${INGRESS_PORT}表示入口網關的主機和連接埠,latest-sklearn-iris-predictor.kserve-test.example.com表示訪問的模型服務的URL。您可以根據實際情況進行相應的替換和調整。

    curl -v -H "Host: latest-sklearn-iris-predictor.kserve-test.example.com" http://${INGRESS_HOST}:${INGRESS_PORT}/v1/models/sklearn-iris:predict -d @./iris-input.json