Kubeflow调研

news/2024/7/4 1:46:31

文章目录

  • Kubeflow基本概念
  • 创建Kubeflow的Component
    • 通过Yaml定义
    • 在代码中创建
    • 在Jupyter中创建
  • Kubeflow的架构
    • TensorFlow Training 的支持 (TFJob)
    • 与 Jupyter Notebook 的整合
    • KFServing
  • 以解决一个分子属性预测问题为例,阐述如何用kubeflow实现
  • Kubeflow 的总结

Kubeflow基本概念

Kubeflow 是一个 Google 主导的 Kubernetes 与机器学习工作流集成框架,帮助机器学习任务更好的运行在云环境中,进行分布式的处理,扩展到大量的机器,可以移植到不同平台,观察模型的运行效果等等。

Kubeflow 可以做的事情包括:

  • data preparation
  • model training
  • prediction serving
  • service management

机器学习工作流分为开发流程生产流程两个阶段

在这里插入图片描述

图1. 开发流程与生产流程

Kubeflow 有以下的概念:

  • Pipeline - 一个机器学习工作流管线,执行一系列的计算步骤,有多个 component 组成

  • Component - 工作流中的一个计算任务,相当于一个 python 函数,有固定的输入和输出,并且相互依赖

  • Experiment - 工作流的一个配置环境,一套执行的参数

  • Run - 表示 Pipeline 在一个 Experiment 环境下的一次执行

  • Recurring Run - 是一种会定时重复执行的 Run,也称为 Job

  • Step - 对应 Run 中一个 Component 的执行

  • Artifact - 一个输入或输出得到数据集

在这里插入图片描述

图2. Kubeflow整体设计

创建Kubeflow的Component

Kubeflow 的设计中,每个 Component 就是一个 python 函数,被打包成 Docker 容器,多个 Component 组成一个 Pipeline,提交到 Kubernetes 进行执行,并按要求分配指定的计算资源需求, Kubeflow Pipeline 的 Server 进行管理。指定输入和输出数据的 s3 路径,由系统进行加载。Run 的记录,Pipeline 的配置,以及运行的结果可以在 Kubeflow UI 中查看,以及创建新的 Run。

每个 Component 是一个具体的计算任务,支持多种机器学习框架,如 Tensorflow,PyTorch,MXNet,MPI。Pipeline 除了可以通过 YAML 文件定义之外还可以用 Python 脚本或者在 Jupyter Notebook 中动态创建。除了单次执行的 Pipeline,**还支持以 Serving 的方式将计算模型部署成一个服务,并监控 Serving 的状态。**任务依赖是由 Argo 来进行管理的。每一种计算任务有相应的 Operator 调度,控制底层 Kubernetes 的调度和资源分配。整个系统可以运行在不同的云平台上。

相关文档

  • sdk-overview
  • build-component

通过Yaml定义

代码1 一个 Component 的定义:

name: xgboost4j - Train classifier
description: Trains a boosted tree ensemble classifier using xgboost4j

inputs:
- {name: Training data}
- {name: Rounds, type: Integer, default: '30', help: Number of training rounds}

outputs:
- {name: Trained model, type: XGBoost model, help: Trained XGBoost model}

implementation:
  container:
    image: gcr.io/ml-pipeline/xgboost-classifier-train@sha256:b3a64d57
    command: [
      /ml/train.py,
      --train-set, {inputPath: Training data},
      --rounds,    {inputValue: Rounds},
      --out-model, {outputPath: Trained model},
    ]
  • name - Component 的名称

  • description - 任务描述

  • inputs - 输入参数列表,可以定义 name,类型,默认值等

  • outputs - 输出参数列表

  • implementation - 计算任务的描述,在这里指定一个 Docker 镜像,以及启动参数,并且指定了模板参数

可以通过 python 代码创建 Pipeline,使用 decorator 来标识,函数的参数就是整个 Pipeline 的参数。中间的步骤不会直接被执行,而是创建一个计算图,每一个步骤是一个 Component,交给 Kubernetes 进行分布式处理

在代码中创建

代码2 一个 Pipeline 的结构:

from kfp import dsl
from kubernetes.client.models import V1EnvVar, V1SecretKeySelector


@dsl.pipeline(
    name='foo',
    description='hello world')
def foo_pipeline(tag: str, pull_image_policy: str):

    # any attributes can be parameterized (both serialized string or actual PipelineParam)
    op = dsl.ContainerOp(name='foo',
                        image='busybox:%s' % tag,
                        # pass in init_container list
                        init_containers=[dsl.InitContainer('print', 'busybox:latest', command='echo "hello"')],
                        # pass in sidecars list
                        sidecars=[dsl.Sidecar('print', 'busybox:latest', command='echo "hello"')],
                        # pass in k8s container kwargs
                        container_kwargs={'env': [V1EnvVar('foo', 'bar')]},
    )

    # set `imagePullPolicy` property for `container` with `PipelineParam`
    op.container.set_pull_image_policy(pull_image_policy)

    # add sidecar with parameterized image tag
    # sidecar follows the argo sidecar swagger spec
    op.add_sidecar(dsl.Sidecar('redis', 'redis:%s' % tag).set_image_pull_policy('Always'))

在这里插入图片描述

图3. 通过Kubeflow SDK在代码中使用

在Jupyter中创建

在这里插入图片描述

图4. 在Notebook中使用Kubeflow

Kubeflow的架构

在 Kubeflow 之下,真正负责 Pipeline 执行的是 Argo Workflow Controller,把计算任务提交给 Kubernetes。

在这里插入图片描述

图5. Kubeflow Pipeline架构

TensorFlow Training 的支持 (TFJob)

特定于 Tensorflow 任务,进行分布式计算资源管理的功能,实现在 TFJob 组件中,这是一个基于 tf-operator 的 Kubernetes CRD。

对于 PyTorch,MXNet,Chainer,MPI 任务也有对应的组件

与 Jupyter Notebook 的整合

以上面的方式可以通过 YAML 和 Python 脚本创建 Component 和 Pipeline,另外也可以通过 Notebook 创建,适合交互式开发的场景,动态地部署一个 Python 函数,持续创建和部署新任务,并且查看数据,验证计算结果。

这种方式的好处的用户不需要本地创建开发环境,只需要浏览器中操作,并且可以进行访问控制,Notebook 也可以保存起来,把整个环境分享给同事。

KFServing

Kubeflow 提供了自己的 Serving 组件,对于需要部署到生产环境的机器学习模型,进行服务化,常驻在内存,不需要每次进行预测重新加载模型。KFServing 底层基于 Knative 和 Istio,实现了一个 Serverless 的弹性扩展服务。

在这里插入图片描述

图6. KFServing架构图

以解决一个分子属性预测问题为例,阐述如何用kubeflow实现

  1. 定义环境,将分子属性预测问题依赖的环境整理为docker镜像
  2. 定义数据,将分子属性预测问题依赖的数据存放到指定地点,如S3
  3. 定义多个Component,并启动Pipeline
name: mol_attr_pred - Train classifier
description: Trains a Molecular attribute prediction

inputs:
- {name: Training data}
- {name: Rounds, type: Integer, default: '30', help: Number of training rounds}

outputs:
- {name: Trained model, type: Tensorflow model, help: Trained Tensorflow model}

implementation:
  container:
    image: gcr.io/ml-pipeline/mol_attr_pred-classifier-train@sha256:b3a64d57
    command: [
      /ml/train.py,
      --train-set, {inputPath: Training data},
      --rounds,    {inputValue: Rounds},
      --out-model, {outputPath: Trained model},
    ]

可以在dashboard中查看任务

在这里插入图片描述

图7. Dashboard

在这里插入图片描述

图8. 启动一个Pipeline

Kubeflow 的总结

支持很多的机器学习框架,包括 Tensorflow,PyTorch,MXNet,TensorRT,ONNX,MPI 等等

高度集成 Kubernetes,Google Cloud,AWS,Azure 等云平台

核心基于 Component 和 Pipeline 等概念

提供的任务管理,历史任务,任务提交,计算调度等功能

有 Serving 的框架

支持 Jupyter Notebook 中交互式创建任务

有多个松散、独立的组件构成

部署比较复杂,运维成本很高,跟云平台过度耦合

API 复杂,组件多,概念多,过度工程化

文档混乱(极其混乱。。。)


http://www.niftyadmin.cn/n/1493275.html

相关文章

利用consul在spring boot中实现最简单的分布式锁

因为在项目实际过程中所采用的是微服务架构,考虑到承载量基本每个相同业务的服务都是多节点部署,所以针对某些资源的访问就不得不用到用到分布式锁了。 这里列举一个最简单的场景,假如有一个智能售货机,由于机器本身的原因不能同一…

Oracle常用结构或函数使用笔记一

With用法: The WITH query_name clause lets you assign a name to a subquery block. You can then reference the subquery block multiple places in the query by specifying the query name. Oracle optimizes the query by treating the query name as either…

*在scanf printf中的作用

在网上看到的&#xff0c;贴过来记录一下 http://www.cppleyuan.com/viewthread.php?tid9428 一个有趣的打印菱形的程序 1 #include <stdio.h>2 3 int line 1;4 int main()5 {6 printf("%*s\n",7 7-(line>4? line-4: 4-line),8 …

牛客算法题

字节题库 NC78 反转链表 NC78 反转链表 迭代法 class Solution:# 返回ListNodedef ReverseList(self, pHead):ppHeadpreNonewhile p:aftp.nextp.nextprepreppaftreturn pre递归法 class Solution:# 返回ListNodedef ReverseList(self, pHead):if not pHead or not pHead.n…

中台之上(六):如何为一个商业银行设计业务架构?

从实际操作的角度讲&#xff0c;企业级业务架构设计及其建模过程是一个充满可能性和争议的过程&#xff0c;并没有一个直观的量化标准能够用于判断一个架构方案的好坏&#xff0c;我们可以通过一个虚拟的例子体会一下。 假定我们为A商业银行设计企业级业务架构&#xff0c;为了…

树模型问题汇总

文章目录决策树集成学习AdaBoostGBDTXgboostXgboost在优缺点Xgboost损失函数推导与求解Xgboost计算过程gblinearXgboost结点分裂的近似策略Xgboost在工程实现上有哪些特点1.块结构设计2.缓存访问优化算法3.“核外”块计算Xgboost是怎么做到并行化的&#xff1f;LightGBMGOSS 单…

2、Dubbo-核心概念

dubbo核心概念 2.1&#xff09;、简介 Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架&#xff0c; 它提供了三大核心能力&#xff1a;面向接口的远程方法调用&#xff0c;智能容错和负载均衡&#xff0c;以及服务自动注册和发现。 官网&…

常见的时间复杂度

文章目录O(log⁡N)\mathcal{O}(\log N)O(logN)有序数据相对有序数据每次操作排除一半可能性二叉搜索树判断二叉树是否合法BST的查找BST的插入BST的删除可以转为为二分查找的问题O(log⁡N⋅log⁡N)\mathcal{O}(\log N \cdot \log N)O(logN⋅logN)O(N)\mathcal{O}(N)O(N)O(Nlog⁡…