KServe支援以Kubernetes CRD的形式將單個或多個經過訓練的模型(例如TFServing、TorchServe等)部署到模型服務運行時,簡化模型的部署和管理。您可以基於Knative使用InferenceService來部署模型,以獲得基於RPS、並發數、CPU/GPU指標自動彈性,沒有業務流量時縮容至零、便捷的多版本管理等能力。
前提條件
已部署KServe組件,請參見部署KServe組件。
步驟一:部署InferenceService推理服務
首先,您需要部署一個帶有預測能力的InferenceService推理服務,該推理服務將使用iris (鳶尾花)資料集訓練的scikit-learn模型。該資料集具有三個輸出類別:Iris Setosa(山鳶尾,索引:0)、Iris Versicolour(雜色鳶尾花,索引:1)和Iris Virginica(維吉尼亞鳶尾,索引:2)。 然後您可以向部署的模型發送推理請求,以便預測對應的鳶尾植物類別。
iris資料集是由三種鳶尾花,各50組資料構成的資料集。每個樣本包含4個特徵,分別為萼片(Sepals)的長和寬、花瓣(Petals)的長和寬。
執行以下命令,建立一個名為sklearn-iris的InferenceService推理服務。
kubectl apply -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" EOF
執行以下命令,檢查服務狀態。
kubectl get inferenceservices sklearn-iris
預期輸出:
NAME URL READY PREV LATEST PREVROLLEDOUTREVISION LATESTREADYREVISION AGE sklearn-iris http://sklearn-iris-predictor-default.default.example.com True 100 sklearn-iris-predictor-default-00001 51s
步驟二:訪問服務
不同服務網關,IP地址有所不同,訪問方式也有所不同。請按需選擇。
ALB
執行以下命令,擷取ALB訪問地址。
kubectl get albconfig knative-internet
預期輸出:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE knative-internet alb-hvd8nngl0l******* alb-hvd8nngl0l******.cn-<region>.alb.aliyuncs.com 2
執行以下命令,將以下JSON內容寫入
./iris-input.json
檔案中,以準備推理輸入請求。cat <<EOF > "./iris-input.json" { "instances": [ [6.8, 2.8, 4.8, 1.4], [6.0, 3.4, 4.5, 1.6] ] } EOF
執行以下命令,訪問服務。
INGRESS_DOMAIN=$(kubectl get albconfig knative-internet -o jsonpath='{.status.loadBalancer.dnsname}') SERVICE_HOSTNAME=$(kubectl get inferenceservice sklearn-iris -o jsonpath='{.status.url}' | cut -d "/" -f 3) curl -v -H "Host: ${SERVICE_HOSTNAME}" "http://${INGRESS_DOMAIN}/v1/models/sklearn-iris:predict" -d @./iris-input.json
預期輸出:
* Trying 120.77.XX.XX... * TCP_NODELAY set * Connected to alb-hvd8nngl0l******.cn-<region>.alb.aliyuncs.com (120.77.XX.XX) port 80 (#0) > POST /v1/models/sklearn-iris:predict HTTP/1.1 > Host: sklearn-iris-predictor-default.default.example.com > User-Agent: curl/7.58.0 > Accept: */* > Content-Length: 76 > Content-Type: application/x-www-form-urlencoded > * upload completely sent off: 76 out of 76 bytes < HTTP/1.1 200 OK < Date: Thu, 13 Jul 2023 01:48:44 GMT < Content-Type: application/json < Content-Length: 21 < Connection: keep-alive < * Connection #0 to host alb-hvd8nngl0l******.cn-<region>.alb.aliyuncs.com left intact {"predictions":[1,1]}
結果返回了兩個預測
{"predictions": [1, 1]}
,該結果為推理髮送的兩組資料點對應於索引為1的花,模型預測這兩種花都是Iris Versicolour(雜色鳶尾花)。
MSE
執行以下命令,擷取MSE訪問地址。
kubectl -n knative-serving get ing stats-ingress
預期輸出:
NAME CLASS HOSTS ADDRESS PORTS AGE stats-ingress knative-ingressclass * 192.168.XX.XX,47.107.XX.XX 80 15d
ADDRESS下方的
47.107.XX.XX
為MSE網關公網地址,後續會使用該地址訪問服務。MSE的公網和內網順序不固定,有時公網排在內網後面,即ADDRESS為47.107.XX.XX,192.168.XX.XX
。執行以下命令,將以下JSON內容寫入
./iris-input.json
檔案中,以準備推理輸入請求。cat <<EOF > "./iris-input.json" { "instances": [ [6.8, 2.8, 4.8, 1.4], [6.0, 3.4, 4.5, 1.6] ] } EOF
執行以下命令,訪問服務。
# MSE的公網和內網順序不固定,此處使用公網地址訪問。ingress[1]代表公網排在第二位,ingress[0]代表公網排在第一位,請按照實際情況替換。 INGRESS_HOST=$(kubectl -n knative-serving get ing stats-ingress -o jsonpath='{.status.loadBalancer.ingress[1].ip}') SERVICE_HOSTNAME=$(kubectl get inferenceservice sklearn-iris -o jsonpath='{.status.url}' | cut -d "/" -f 3) curl -v -H "Host: ${SERVICE_HOSTNAME}" "http://${INGRESS_HOST}/v1/models/sklearn-iris:predict" -d @./iris-input.json
預期輸出:
* Trying 47.107.XX.XX... # 47.107.XX.XX為MSE網關的公網地址。 * TCP_NODELAY set * Connected to 47.107.XX.XX (47.107.XX.XX) port 80 (#0) > POST /v1/models/sklearn-iris:predict HTTP/1.1 > Host: sklearn-iris-predictor-default.default.example.com > User-Agent: curl/7.58.0 > Accept: */* > Content-Length: 76 > Content-Type: application/x-www-form-urlencoded > * upload completely sent off: 76 out of 76 bytes < HTTP/1.1 200 OK < content-length: 21 < content-type: application/json < date: Tue, 11 Jul 2023 09:56:00 GMT < server: istio-envoy < req-cost-time: 5 < req-arrive-time: 1689069360639 < resp-start-time: 1689069360645 < x-envoy-upstream-service-time: 4 < * Connection #0 to host 47.107.XX.XX left intact {"predictions":[1,1]}
結果返回了兩個預測
{"predictions": [1, 1]}
,該結果為推理髮送的兩組資料點對應於索引為1的花,模型預測這兩種花都是Iris Versicolour(雜色鳶尾花)。
Kourier
執行以下命令,擷取Kourier服務訪問地址。
kubectl -n knative-serving get svc kourier
預期輸出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kourier LoadBalancer 192.168.XX.XX 121.40.XX.XX 80:31158/TCP,443:32491/TCP 49m
服務訪問IP為
121.40.XX.XX
,連接埠為80(HTTP)和443(HTTPS)。執行以下命令,將以下JSON內容寫入
./iris-input.json
檔案中,以準備推理輸入請求。cat <<EOF > "./iris-input.json" { "instances": [ [6.8, 2.8, 4.8, 1.4], [6.0, 3.4, 4.5, 1.6] ] } EOF
執行以下命令,訪問服務。
INGRESS_HOST=$(kubectl -n knative-serving get service kourier -o jsonpath='{.status.loadBalancer.ingress[0].ip}') SERVICE_HOSTNAME=$(kubectl get inferenceservice sklearn-iris -o jsonpath='{.status.url}' | cut -d "/" -f 3) curl -v -H "Host: ${SERVICE_HOSTNAME}" "http://${INGRESS_HOST}/v1/models/sklearn-iris:predict" -d @./iris-input.json
預期輸出:
* Trying 121.40.XX.XX... * TCP_NODELAY set * Connected to 121.40.XX.XX (121.40.XX.XX) port 80 (#0) > POST /v1/models/sklearn-iris:predict HTTP/1.1 > Host: sklearn-iris-predictor-default.default.example.com > User-Agent: curl/7.58.0 > Accept: */* > Content-Length: 76 > Content-Type: application/x-www-form-urlencoded > * upload completely sent off: 76 out of 76 bytes < HTTP/1.1 200 OK < content-length: 21 < content-type: application/json < date: Wed, 12 Jul 2023 08:23:13 GMT < server: envoy < x-envoy-upstream-service-time: 4 < * Connection #0 to host 121.40.XX.XX left intact {"predictions":[1,1]}
結果返回了兩個預測
{"predictions": [1, 1]}
,該結果為推理髮送的兩組資料點對應於索引為1的花,模型預測這兩種花都是Iris Versicolour(雜色鳶尾花)。
相關文檔
如需在Knative中部署AI模型推理服務,可參見在Knative中部署AI模型推理服務的最佳實務獲得配置建議。
ACK Knative提供Stable Diffusion的應用模板,請參見基於Knative部署生產層級的Stable Diffusion服務。