安装seldon

上一篇, 我们已使用 xgboost 完成训练并且产生model档, 这个model的档名为bst_save_model.pkl

现在我们来到了第二个范例的第三个步骤:serving, 如下图所示.
https://ithelp.ithome.com.tw/upload/images/20210927/201407922gGaTBwFEc.png

这次我们要使用seldon部署我们的模型. Seldon是最近很热门的model部署工具, 它建立在kubernetes平台上, 也因为我们在第二天就已经安装好一个K8s cluster, 所以要安装seldon core是一件很方便的事.
Seldon core的官网在这里: https://www.seldon.io/tech/products/core/

首先, 我们来安装istio, 因为我们在安装seldon时会启用istio.

安装istio

  • 下载istio

    $curl -L https://istio.io/downloadIstio | sh -
    
  • 设定PATH

    $cd istio-1.11.1  #版本号要根据下载的版本做修改
    $export PATH=$PWD/bin:$PATH
    
  • 开始安装

    $kubectl create namespace istio-system
    $helm install istio-base manifests/charts/base -n istio-system
    $helm install istiod manifests/charts/istio-control/istio-discovery -n istio-system
    $helm install istio-ingress manifests/charts/gateways/istio-ingress -n istio-system
    $helm install istio-egress manifests/charts/gateways/istio-egress -n istio-system
    
  • 建立seldon GATEWAY

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: seldon-gateway
      namespace: istio-system
    spec:
      selector:
        istio: ingressgateway # use istio default controller
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
    

安装seldon

  • 建立seldon所使用的namespace

    kubectl create namespace seldon-system
    
  • 执行helm指令安装seldon
    ps: 我们在Day4 安装JupyterHub 已安装过hlem

    helm install seldon-core seldon-core-operator \
      --repo https://storage.googleapis.com/seldon-charts \
      --set usageMetrics.enabled=true \
      --namespace seldon-system \
      --set istio.enabled=true \
      --set istio.gateway=istio-system/seldon-gateway
    

    执行完成的讯息如下:

    index.go:339: skipping loading invalid entry for chart "seldon-core-crd" "0.1.5a" from https://storage.googleapis.com/seldon-charts: validation: chart.metadata.version "0.1.5a" is invalid
    index.go:339: skipping loading invalid entry for chart "seldon-core-crd" "0.1.6_SNAPSHOT" from https://storage.googleapis.com/seldon-charts: validation: chart.metadata.version "0.1.6_SNAPSHOT" is invalid
    index.go:339: skipping loading invalid entry for chart "seldon-core-crd" "0.1.6_SNAPSHOT" from https://storage.googleapis.com/seldon-charts: validation: chart.metadata.version "0.1.6_SNAPSHOT" is invalid
    index.go:339: skipping loading invalid entry for chart "seldon-core" "0.1.6_SNAPSHOT" from https://storage.googleapis.com/seldon-charts: validation: chart.metadata.version "0.1.6_SNAPSHOT" is invalid
    index.go:339: skipping loading invalid entry for chart "seldon-core" "0.1.6_SNAPSHOT" from /home/k8s/.cache/helm/repository/E3xhv-3+r1pSeDV8I8nqHo7tIjk=-index.yaml: validation: chart.metadata.version "0.1.6_SNAPSHOT" is invalid
    index.go:339: skipping loading invalid entry for chart "seldon-core-crd" "0.1.5a" from /home/k8s/.cache/helm/repository/E3xhv-3+r1pSeDV8I8nqHo7tIjk=-index.yaml: validation: chart.metadata.version "0.1.5a" is invalid
    index.go:339: skipping loading invalid entry for chart "seldon-core-crd" "0.1.6_SNAPSHOT" from /home/k8s/.cache/helm/repository/E3xhv-3+r1pSeDV8I8nqHo7tIjk=-index.yaml: validation: chart.metadata.version "0.1.6_SNAPSHOT" is invalid
    index.go:339: skipping loading invalid entry for chart "seldon-core-crd" "0.1.6_SNAPSHOT" from /home/k8s/.cache/helm/repository/E3xhv-3+r1pSeDV8I8nqHo7tIjk=-index.yaml: validation: chart.metadata.version "0.1.6_SNAPSHOT" is invalid
    W0913 11:51:43.488868   16657 warnings.go:70] rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRole
    W0913 11:51:43.506167   16657 warnings.go:70]   rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding
    W0913 11:51:43.676157   16657 warnings.go:70] admissionregistration.k8s.io/v1beta1 ValidatingWebhookConfiguration is deprecated in v1.16+, unavailable in v1.22+; use admissionregistration.k8s.io/v1 ValidatingWebhookConfiguration
    W0913 11:51:48.918777   16657 warnings.go:70] rbac.authorization.k8s.io/v1beta1 ClusterRole is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRole
    W0913 11:51:48.988508   16657 warnings.go:70] rbac.authorization.k8s.io/v1beta1 ClusterRoleBinding is deprecated in v1.17+, unavailable in v1.22+; use rbac.authorization.k8s.io/v1 ClusterRoleBinding
    W0913 11:51:50.531620   16657 warnings.go:70] admissionregistration.k8s.io/v1beta1 ValidatingWebhookConfiguration is deprecated in v1.16+, unavailable in v1.22+; use admissionregistration.k8s.io/v1 ValidatingWebhookConfiguration
    NAME: seldon-core
    LAST DEPLOYED: Mon Sep 13 11:51:37 2021
    NAMESPACE: seldon-system
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    k8s@k8s-master:~/mlops$
    

准备pvc

因为使用seldon部署model时需要将model放在下列四种储存空间的其中一种:

除了上述4个环境, 还可以使用pvc, 在这个网页有一行这麽写
A Kubernetes PersistentVolume can be used instead of a bucket using pvc://.

我们先使用pvc空间做一次, 之後再使用MinIO做一次.
而且在我们的K8s环境中原本就有一个NFS空间, 之前是让JupyterHub使用, 现在我们就再使用NFS空间建立pvc放置要部署在seldon上的模型档案.

请撰写下列yaml内容. 请注意, 这个的storageClassName必需是已经存在的名称, 因为我们在安装JupyterHub就建立过storage class, 名称即是nfs-client. 如果你没有这个storage class, 那你要先建立一个.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: seldon-pv-claim
spec:
  storageClassName: nfs-client
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 3Gi

将这个yaml档存为seldon-pvc.yaml
所以执行下列指令, 这样我们就准备好所需要的空间.

$kubectl apply -f seldon-pvc.yaml

你也可以在github下载这个档案

到这里我们就准备好所需要的环境, 下一篇我们就来把训练好的模型使用seldon部署起来

参考资料

https://istio.io/latest/docs/setup/getting-started/#download
https://istio.io/latest/docs/setup/install/helm/
https://docs.seldon.io/projects/seldon-core/en/v1.9.1/workflow/github-readme.html


<<:  DVWA练习-Command injection

>>:  Day27 大眼睛效果

[Day15] Vite 出小蜜蜂~随机射击 Randomly Shoot!

Day15 在 Space Invaders 的游戏设计中, 除了随着不断前进而产生的压迫感之外, ...

确保资讯安全的有效性,并达到符合性(合规性)要求,应优先遵循组织政策

-政策框架 组织应当遵守法律法规。管理团队应尽职尽责制定或审查政策以满足法律和监管要求。 组织政策...

Laravel Queue Job:深入理解 timeout 的运作

work 和 listen 的差别 让 queue work 开始执行任务的指令有两个:work 和...

Day 29 | SQLite资料库(四)

查询资料 query()方法 //查询资料 var number = "" va...

Day 18 : 笔记篇 05— 如何整理学习笔记?分享我的学习笔记整理流程

前言 在 上一篇文章 中,我提到使用 Obsidian 处理笔记的过程,但在「纪录资讯」这一段没有多...