上一篇我們準備好部署model之前的環境, 做了下列事情
接下來我們需要將訓練好的模型放到pvc空間, 接著再執行部署model
bst_save_model.pkl
, 這時我們使用notebook功能將model下載到本機seldon-pv-pod
), 這個pod會提出persistent volume clain(名稱為seldon-pv-claim
), 也就是我們在上一篇所建立的pvc, K8s會依據pvc的要求再經由storage class產生所需要的pv, 而且將pv的空間載在 /mnt 之下.
apiVersion: v1
kind: Pod
metadata:
name: seldon-pv-pod
spec:
volumes:
- name: seldon-pv-storage
persistentVolumeClaim:
claimName: seldon-pv-claim
containers:
- name: seldon-pv-container
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/mnt"
name: seldon-pv-storage
kubectl cp
指令將model(bst_save_model.pkl
)檔傳入seldon-pv-pod的 /mnt 目錄下, 這樣我們就把model檔放在pvc的空間了.bst_save_model.pkl
重新命名為model.bst
. 這個步驟很重要, 因為在seldon文件中有這一行說明
The model pickle must be named `model.bst`
終於, 我們要來部署model了. 請撰寫下列yaml檔
apiVersion: machinelearning.seldon.io/v1alpha2
kind: SeldonDeployment
metadata:
name: xgboost
spec:
name: cardio_xgb
predictors:
- graph:
children: []
implementation: XGBOOST_SERVER
modelUri: pvc://seldon-pv-claim
name: classifier
name: default
replicas: 1
然後將yaml另存為seldon_deploy_xgb_cardio.ymal
因此, 執行下列指令
kubectl apply -f seldon_deploy_xgb_cardio.ymal
使用kubectl get all
看一下所有資源的狀況
會產生一個pod, 而且這個pod裡面有2個container
NAME READY STATUS RESTARTS AGE
pod/xgboost-default-0-classifier-9688db8bf-9x2bf 2/2 Running 0 3d16h
也會產生2個service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 25d
service/xgboost-default ClusterIP 10.99.29.1 <none> 8000/TCP,5001/TCP 3d16h
service/xgboost-default-classifier ClusterIP 10.110.241.88 <none> 9000/TCP,9500/TCP 3d16h
我們在安裝seldon之前已安裝istio, 而且也建立了一個Gateway(名稱是seldon-gateway
), 我們就來使用istio所提供的方式打endpoint.
我們先來看一下目前istio有什麼service
kubectl get svc -n istio-system
output為以下內容.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-egressgateway ClusterIP 10.110.33.47 <none> 80/TCP,443/TCP 17d
istio-ingressgateway NodePort 10.102.239.141 <none> 15021:30062/TCP,80:31655/TCP,443:32568/TCP 17d
istiod ClusterIP 10.109.156.209 <none> 15010/TCP,15012/TCP,443/TCP,15014/TCP 17d
其中可以發現, 已有一個istio-ingressgateway
, 而且它的type是NodePort
, 我們就利用這個NodePort存取seldon的service. 因此, 我們可以將ingress url:
http://<IP of Istio controller>:<Port of istio controller>/seldon_interface_rule
寫為
http://172.23.180.10:31655/<the path for predictions>
網址規則為:/seldon///api/v1.0/predictions
因為我們將xgboost部署在default namesapce, 所以為default
而我們的model name為xgboost
, 所以為 xgboost
要查還有第二個方法, 也可以使用下列指令查看
kubectl get virtualservice
可以看到下列 virutal service. 查到有一個xgboost-http
, xgboost
就是我們要的
NAME GATEWAYS HOSTS AGE
xgboost-grpc ["istio-system/seldon-gateway"] ["*"] 20h
xgboost-http ["istio-system/seldon-gateway"] ["*"] 20h
所以, 我們要存取endpoint 的url會長這樣:
http://172.23.180.10:31655/seldon/default/xgboost/api/v1.0/predictions
接下來我們以測試資料存取endpoint進行推論
推論結果(一)
第一位推論的測試資料如下:
以第一組測試資料來看, 罹患心血管疾病的機率應該不大.
然後再下存取endpoint的指令:
curl -X POST -H 'Content-Type: application/json' -d '{"data": {"ndarray": [[40.1,2,168,62.3,110,80,1,1,0,0,1]]}}' http://172.23.180.10:31655/seldon/default/xgboost/api/v1.0/predictions
推論的結果顯示該人員罹患心血管疾病的機率為6.55%(果然滿低的)
{"names":[],"ndarray":[0.06550367176532745]},"meta":{"requestPath":{"classifier":"seldonio/xgboostserver:1.10.0"}}}
推論結果(二)
那我們再來試另一組資料
以這組資料來看, 罹患心血管疾病的機率會比較高
curl -X POST -H 'Content-Type: application/json' -d '{"data": {"ndarray": [[80.1,2,168,92.3,150,100,1,1,1,0,1]]}}' http://172.23.180.10:31655/seldon/default/xgboost/api/v1.0/predictions
推論的結果顯示第二位人員罹患心血管疾病的機率為91.43%(果然很高)
{"data":{"names":[],"ndarray":[0.9142580032348633]},"meta":{"requestPath":{"classifier":"seldonio/xgboostserver:1.10.0"}}}
到這裡, 我們使用seldon完成模型的部署, 也取得推論的結果. 下一篇我們來看一下seldon為我們建立了什麼資源, 以及這些資源做了什麼事.