iT邦幫忙

2021 iThome 鐵人賽

DAY 15
0
AI & Data

AI平台初學者工作坊: 從training、tracking到serving系列 第 15

部署model(serving) on seldon(PVC)

  • 分享至 

  • xImage
  •  

上一篇我們準備好部署model之前的環境, 做了下列事情

  • 安裝istio
  • 安裝seldon
  • 準備pvc空間

接下來我們需要將訓練好的模型放到pvc空間, 接著再執行部署model

將model放到pvc

  • 因為我們是用jupterhub執行training, 而且將模型名稱命名為bst_save_model.pkl, 這時我們使用notebook功能將model下載到本機
  • 接著我是將model使用winscp將model傳到K8s master node上.
  • 建立一個pod(名稱為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
    
  • 接著在k8s master node上執行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

終於, 我們要來部署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

取得istio ingress url

我們在安裝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>

取得網址規則(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進行推論

  • 推論結果(一)
    第一位推論的測試資料如下:

    • age: 40.1
    • gender: 2
    • height: 168
    • weight: 62.3
    • ap_hi: 110
    • ap_lo: 80
    • cholesterol: 1
    • gluc: 1
    • smoke 0
    • alco: 0
    • active: 1

    以第一組測試資料來看, 罹患心血管疾病的機率應該不大.
    然後再下存取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"}}}
    
  • 推論結果(二)
    那我們再來試另一組資料

    • age: 80.1
    • gender: 2
    • height: 168
    • weight: 92.3
    • ap_hi: 150
    • ap_lo: 100
    • cholesterol: 1
    • gluc: 1
    • smoke 1
    • alco: 0
    • active: 1

    以這組資料來看, 罹患心血管疾病的機率會比較高

    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為我們建立了什麼資源, 以及這些資源做了什麼事.


上一篇
安裝seldon
下一篇
細看seldon core所部署出來的POD在做什麼
系列文
AI平台初學者工作坊: 從training、tracking到serving30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言