Kubeflow Pipeline - 构建自定义的 Workflow

时间:2022-07-22
本文章向大家介绍Kubeflow Pipeline - 构建自定义的 Workflow,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1 Overview

要把 Kubeflow 的 Pipeline 用溜了,肯定是需要有自定义 Pipeline 的能力了,所以需要熟悉一下 Pipeline 里的一些概念。

如果要搞清楚 Pipeline,?这些文档都必须要读一下,否则你是不清楚怎么利用 Kubeflow 团队提供的 SDK 来构建自己的容器工作流的。

https://www.kubeflow.org/docs/pipelines/

本文的目标就是构建一个简单并且本地可用的 Pipeline。

P.S. 这里先不涉及做机器学习的流程

2 Steps

2.1 理解 component 和 pipeline

A -> B -> C

这个流程可以理解成 pipeline,A, B, C 分别就是 component。

pipeline 可以只有一个 component。

2.2 Python SDK 构建 component 和 pipeline

假设现在你想写一个机器学习的 pipeline,大概抽象成?几个步骤。

读取数据 -> 进行训练 -> 保存模型

要构建完整的 pipeline,需要先考虑构建每个步骤 component 的问题。

构建 pipeline 可以有几种方式,区别在于是否将 Python SDK 的代码嵌入到业务代码里。因为如果你本来就写好了一个 training 的程序,那么这时候就可以直接利用 Docker 镜像,将业务代码封装成一个镜像,无需侵入。另一种方法就是边写 training 程序的时候边把 SDK 中构建 component 的方法带上。

两种方法都是 workd 的,可以参考 https://www.kubeflow.org/docs/pipelines/sdk/sdk-overview/

是一个简单的例子。

import kfp
from kfp import dsl


def test_for_test():
  # 假设 python:alpine3.6 就是我们要工作的镜像和执行的具体代码的地方
  # 通过 dsl.ContainerOp() 就把上述工作内容作为一个 component 
  return dsl.ContainerOp(
      name='testfortest',
      image='python:alpine3.6',
      command=['sh', '-c'],
      arguments=["echo 'testfortest'"]
  )

# 然后就是设计 pipeline
# 本例很简单,只有一个 component
@dsl.pipeline(
    name='test for test',
    description='test for test'
)
def try_test_for_test():
  test_for_test()


if __name__ == '__main__':
  # 通过这个方法,生成一个 zip 文件,用来在 Pipeline UI 上上传的
  kfp.compiler.Compiler().compile(try_test_for_test, __file__ + '.zip')

2.3 上传 pipeline

至于为什么是一个 zip 文件,其实是因为通过前端上传 zip 文件,后端会解析成 Argo 需要的 YAML 文件。

上传完成,可以试跑一下,只要能访问镜像,就可以。这里就不赘述了。

3 Summary

Pipeline 实际上提供了一个 Workflow 这样的一个开箱即用的工具,通过 Python SDK,用户可以自定义自己的工作流。

本文只介绍了一个简答的 pipeline,后面的文章还会介绍一下,如果运行一个真正的机器学习的任务。