Kubeflow Pipeline - 构建自定义的 Workflow
1 Overview
要把 Kubeflow 的 Pipeline 用溜了,肯定是需要有自定义 Pipeline 的能力了,所以需要熟悉一下 Pipeline 里的一些概念。
如果要搞清楚 Pipeline,?这些文档都必须要读一下,否则你是不清楚怎么利用 Kubeflow 团队提供的 SDK 来构建自己的容器工作流的。
本文的目标就是构建一个简单并且本地可用的 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,后面的文章还会介绍一下,如果运行一个真正的机器学习的任务。
- mac上如何卸载oracle jdk 1.7
- python自动化测试(六)yaml文件管理数据
- java: ant 脚本示例
- mysql 删表引出的问题
- 修改chrome插件
- cron和crontab
- jboss上的soap web service开发示例
- 微信小程序与新零售相结合引流又出新方法啦!
- JAVA CDI 学习(2) - Scope 生命周期
- JAVA CDI 学习(3) - @Produces及@Disposes
- 3分钟带你学会git向github推送!
- JAVA CDI 学习(4) - @Alternative/@Default/@Any & Extension
- centos6.6 下安装mysql
- silverlight 4 tools for vs2010无法在vs2010 SP1上安装的解决办法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用二维数据构造简单卷积神经网络
- HTTP的同源策略与跨域资源共享(CORS)机制
- tf.transpose函数解析
- 新版RTSP协议视频流媒体平台EasyNVR首页播放器遮挡下拉框的问题优化
- CentOS系统下RTSP协议拉流视频平台EasyNVR端口如何穿透防火墙?
- 高吞吐量消息系统—kafka
- 国人开源了一款小而全的 Java 工具类库,厉害啊!!
- tf.session.run()单函数运行和多函数运行区别
- 使用 Tensorflow 在 CIFAR-10 二进制数据集上构建 CNN
- Hold Time违例,该如何解决
- Tensorflow BN详解:4_使用tf.nn.batch_normalization实现BN
- Tensorflow BatchNormalization详解:3_使用tf.layers高级函数来构建带有BN的神经网络
- 【DB宝17】使用mysqldump+mysqlbinlog恢复误删除的数据库
- 13-3 vi编辑模式和移动光标
- Tensorflow BatchNormalization详解:2_使用tf.layers高级函数来构建神经网络