使用KServe實現(xiàn)推理服務(wù)的金絲雀發(fā)布
使用KServe實現(xiàn)推理服務(wù)的金絲雀發(fā)布,可以更好地管理和控制推理服務(wù)的部署過程,減少潛在錯誤和故障對用戶的影響,并確保推理服務(wù)的高可用性和穩(wěn)定性。
功能介紹
KServe支持推理服務(wù)的金絲雀發(fā)布,它允許一個推理服務(wù)的新版本接收一部分流量。如果一個發(fā)布步驟失敗,金絲雀發(fā)布策略還可以回滾到先前的修訂版。
在KServe中,最后一次成功發(fā)布的修訂版會接收100%的流量。canaryTrafficPercent
字段用于指定應(yīng)該路由到新修訂版的流量百分比。根據(jù)canaryTrafficPercent
的值,KServe會自動將流量分配給最后一次成功發(fā)布的修訂版和當(dāng)前正在發(fā)布的修訂版。
當(dāng)部署第一個修訂版的推理服務(wù)時,它將接收100%的流量。當(dāng)部署多個修訂版時,例如步驟二,金絲雀發(fā)布策略配置為將10%的流量路由到新修訂版(LatestReadyRevision),90%的流量繼續(xù)流向之前的修訂版(LatestRolledoutRevision)。如果某個修訂版不健康或出現(xiàn)問題,流量將不會被路由到該修訂版,以確保穩(wěn)定性和可靠性。
前提條件
已部署推理服務(wù),且可以正常運(yùn)行。具體操作,請參見ASM集成云原生推理服務(wù)框架KServe。
步驟一:查看推理服務(wù)的流量分配
前提條件的推理服務(wù)部署成功后,可以看到100%流量指向服務(wù)修訂版1的模型服務(wù)。
執(zhí)行以下命令,查看sklearn-iris推理服務(wù)的相關(guān)信息。
kubectl get isvc -n kserve-test sklearn-iris
預(yù)期輸出:
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
執(zhí)行以下命令,將
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
命令執(zhí)行后,將更新
sklearn-iris
推理服務(wù)的配置。添加的canaryTrafficPercent
字段設(shè)置為10,表示將10%的流量分配給金絲雀模型(修訂版2),而其余90%的流量將繼續(xù)指向之前的模型(修訂版1)。根據(jù)金絲雀發(fā)布的定義,流量將在最新就緒的修訂版2和之前推出的修訂版1之間進(jìn)行分配。執(zhí)行以下命令,查看sklearn-iris推理服務(wù)的相關(guān)信息。
kubectl get isvc -n kserve-test sklearn-iris
預(yù)期輸出:
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%的流量指向了先前的模型服務(wù)(修訂版1),而10%的流量指向了當(dāng)前的模型服務(wù)(修訂版2)。
執(zhí)行以下命令,查看正在運(yùn)行的Pod信息。
kubectl get pod -n kserve-test
預(yù)期輸出:
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分別為舊模型和新模型運(yùn)行,并且有10%的流量路由到新模型。
說明在Pod的名稱中,修訂版1的名稱中包含
predictor-0001
,修訂版2的名稱中包含predictor-0002
。
步驟三:切換到新版本
如果金絲雀模型運(yùn)行良好并通過了驗證測試,您可以通過刪除canaryTrafficPercent
字段并重新應(yīng)用InferenceService自定義資源來切換到新版本。
執(zhí)行命令,刪除
canaryTrafficPercent
字段并重新應(yīng)用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
執(zhí)行以下命令,查看sklearn-iris推理服務(wù)的相關(guān)信息。
kubectl get isvc -n kserve-test sklearn-iris
預(yù)期輸出:
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。
相關(guān)操作
回滾到舊版本
您可以通過將當(dāng)前模型服務(wù)(修訂版2)的canaryTrafficPercent
設(shè)為0來回滾到之前的模型服務(wù)(修訂版1)。設(shè)置后,將從修訂版2回滾到修訂版1,并將修訂版2的流量減少到零。
執(zhí)行以下命令,將模型服務(wù)(修訂版2)的流量設(shè)置為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
執(zhí)行以下命令,查看sklearn-iris推理服務(wù)的相關(guān)信息。
kubectl get isvc -n kserve-test sklearn-iris
預(yù)期輸出:
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%流量流向之前的模型服務(wù)(修訂版1)。
使用注解路由流量
您可以通過添加注解serving.kserve.io/enable-tag-routing
來啟用基于標(biāo)簽的路由,通過請求URL中的標(biāo)簽明確地將流量路由到金絲雀模型(修訂版2)或舊模型(修訂版1)。
執(zhí)行以下命令,應(yīng)用金絲雀模型(修訂版2),并設(shè)置
canaryTrafficPercent: 10
和serving.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
執(zhí)行以下命令,查看InferenceService的狀態(tài)。
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,分別是金絲雀版本和之前舊版本的模型服務(wù)URL。通過在URL中添加
latest-
或prev-
來區(qū)分。金絲雀版本的URL是
http://latest-sklearn-iris-predictor.kserve-test.example.com
,舊版本的URL是
http://prev-sklearn-iris-predictor.kserve-test.example.com
。執(zhí)行以下命令,根據(jù)您想要訪問的特定版本,將相應(yīng)的URL添加到請求中,調(diào)用InferenceService的服務(wù)并獲取預(yù)測結(jié)果。
命令中,
${INGRESS_HOST}
和${INGRESS_PORT}
表示入口網(wǎng)關(guān)的主機(jī)和端口,latest-sklearn-iris-predictor.kserve-test.example.com
表示訪問的模型服務(wù)的URL。您可以根據(jù)實際情況進(jìn)行相應(yīng)的替換和調(diào)整。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