基于KServe快速部署一個推理服務
本文介紹如何基于KServe快速部署一個推理服務。
索引
前提條件
- 說明
部署Knative時,有ALB、MSE、Kourier三種服務網(wǎng)關(guān)可供選擇。
操作步驟
首先,您需要部署一個帶有預測能力的InferenceService推理服務,該推理服務將使用iris (鳶尾花)數(shù)據(jù)集訓練的scikit-learn模型。該數(shù)據(jù)集具有三個輸出類別:Iris Setosa(山鳶尾,索引:0)、Iris Versicolour(雜色鳶尾花,索引:1)和Iris Virginica(弗吉尼亞鳶尾,索引:2)。 然后您可以向部署的模型發(fā)送推理請求,以便預測對應的鳶尾植物類別。
iris數(shù)據(jù)集是由三種鳶尾花,各50組數(shù)據(jù)構(gòu)成的數(shù)據(jù)集。每個樣本包含4個特征,分別為萼片(Sepals)的長和寬、花瓣(Petals)的長和寬。
步驟一:部署InferenceService推理服務
執(zhí)行以下命令,創(chuàng)建一個名為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
執(zhí)行以下命令,檢查服務狀態(tài)。
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
步驟二:訪問服務
不同服務網(wǎng)關(guān),IP地址有所不同,訪問方式也有所不同。請按需選擇。
ALB
執(zhí)行以下命令,獲取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
執(zhí)行以下命令,將以下JSON內(nèi)容寫入
./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
執(zhí)行以下命令,訪問服務。
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]}
結(jié)果返回了兩個預測
{"predictions": [1, 1]}
,該結(jié)果為推理發(fā)送的兩組數(shù)據(jù)點對應于索引為1的花,模型預測這兩種花都是Iris Versicolour(雜色鳶尾花)。
MSE
執(zhí)行以下命令,獲取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網(wǎng)關(guān)公網(wǎng)地址,后續(xù)會使用該地址訪問服務。MSE的公網(wǎng)和內(nèi)網(wǎng)順序不固定,有時公網(wǎng)排在內(nèi)網(wǎng)后面,即ADDRESS為47.107.XX.XX,192.168.XX.XX
。執(zhí)行以下命令,將以下JSON內(nèi)容寫入
./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
執(zhí)行以下命令,訪問服務。
# MSE的公網(wǎng)和內(nèi)網(wǎng)順序不固定,此處使用公網(wǎng)地址訪問。ingress[1]代表公網(wǎng)排在第二位,ingress[0]代表公網(wǎng)排在第一位,請按照實際情況替換。 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網(wǎng)關(guān)的公網(wǎng)地址。 * 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]}
結(jié)果返回了兩個預測
{"predictions": [1, 1]}
,該結(jié)果為推理發(fā)送的兩組數(shù)據(jù)點對應于索引為1的花,模型預測這兩種花都是Iris Versicolour(雜色鳶尾花)。
Kourier
執(zhí)行以下命令,獲取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)。執(zhí)行以下命令,將以下JSON內(nèi)容寫入
./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
執(zhí)行以下命令,訪問服務。
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]}
結(jié)果返回了兩個預測
{"predictions": [1, 1]}
,該結(jié)果為推理發(fā)送的兩組數(shù)據(jù)點對應于索引為1的花,模型預測這兩種花都是Iris Versicolour(雜色鳶尾花)。