上一篇我们准备好部署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为我们建立了什麽资源, 以及这些资源做了什麽事.
<<: [Day20] swift & kotlin 游戏篇!(2) 小鸡BB-游戏制作-小鸡排版
Android系统内建SQLite供开发者使用,通常用於存放使用者或系统相关的资料,如果资料除了本地...
大家好,我是乌木白,今天是铁人赛最後一天,谢谢大家在这些天不管是无意或是有意的点进来参观,都非常感...
1.命名方式不可以用 10_XX _XXX 英文开头 2.bootstrap是利用他人的css 套用...
大致上的安装功能都完成後, 我们接下来要做桌面捷径的部分。 我们先选择要使用的Icon加入至专案, ...
No Time To Die在线看 《007:无暇赴死》是007系列电影的第25部,由凯瑞·福永执导...