kubeflow二次开发项目

2021-12-09 20:21:34 浏览数 (1)

背景

Datainsight 是基于kubeflow二次开发的项目。是一个专用于k8s上具备可移植性与可扩展性的机器学习工具包。目标:

  • 在不同的基础设施上轻松、可重复、可移植的部署ML 堆栈(例如,在笔记本电脑上进行试验,然后转移到本地集群或云)
  • 部署和管理松散耦合的微服务
  • 按需扩容

包含的服务:

  1. 数据准备
  2. 模型训练,
  3. 预测服务
  4. 服务管理
  5. notebook 创建和管理交互
  6. Tf-server服务容器

目标是基于K8S,构建一整套统一的机器学习平台,覆盖最主要的机器学习流程(数据->特征->建模->服务→监控),同时兼顾机器学习的实验探索阶段和正式的生产环境。

任务/目标

架构设计

chainer: 深度学习框架,基于Numpy和CuPy Python库

MPI:使用MPI来训练Tensorflow。基于消息传递的并行计算框架,MPI从数据存储节点读取需要处理的数据分配给各个计算节点=>数据处理=>数据处理

MXNet:深度学习的多层感知机为算法基础,数据集选用MNIST,用于训练和部署深度神经网络。

scikit-learn: 机器学习库:回归、聚类算法,支持向量机,随即深林,提督提升,k均值,DBScan;

XGBoost:树类算法,用于推理算法

机器学习的流程

开发和部署 ML 系统时,ML 工作流通常由几个阶段组成。因为开发 ML 系统是一个迭代过程(训练、评估、验证、训练)。我们需要评估 ML 工作流各个阶段的输出,并在必要时对模型和参数应用更改,以确保模型不断产生您需要的结果。

下面根据机器学习的阶段对应了datainsight的阶段使用到的组件,流程末尾的箭头指向流程迭代。

在实验阶段,我们将基于初始假使来开发模型,并反复测试和更新模型以产生所需的结果:

1、确定我们要ML系统解决的问题;

2、收集和分析训练ML模型所需的数据(本地、datastudio)

3、创建notebook,打开notebook选择一个ML框架和算法,并为模型的初始版本编码;

4、导入数据和训练模型(通过kale将notebook代码抓换位pipelines部署,负责解决数据依赖关系并管理pipeline生命周期)

5、调整模型超参数(用来控制算法行为的参数)以确保有效的处理和准确的结果.(工作流中最难的部分之一是为模型寻找最佳的超参数。机器学习模型的性能与超参数直接相关。超参数调优越多,得到的模型就越好)

在生产阶段,我们将部署执行以下过程的系统:

1、将数据转换为训练系统所需的格式。(确保我们的模型在训练和预测过程中行为始终一致,转换过程在实验阶段和生产阶段必须相同)

2、训练ML模型

3、服务模型以进行在线预测或以批处理模式进行

4、监督模型的性能,并将结果UI展示(带有模型详细信息、日志、yaml 的 KFServing 用户界面),方便调整或重新训练模型.

整体技术架构

核心特性:

pipelines工作流模型:可以将其当作一个有向无环图DAG。其中每个节点都被称为一个组件。组建处理真正的逻辑,比如预处理、数据清洗、模型训练等。每一个组件负责的功能不同,但有一个共同点,每个组件都是以docker镜像的方式打包,以容器的方式被运行,每个连线都代表了组件之间的input和output。

整体可以将pipeline主要划分为8个部分:

1、python sdk:notebook katib 把代码生成pipelines组件的特定语言(DSL)

2、DSL compiler: 将python代码转换成yaml 静态配置文件(DSL编译器)

3、pipeline web server:用户通过 pipeline流水线产看任务的执行信息(基础图像、命令、参数、component的名称和 id、参数的名称和值,可视化、volume、logs、pod、metadata), 收集各种数据一显示相关视图:当前正在运行的pipeline列表,pipeline执行的历史记录,有关各个pipeline运行的调试信息和执行状态等。通过查看MLMD,可以从数据读取、数据预处理、验证、训练、评估、部署等方面跟踪整个ML工作流的全部过程和信息。

4、pipeline service:后台服务,调用k8s服务从yaml配置中读取信息创建和运行

5、k8s resources:创建crds 运行pipeline

6、ML metadata service:用于监视由pipeline service 创建的k8s资源,并将这些资源的状态持久化在ML元数据服务中(存储任务流容器之间的input/output数据交互)

7、artifact storage: 用于存储的metadata和artifact。pipeline 将元数据存储在mysql】数据库中,将component存储在minio服务器等component存储中。

8、orchestration contrallers:任务编排,比如 visualizationserver或者**workflow控制器,协调任务驱动的工作流

pipelines 工作原理

流水线的定义可以分为两步:

1、第一步定义组件,组件可以从镜像开始完全自定义:

首先需要打包一个docker镜像,这个镜像事组件的依赖,每一个组件的运行,就是一个docker容器。

其次需要为其定义一个python函数,描述组件的输入输出等信息,这一定义是为了能够让流水线理解组件在流水线中的结构,有几个输入/输出节点。

2、根据定义好的组件组成流水线,在流水线中,由输入/输出关系会确定图上的边以及方向。在定义好流水线后,可以通过python中实现好的流水线客户端提交到系统中运行。

Pipeline的整个架构分为5个部分:

1、ScheduledWorkflow CRD扩展了argo proj/argo的workflow定义,这也是刘姝贤乡中的核心,他负责真正的在k8s 上按照拓扑图创建出对应的容器完成流水线的逻辑。

2、phthon SDK负责构造出刘姝贤,并且根据流水线构造出ScheduledWorkflow的yaml定义,随后将其作为参数传递给流水线系统的后端服务。

3、后台服务依赖关系存储数据库(如Mysql)和对象存储(如S3), 处理所有刘姝贤中CRUD请求。

4、前端负责可视化整个流水线的过程,以及获取日志,发起新的运行等。

5、Persistence agent负责把数据从k8s master的Etcd(为一个高可用强一致性的服务发现存储仓库,主要用于共享配置和服务发现)中sync到后段服务的关系型数据库中,其实现的方式与CRD Operator类似,通过informer来监听k8s apiserver对应资源实现。

Kale

作用:kale以notebook扩展的形式提供了一个插件UI。主要利用notebook的json结构在notebook级别(Notebook 元数据)和单个 Cell 级别(Cell 元数据)对它们进行注释。此注释允许:

  • 将代码单元分配给特定的管道组件
  • 将多个单元格合并到一个管道组件中
  • 定义它们之间的(执行)依赖关系

Kale 将带注释的 Jupyter Notebook 作为输入,并生成一个独立的 Python 脚本,该脚本基于 Notebook 和 Cells 注释使用轻量级组件定义 KFP 管道。

用户可以通过kale插件设置pipeline 元数据,并将notebook的cell分配给特定的pipeline step,以及定义依赖项并将多个cells合并在一起。

数据传递:

Kale对notebook的 python代码进行静态分析,检测变量和对象首先声明和使用的位置,功过这种方式,创建了一个内部图关联表示,描述了pipeline步骤之前的数据依赖关系。并且kale在每一组件的开通和结尾注入代码,用来在执行期间将这些对象编组到共享的pvc中。

Kale 对用户透明地处理在pipeline步骤之间传递的数据。

Jupyter 扩展是在用户浏览器中执行的代码,无论集群在哪里。出于这个原因,每当需要与集群或 Kale Python 后端进行交互时,我们都会在后台创建一个新的 Python 内核并执行rpc对 Kale的方法调用,以便在 NotebookServer 容器内执行一些登录。

models(模型服务) - 用于管理模型服务器的 Web 应用程序

作用:可以监控用户部署的所有推理服务,显示 KF Serving 的整个状态。在这里,您可以监控您部署的所有推理服务,查看详细信息、指标和日志。这是我们模型在模型 UI 上的页面。

用例

目前,用户可以通过此 Web 应用程序执行以下工作流程:

  • 查看命名空间中现有 InferenceService CR 的列表
  • 通过提供 YAML 创建一个新的 InferenceService
  • 检查推理服务
    • 查看 InferenceService 的实时状态
    • 检查底层 Knative 资源的 K8s 条件
    • 查看为该 InferenceService 创建的 Model server Pod 的日志
    • 检查存储在 K8s API 服务器中的 YAML 内容
    • 查看一些基本指标

列表页面

该应用程序的主页提供了部署在所选命名空间中的所有 InferenceServices 的列表。前端会定期轮询后端以获取 InferenceServices 的最新状态。

创建

用于创建新 InferenceService 的页面。用户可以粘贴他们想要创建的 InferenceService 的 YAML 对象。

请注意,后端将覆盖.metadata.namespace提交对象的提供字段,以防止用户尝试在其他命名空间中创建 InferenceService。

可以在“详细信息”选项卡上查看更多详细信息

KFServing

KServe 提供了一个简单的 Kubernetes CRD,可以将单个或多个经过训练的模型部署到模型服务运行时,例如TFServing、 TorchServe、Triton Inference Server。此外,KFServer是在 KServe 中使用预测 v1 协议实现的 Python 模型服务运行时, MLServer使用 REST 和 gRPC实现了预测 v2 协议。这些模型服务运行时能够提供开箱即用的模型服务,但您也可以选择为更复杂的用例构建自己的模型服务器。KServe 提供基本的 API 原语,让您轻松构建自定义模型服务运行时,您可以使用其他工具,如BentoML 构建您的自定义模型服务图像。

使用 InferenceService 部署模型后,您将获得 KServe 提供的以下所有无服务器功能。

  • 从零缩放
  • CPU/GPU 上基于请求的自动缩放
  • 修订管理
  • 优化容器
  • 批处理
  • 请求/响应日志记录
  • 交通管理
  • AuthN/AuthZ 的安全性
  • 分布式追踪
  • 开箱即用的指标
  • 入口/出口控制

在 PVC 中存储模型并使用 PVC 上保存的模型创建 InferenceService

代码语言:javascript复制
apiVersion: v1
kind: PersistentVolume
metadata:
  name: task-pv-volume
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/home/ubuntu/mnt/data"

---

代码语言:javascript复制
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: task-pv-claim
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  • 创建带有 s3 的 InferenceServicestorageUri和附加了 s3 凭据的服务帐户。
代码语言:javascript复制
apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
  name: "mnist-s3"
spec:
  predictor:
    serviceAccountName: sa
    tensorflow:
      storageUri: "s3://kserve-examples/mnist"

0 人点赞