背景
Datainsight 是基于kubeflow二次开发的项目。是一个专用于k8s上具备可移植性与可扩展性的机器学习工具包。目标:
- 在不同的基础设施上轻松、可重复、可移植的部署ML 堆栈(例如,在笔记本电脑上进行试验,然后转移到本地集群或云)
- 部署和管理松散耦合的微服务
- 按需扩容
包含的服务:
- 数据准备
- 模型训练,
- 预测服务
- 服务管理
- notebook 创建和管理交互
- 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 凭据的服务帐户。
apiVersion: "serving.kserve.io/v1beta1"
kind: "InferenceService"
metadata:
name: "mnist-s3"
spec:
predictor:
serviceAccountName: sa
tensorflow:
storageUri: "s3://kserve-examples/mnist"