作者:KubeVela 社区

在机器学习浪潮迸发的当下,AI 工程师除了需求练习、调试自己的模型之外,还需求将模型进行布置上线,从而验证模型的作用(当然,有的时分,这部分工作由 AI 体系工程师来完结)。这一部分工作关于 AI 工程师们来说是繁琐、且消耗额定精力的。

而在云原生时代,咱们的模型练习和模型服务也一般在云上进行。这样做不仅提高了可扩展性,还能够提高资源的利用率。这关于需求消耗很多计算资源的机器学习场景来说,是非常有效的。

但是 AI 工程师要想运用云原生的能力一般比较困难。随着时刻的推移,云原生的概念已经越来越杂乱。想要在云原生之上布置一个简略的模型服务,或许关于 AI 工程师来说,需求额定学习数种概念:比如 Deployment、Service、Ingress 等。

而 KubeVela 作为一个简略、易用、且高可扩展的云原生运用管理工具,能让开发人员方便快捷地在 Kubernetes 上定义与交给运用,无需了解任何底层云原生基础设施相关的细节。KubeVela 拥有着丰富的可扩展性,其 AI 插件供给了模型练习、模型服务、A/B 测验等功用,覆盖了 AI 工程师的基本需求,能够协助 AI 工程师快速在云原生环境中进行模型练习和模型服务。

本文主要介绍如何运用 KubeVela 的 AI 插件,来协助工程师更便捷地完结模型练习及模型服务。

KubeVelaAI 插件

KubeVela AI 插件分为模型练习和模型服务两个插件,模型练习插件根据 KubeFlow 的 training-operator,能够支撑如 TensorFlow、PyTorch、MXNet 等不同结构的分布式模型练习。而模型服务插件根据 Seldon Core,能够便捷地运用模型发动模型服务,一起也支撑流量分发,A/B 测验等高档功用。

基于 KubeVela 的机器学习实践

经过 KubeVela AI 插件,能够大大简化模型练习任务的布置以及模型服务的布置,一起,能够将模型练习、模型服务等过程与 KubeVela 本身的工作流、多集群等功用相结合,从而完结生产可用的服务布置。

注:你能够在KubeVela Samples [1] 中找到一切的源码和 YAML 文件。如果你想运用在这个比如中预练习的模型,文件夹中的style-model.yaml和color-model.yaml会将模型复制到 PVC 中。

模型练习

首先发动模型练习和模型服务的两个插件。

vela addon enable model-training
vela addon enable model-serving

模型练习中包括model-training和jupyter-notebook两个组件类型, 模型服务中包括model-serving这个组件类型。能够经过vela show指令来检查这三个组件中的详细参数。

你也能够挑选查阅KubeVela AI 插件文档 [2] , 来获取更多信息。

vela show model-training
vela show jupyter-notebook
vela show model-serving

咱们来练习一个简略的运用 TensorFlow 结构的模型,这个模型的作用是能够将灰色的图片变成五颜六色的。布置如下 YAML 文件:

注:模型练习的源码来源于:emilwallner/Coloring-greyscale-images [3]

apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
  name: training-serving
  namespace: default
spec:
  components:
  # 练习模型
  - name: demo-training
    type: model-training
    properties:
      # 练习模型的镜像
      image: fogdong/train-color:v1
      # 模型练习的结构
      framework: tensorflow
      # 声明存储,将模型耐久化。此处会运用集群内的默许 storage class 来创立 PVC
      storage:
        - name: "my-pvc"
          mountPath: "/model"

此刻, KubeVela 将拉起一个TFJob进行模型练习。

仅仅是练习模型很难看出作用,咱们修正一下这个 YAML 文件,将模型服务放到模型练习的过程之后。一起,由于模型服务会直接发动模型,而模型的输入输出不太直观(ndarray 或者 Tensor),因此,咱们再布置一个测验服务来调用服务,并将成果转换成图画。

布置如下 YAML 文件:

apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
  name: training-serving
  namespace: default
spec:
  components:
  # 练习模型
  - name: demo-training
    type: model-training
    properties:
      image: fogdong/train-color:v1
      framework: tensorflow
      storage:
        - name: "my-pvc"
          mountPath: "/model"
  # 发动模型服务
  - name: demo-serving
    type: model-serving
    # 模型服务会在模型练习完结后发动
    dependsOn:
      - demo-training
    properties:
      # 发动模型服务运用的协议,能够不填,默许运用 seldon 自身的协议
      protocol: tensorflow
      predictors:
        - name: model
          # 模型服务的副本数
          replicas: 1
          graph:
            # 模型名
            name: my-model
            # 模型结构
            implementation: tensorflow
            # 模型地址,上一步会将练习完的模型保存到 my-pvc 这个 pvc 傍边,所以经过 pvc://my-pvc 指定模型的地址
            modelUri: pvc://my-pvc
  # 测验模型服务
  - name: demo-rest-serving
    type: webservice
    # 测验服务会在模型练习完结后发动
    dependsOn:
      - demo-serving
    properties:
      image: fogdong/color-serving:v1
      # 运用 LoadBalancer 暴露对外地址,方便调用
      exposeType: LoadBalancer
      env:
        - name: URL
          # 模型服务的地址
          value: http://ambassador.vela-system.svc.cluster.local/seldon/default/demo-serving/v1/models/my-model:predict
      ports:
        # 测验服务的端口
        - port: 3333
          expose: true

布置之后,经过vela ls来检查运用的状况:

$ vela ls
training-serving        demo-training        model-training           running  healthy  Job Succeeded  2022-03-02 17:26:40 +0800 CST
├─                    demo-serving         model-serving            running  healthy  Available      2022-03-02 17:26:40 +0800 CST
└─                    demo-rest-serving    webservice               running  healthy  Ready:1/1      2022-03-02 17:26:40 +0800 CST

能够看到,运用已经正常发动。经过vela status –endpoint来检查运用的服务地址。

$ vela status training-serving --endpoint
+---------+-----------------------------------+---------------------------------------------------+
| CLUSTER |     REF(KIND/NAMESPACE/NAME)      |                     ENDPOINT                      |
+---------+-----------------------------------+---------------------------------------------------+
|         | Service/default/demo-rest-serving | tcp://47.251.10.177:3333                          |
|         | Service/vela-system/ambassador    | http://47.251.36.228/seldon/default/demo-serving  |
|         | Service/vela-system/ambassador    | https://47.251.36.228/seldon/default/demo-serving |
+---------+-----------------------------------+---------------------------------------------------+

该运用有三个服务地址,第一个是咱们的测验服务的地址,第二个和第三都是原生模型的地址。咱们能够调用测验服务来检查模型的作用:测验服务会读取图画的内容,并将其转成Tensor并恳求模型服务,最终将模型服务回来的Tensor转成图画回来。

咱们挑选一张是非的女性图片作为输入:

基于 KubeVela 的机器学习实践

恳求后,能够看到,输出了一张五颜六色图片:

基于 KubeVela 的机器学习实践

模型服务:灰度测验

除了直接发动模型服务,咱们还能够在一个模型服务中运用多个版别的模型,并对其分配不同的流量以进行灰度测验。

布置如下 YAML,能够看到,v1 版别的模型和 v2 版别的模型都设置为了 50% 的流量。相同,咱们在模型服务后边布置一个测验服务:

apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
  name: color-serving
  namespace: default
spec:
  components:
  - name: color-model-serving
    type: model-serving
    properties:
      protocol: tensorflow
      predictors:
        - name: model1
          replicas: 1
          # v1 版别的模型流量为 50
          traffic: 50
          graph:
            name: my-model
            implementation: tensorflow
            # 模型地址,在 color-model 这个 pvc 中 /model/v1 路径下存放了咱们的 v1 版别模型,所以经过 pvc://color-model/model/v1 指定模型的地址
            modelUri: pvc://color-model/model/v1
        - name: model2
          replicas: 1
          # v2 版别的模型流量为 50
          traffic: 50
          graph:
            name: my-model
            implementation: tensorflow
            # 模型地址,在 color-model 这个 pvc 中 /model/v2 路径下存放了咱们的 v2 版别模型,所以经过 pvc://color-model/model/v2 指定模型的地址
            modelUri: pvc://color-model/model/v2
  - name: color-rest-serving
    type: webservice
    dependsOn:
      - color-model-serving
    properties:
      image: fogdong/color-serving:v1
      exposeType: LoadBalancer
      env:
        - name: URL
          value: http://ambassador.vela-system.svc.cluster.local/seldon/default/color-model-serving/v1/models/my-model:predict
      ports:
        - port: 3333
          expose: true

当模型布置完结后,经过vela status –endpoint检查模型服务的地址:

$ vela status color-serving --endpoint
+---------+------------------------------------+----------------------------------------------------------+
| CLUSTER |      REF(KIND/NAMESPACE/NAME)      |                         ENDPOINT                         |
+---------+------------------------------------+----------------------------------------------------------+
|         | Service/vela-system/ambassador     | http://47.251.36.228/seldon/default/color-model-serving  |
|         | Service/vela-system/ambassador     | https://47.251.36.228/seldon/default/color-model-serving |
|         | Service/default/color-rest-serving | tcp://47.89.194.94:3333                                  |
+---------+------------------------------------+----------------------------------------------------------+

运用一张是非的城市图片恳求模型:

基于 KubeVela 的机器学习实践

能够看到,第一次恳求的成果如下。尽管天空和地上都被渲染成五颜六色了,但是城市本身仍是是非的:

基于 KubeVela 的机器学习实践

再次恳求,能够看到,这次恳求的成果中,天空、地上和城市都被渲染成了五颜六色:

基于 KubeVela 的机器学习实践

经过对不同版别的模型进行流量分发,能够协助咱们更好地对模型成果进行判断。

模型服务:A/B 测验

相同一张是非的图片,咱们既能够经过模型将其变成五颜六色的,也能够经过上传另一张风格图片,对原图进行风格搬迁。

关于用户来说,究竟是五颜六色的图片好仍是不同风格的图片更胜一筹?咱们能够经过进行 A/B 测验,来探索这个问题。

布置如下 YAML,经过设置customRouting,将Header中带有style: transfer的恳求,转发到风格搬迁的模型。一起,使这个风格搬迁的模型与五颜六色化的模型共用一个地址。

注:风格搬迁的模型来源于TensorFlow Hub [4]

apiVersion: core.oam.dev/v1beta1
kind: Application
metadata:
  name: color-style-ab-serving
  namespace: default
spec:
  components:
  - name: color-ab-serving
    type: model-serving
    properties:
      protocol: tensorflow
      predictors:
        - name: model1
          replicas: 1
          graph:
            name: my-model
            implementation: tensorflow
            modelUri: pvc://color-model/model/v2
  - name: style-ab-serving
    type: model-serving
    properties:
      protocol: tensorflow
      # 风格搬迁的模型需求的时刻较长,设置超时时刻使恳求不会被超时
      timeout: "10000"
      customRouting:
        # 指定自定义 Header
        header: "style: transfer"
        # 指定自定义路由
        serviceName: "color-ab-serving"
      predictors:
        - name: model2
          replicas: 1
          graph:
            name: my-model
            implementation: tensorflow
            modelUri: pvc://style-model/model
  - name: ab-rest-serving
    type: webservice
    dependsOn:
      - color-ab-serving
      - style-ab-serving
    properties:
      image: fogdong/style-serving:v1
      exposeType: LoadBalancer
      env:
        - name: URL
          value: http://ambassador.vela-system.svc.cluster.local/seldon/default/color-ab-serving/v1/models/my-model:predict
      ports:
        - port: 3333
          expose: true

布置成功后,经过vela status –endpoint检查模型服务的地址:

$ vela status color-style-ab-serving --endpoint
+---------+---------------------------------+-------------------------------------------------------+
| CLUSTER |    REF(KIND/NAMESPACE/NAME)     |                       ENDPOINT                        |
+---------+---------------------------------+-------------------------------------------------------+
|         | Service/vela-system/ambassador  | http://47.251.36.228/seldon/default/color-ab-serving  |
|         | Service/vela-system/ambassador  | https://47.251.36.228/seldon/default/color-ab-serving |
|         | Service/vela-system/ambassador  | http://47.251.36.228/seldon/default/style-ab-serving  |
|         | Service/vela-system/ambassador  | https://47.251.36.228/seldon/default/style-ab-serving |
|         | Service/default/ab-rest-serving | tcp://47.251.5.97:3333                                |
+---------+---------------------------------+-------------------------------------------------------+

这个运用中,两个服务各自有两个地址,但是第二个style-ab-serving的模型服务地址是无效的,由于这个模型服务已经被指向了color-ab-serving的地址中。相同,咱们经过恳求测验服务来检查模型作用。

首先,在不加 header 的情况下,图画会从是非变为五颜六色:

基于 KubeVela 的机器学习实践

咱们增加一个波浪的图片作为风格渲染:

基于 KubeVela 的机器学习实践

咱们为本次恳求加上style: transfer的 Header,能够看到,城市变成了波浪风格:

基于 KubeVela 的机器学习实践

咱们还能够运用一张水墨画的图片作为风格渲染:

基于 KubeVela 的机器学习实践

能够看到,这次城市变成了水墨画风格:

基于 KubeVela 的机器学习实践

总结

经过 KubeVela 的 AI 插件,能够协助你更便捷地进行模型练习与模型服务。

除此之外,经过与 KubeVela 的结合,咱们还能将测验完作用的模型经过 KubeVela 的多环境功用,下发到不同的环境中,从而实现模型的灵活布置。

相关链接

[1] KubeVela Samples

​​https://github.com/oam-dev/samples/tree/master/11.Machine_Learning_Demo​​

[2] KubeVela AI 插件文档

​​https://kubevela.io/zh/docs/next/reference/addons/ai​​

[3] emilwallner/Coloring-greyscale-images

​​https://github.com/emilwallner/Coloring-greyscale-images​​

[4]TensorFlow Hub

​​https://tfhub.dev/google/magenta/arbitrary-image-stylization-v1-256/2​​

近期抢手

您能够经过如下资料了解更多关于KubeVela以及OAM项目的细节:

  • 项目代码库:​​github.com/oam-dev/kubevela​​欢迎Star/Watch/Fork!
  • 项目官方主页与文档:kubevela.io,从1.1版别开始,已供给中文、英文文档,更多言语文档欢迎开发者进行翻译。
  • 项目钉钉群:23310022;Slack:CNCF#kubevelaChannel
  • 加入微信群:请先增加以下maintainer微信号,标明进入KubeVela用户群:

基于 KubeVela 的机器学习实践

点击“​​此处​​​”,检查KubeVela项目官网。​