部署model(serving) on seldon(PVC)

上一篇我们准备好部署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为我们建立了什麽资源, 以及这些资源做了什麽事.


<<:  [Day20] swift & kotlin 游戏篇!(2) 小鸡BB-游戏制作-小鸡排版

>>:  Day-27 游戏主机全员到齐、一同聚集於客厅

Day 26 | SQLite资料库(一)

Android系统内建SQLite供开发者使用,通常用於存放使用者或系统相关的资料,如果资料除了本地...

Day30 撒花~

大家好,我是乌木白,今天是铁人赛最後一天,谢谢大家在这些天不管是无意或是有意的点进来参观,都非常感...

Day 9 (Bootstrap)

1.命名方式不可以用 10_XX _XXX 英文开头 2.bootstrap是利用他人的css 套用...

@Day13 | C# WixToolset + WPF 帅到不行的安装包 [桌面捷径]

大致上的安装功能都完成後, 我们接下来要做桌面捷径的部分。 我们先选择要使用的Icon加入至专案, ...

No Time To Die在线看

No Time To Die在线看 《007:无暇赴死》是007系列电影的第25部,由凯瑞·福永执导...