kubeflow系列(二):kubeflow组件介绍

简介: kubeflow作为基于云原生的机器学习大礼包,即可以作为一个很好的云原生的学习例子,同时基于k8s的生态必将是未来的发展的方向,相信后续Mxnet、paddle等各类型技术框架也都会运行在kubernetes这个生态之上,而对组件和架构的梳理可以以最快的速度了解kubeflow。

为了对kubeflow有个更直观深入的了解,对kubeflow的各组件进行简单的介绍,先从机器学习任务来看kubeflow的的实现。

kubeflow系列(一):kubeflow安装

机器学习任务工程化实现流程

一个建模任务下来主要可以分为四大块任务

  • 业务理解(Business Understanding)
  • 数据获取及数据理解(Data Acquistition)
  • 特征处理(Feature Engineering)、建模与模型训练(Model Training)、模型评估(Model Evaluation)
  • 模型部署(Deployment),提供模型服务

image.png

一个机器学习任务从开始到结束主要分为了四大任务,Kubeflow的各项功能可以说就是围绕这四项任务构建的。

kubeflow

kubeflow 最开始基于tf-operator,后来随着项目发展最后变成一个基于云原生构建的机器学习任务工具大集合。从数据采集,验证,到模型训练和服务发布,几乎所有步骤的小组件 Kubeflow 都提供解决方案的组件:

image.png

kubeflow特点:

  • 基于k8s,具有云原生的特性:弹性伸缩、高可用、DevOps等
  • 集成大量机器学习所用到的工具

结构

kubeflow的完整结构可以看他的kustomize安装文件:

kustomize/
├── ambassador.yaml
├── api-service.yaml
├── argo.yaml
├── centraldashboard.yaml
├── jupyter-web-app.yaml
├── katib.yaml
├── metacontroller.yaml
├── minio.yaml
├── mysql.yaml
├── notebook-controller.yaml
├── persistent-agent.yaml
├── pipelines-runner.yaml
├── pipelines-ui.yaml
├── pipelines-viewer.yaml
├── pytorch-operator.yaml
├── scheduledworkflow.yaml
├── tensorboard.yaml
└── tf-job-operator.yaml

ambassador 微服务网关
argo 用于任务工作流编排
centraldashboard kubeflow的dashboard看板页面
tf-job-operator 深度学习框架引擎,一个基于tensorflow构建的CRD,资源类型kind为TFJob
tensorboard tensorflow的训练可视化UI界面
katib 超参数服务器
pipeline 一个机器学习的工作流组件
jupyter 一个交互式业务IDE编码环境

TFJob

image.png

TFJob 是将 tensorflow 的分布式架构基于 k8s 构建的一种CRD:

  • Chief 负责协调训练任务
  • Ps 参数服务器,为模型的参数提供分布式的数据存储
  • Worker 负责实际训练模型的任务. 在某些情况下 worker 0 可以充当Chief的责任。
  • Evaluator 负责在训练过程中进行性能评估
apiVersion: kubeflow.org/v1beta2
kind: TFJob
metadata:
  name: mnist-train
  namespace: kubeflow
spec:
  tfReplicaSpecs:
    Chief: # 调度器
      replicas: 1
      template:
        spec:
          containers:
            - command:
              - /usr/bin/python
              - /opt/model.py
              env:
              - name: modelDir
                value: /mnt
              - name: exportDir
                value: /mnt/export
              image: mnist-test:v0.1
              name: tensorflow
              volumeMounts:
              - mountPath: /mnt
                name: local-storage
              workingDir: /opt
            restartPolicy: OnFailure
            volumes:
            - name: local-storage
              persistentVolumeClaim:
                claimName: local-path-pvc
    Ps: # 参数服务器
      replicas: 1
      template:
        spec:
          containers:
            - command:
              - /usr/bin/python
              - /opt/model.py
              env:
              - name: modelDir
                value: /mnt
              - name: exportDir
                value: /mnt/export
              image: mnist-test:v0.1
              name: tensorflow
              volumeMounts:
              - mountPath: /mnt
                name: local-storage
              workingDir: /opt
            restartPolicy: OnFailure
            volumes:
            - name: local-storage
              persistentVolumeClaim:
                claimName: local-path-pvc
    Worker: # 计算节点
      replicas: 2
      template:
        spec:
          containers:
            - command:
              - /usr/bin/python
              - /opt/model.py
              env:
              - name: modelDir
                value: /mnt
              - name: exportDir
                value: /mnt/export
              image: mnist-test:v0.1
              name: tensorflow
              volumeMounts:
              - mountPath: /mnt
                name: local-storage
              workingDir: /opt
            restartPolicy: OnFailure
            volumes:
            - name: local-storage
              persistentVolumeClaim:
                claimName: local-path-pvc

tensorboard 训练可视化界面

挂载日志文件,创建 tensorboard 可视化服务

apiVersion: v1
kind: Service
metadata:
  name: tensorboard-tb
  namespace: kubeflow
spec:
  ports:
  - name: http
    port: 8080
    targetPort: 80
  selector:
    app: tensorboard
    tb-job: tensorboard
---
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: tensorboard-tb
  namespace: kubeflow
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: tensorboard
        tb-job: tensorboard
      name: tensorboard
      namespace: kubeflow
    spec:
      containers:
      - command:
        - /usr/local/bin/tensorboard
        - --logdir=/mnt
        - --port=80
        env:
        - name: logDir
          value: /mnt
        image: tensorflow/tensorflow:1.11.0
        name: tensorboard
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /mnt
          name: local-storage
      serviceAccount: default-editor
      volumes:
      - name: local-storage
        persistentVolumeClaim:
          claimName: mnist-test-pvc

tf-serving

tenserflow serving 提供一个稳定的接口,供用户调用,来应用该模型,serving 通过模型文件直接创建模型即服务(Model as a service)

image.png

apiVersion: v1
kind: Service
metadata:
  labels:
    app: mnist
  name: mnist-service-local
  namespace: kubeflow
spec:
  ports:
  - name: grpc-tf-serving
    port: 9000
    targetPort: 9000
  - name: http-tf-serving
    port: 8500
    targetPort: 8500
  selector:
    app: mnist
  type: ClusterIP
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    app: mnist
  name: mnist-service-local
  namespace: kubeflow
spec:
  template:
    metadata:
      labels:
        app: mnist
        version: v1
    spec:
      containers:
      - args:
        - --port=9000
        - --rest_api_port=8500
        - --model_name=mnist
        - --model_base_path=/mnt/export
        command:
        - /usr/bin/tensorflow_model_server
        env:
        - name: modelBasePath
          value: /mnt/export
        image: tensorflow/serving:1.11.1
        imagePullPolicy: IfNotPresent
        livenessProbe:
          initialDelaySeconds: 30
          periodSeconds: 30
          tcpSocket:
            port: 9000
        name: mnist
        ports:
        - containerPort: 9000
        - containerPort: 8500
        resources:
          limits:
            cpu: "4"
            memory: 4Gi
          requests:
            cpu: "1"
            memory: 1Gi
        volumeMounts:
        - mountPath: /mnt
          name: local-storage

pipeline

pipeline 是一个可视化的kubeflow任务工作流(Workflow),定义了一个有向无环图描述的流水线,流水线中每一步流程是由容器定义组成的组件。

运行步骤:

  • 先要定义一个Experiment实验
  • 然后发起任务,定义一个Pipeline
  • 运行Pipeline实例

image.png

pipeline结构介绍

image.png

pipeline主要分为八部分:

  • Python SDK: 用于创建kubeflow pipeline 的DSL
  • DSL compiler: 将Python代码转换成YAML静态配置文件
  • Pipeline web server: pipeline的前端服务
  • Pipeline Service: pipeline的后端服务
  • Kubernetes resources: 创建CRDs运行pipeline
  • Machine learning metadata service: 用于存储任务流容器之间的数据交互(input/output)
  • Artifact storage: 用于存储 Metadata 和 Pipeline packages, views
  • Orchestration controllers:任务编排,比如Argo Workflow.

案例

import kfp
from kfp import dsl

def gcs_download_op(url):
    return dsl.ContainerOp(
        name='GCS - Download',
        image='google/cloud-sdk:272.0.0',
        command=['sh', '-c'],
        arguments=['gsutil cat $0 | tee $1', url, '/tmp/results.txt'],
        file_outputs={
            'data': '/tmp/results.txt',
        }
    )


def echo2_op(text1, text2):
    return dsl.ContainerOp(
        name='echo',
        image='library/bash:4.4.23',
        command=['sh', '-c'],
        arguments=['echo "Text 1: $0"; echo "Text 2: $1"', text1, text2]
    )


@dsl.pipeline(
  name='Parallel pipeline',
  description='Download two messages in parallel and prints the concatenated result.'
)
def download_and_join(
    url1='gs://ml-pipeline-playground/shakespeare1.txt',
    url2='gs://ml-pipeline-playground/shakespeare2.txt'
):
    """A three-step pipeline with first two running in parallel."""

    download1_task = gcs_download_op(url1)
    download2_task = gcs_download_op(url2)

    echo_task = echo2_op(download1_task.output, download2_task.output)

if __name__ == '__main__':
    kfp.compiler.Compiler().compile(download_and_join, __file__ + '.yaml')

jupyter-notebook

jupyter 是最大限度的利用交互式的工作,他的主要工作体现利用交互式的操作帮助用户快速理解数据和测试评估模型。

主要包括两个模块jupyter-web-appnotebook-controller, jupyter 架构:
image.png

也可以用 jupyterhub 代替jupyter, jupyterhub提供了更多功能, jupyterhub 结构:

image.png

参考文献

https://www.kubeflow.org/docs/notebooks/
https://www.kubeflow.org/docs/pipelines/overview/concepts/graph/
https://www.kubeflow.org/docs/pipelines/overview/pipelines-overview/

目录
相关文章
|
存储 机器学习/深度学习 Kubernetes
kubeflow系列:基于国内阿里云镜像解决kubeflow一键安装
google出品在国内都存在墙的问题,而kubeflow作为云原生的机器学习套件对团队的帮助很大,对于无条件的团队,基于国内镜像搭建kubeflow可以帮助大家解决不少麻烦,这里给大家提供一套基于国内阿里云镜像的kubeflow 0.6的安装方案。
9591 0
kubeflow系列:基于国内阿里云镜像解决kubeflow一键安装
|
Kubernetes TensorFlow 算法框架/工具
Kubeflow 使用指南
Kubeflow(https://github.com/kubeflow)是基于Kubernetes(https://kubernets.io,容器编排与管理服务软件)和TensorFlow(https://tensorflow.org,深度学习库)的机器学习流程工具,使用Ksonnet进行应用包的管理。
13599 0
|
缓存 Kubernetes API
K8S 性能优化 - K8S APIServer 调优
K8S 性能优化 - K8S APIServer 调优
|
存储 Kubernetes 数据可视化
|
弹性计算 容器 RDMA
在Kubernetes上使用RDMA
### RDMA RDMA(全称RemoteDirect Memory Access) 它为了解决网络传输中服务器端数据处理的延迟而产生。 它的原理是将待传输的数据从一台计算机的内存,直接传输到另一台计算机的内存,整个传输过程无需操作系统和协议栈的介入。
10453 0
|
7月前
|
人工智能 网络协议 Linux
MCP 协议: Streamable HTTP 是最佳选择
随着AI应用变得越来越复杂并被广泛部署,原有的通信机制面临着一系列挑战。近期MCP仓库的PR #206引入了一个全新的Streamable HTTP传输层替代原有的HTTP+SSE传输层。本文将详细分析该协议的技术细节和实际优势。
4078 100
|
人工智能 Cloud Native Serverless
2024云栖大会资料精选,《云原生+AI核心技术&最佳实践》PPT全量放送!
关注阿里云云原生公众号,后台回复:2024 云栖大会,即可免费下载云原生云栖大会核心资料合集。
2894 35
|
机器学习/深度学习 存储 人工智能
如何玩转Kubeflow Pipelines
 1. 背景近些年来,人工智能技术在自然语言处理、视觉图像和自动驾驶方面都取得不小的成就,无论是工业界还是学术界大家都在惊叹一个又一个的模型设计。但是对于真正做过算法工程落地的同学,在惊叹这些模型的同时,更多的是在忧虑如果快速且有效的将这些模型落地到业务中,并产生商业价值。正如Google 《Hidden Technical Debt in Machine Learning Systems》中说的
如何玩转Kubeflow Pipelines
|
Kubernetes 负载均衡 网络协议
k8s中iptables与ipvs详解——2023.05
k8s中iptables与ipvs详解——2023.05
2734 0
|
机器学习/深度学习 Kubernetes 算法
玩转Kubeflow第一章: kubeflow 国内本地安装及案例介绍
kubeflow 是 google 开源的一个基于 kubernetes 的 ML workflow 平台,其集成了大量的机器学习工具,这里给大家介绍下基于阿里云镜像仓库进行kubeflow安装部署,同时通过 kittab 超参数案例,pipeline workflow 的例子给大家详细介绍kubeflow各组件的玩法,同时在最后提出针对kubeflow 构建 MLOps 平台的一些思考。
19458 2
玩转Kubeflow第一章: kubeflow 国内本地安装及案例介绍