com 对象与其基础 rcw 分开后就不能再使用_如何使用 Kubeflow 机器学习流水线

作者:George Novack
翻译:Bach(才云)
校对:星空下的文仔(才云)、bot(才云)

为什么要使用机器学习流水线

现在,机器学习流水线(Machine Learning Pipeline)被大家给予了极大的关注,它旨在自动化和协调训练机器学习模型所涉及的各个步骤,但是,很多人也不清楚将机器学习工作流程建模为自动流水线到底有什么好处。

当训练新的 ML 模型时,大多数据科学家和 ML 工程师会开发一些新的 Python 脚本或 interactive notebook,以进行数据提取和预处理,来构建用于训练模型的数据集;然后创建几个其他脚本或 notebook 来尝试不同类型的模型或机器学习框架;最后收集、调试指标,评估每个模型在测试数据集上的运行情况,来确定要部署到生产中的模型。

3891a5e2e558ef46eadf1d8c76dd3510.png
手动机器学习工作流程

显然,这是对真正机器学习工作流程的过度简化,而且这种通用方法需要大量的人工参与,并且除了最初开发该方法的工程师之外,其他人都无法轻易重复使用

由此,我们使用机器学习流水线来解决这些问题。与其将数据准备、模型训练、模型验证和模型部署视为特定模型中的单一代码库,不如将其视为一系列独立的模块化步骤,让每个步骤都专注于具体任务。

bed7160ebf58f191bb892faaaea1f637.png
机器学习流水线

将机器学习工作流程建模为机器学习流水线有很多好处:

  • 自动化:通过消除手动干预的需求,我们可以安排流水线按照需求重新训练模型,从而确保模型能够适应随时间变化的训练数据。
  • 重复使用:由于流水线的步骤与流水线本身是分开的,所以我们可以轻松地在多个流水线中重复使用单个步骤。
  • 重复性:任何数据科学家或工程师都可以通过手动工作流程重新运行流水线,这样就很清楚需要以什么顺序运行不同的脚本或 notebook。
  • 环境解耦:通过保持机器学习流水线的步骤解耦,我们可以在不同类型的环境中运行不同的步骤。例如,某些数据准备步骤可能需要在大型计算机集群上运行,而模型部署步骤则可能在单个计算机上运行。

什么是 Kubeflow

Kubeflow 是一个基于 Kubernetes 的开源平台,旨在简化机器学习系统的开发和部署。Kubeflow 在官方文档中被称为 “Kubernetes 机器学习工具包”,它由几个组件(component)组成,这些组件跨越了机器学习开发生命周期的各个步骤,包括了 notebook developent environment、超参数调试、功能管理、模型服务以及 ML Pipelines。

79bb867ff5d9bacbb49bd3626917433e.png
Kubeflow 中央仪表板

在本文中,我们只关注 Kubeflow 的 Pipelines 组件。

环境

本文选择在裸机上运行的 Kubernetes 集群,但实际上我们可以在安装 Kubeflow 的任何 Kubernetes 集群上运行示例代码。本地唯一需要的依赖项是 Kubeflow Pipelines SDK,我们可以使用 pip 安装 SDK:pip install kfp 。

Kubeflow Pipelines

Kubeflow 中的流水线由一个或多个组件(component)组成,它们代表流水线中的各个步骤。每个组件都在其自己的 Docker 容器中运行,这意味着流水线中的每个步骤都具有自己的一组依赖关系,与其他组件无关。

对于开发的每个组件,我们创建一个单独的 Docker 镜像,该镜像会接收输入、执行操作、进行输出。另外,我们要有一个单独的 Python 脚本,pipeline.py 脚本会从每个 Docker 镜像创建 Pipelines 组件,然后使用这些组件构造流水线(Pipeline)。我们总共创建四个组件:

  • preprocess-data:该组件将从 sklearn.datasets 中加载 Boston Housing 数据集,然后将其拆分为训练集和测试集。
  • train-model:该组件将训练模型,以使用“Boston Housing”数据集来预测 Boston 房屋的中位数。
  • test-model:该组件会在测试数据集上计算并输出模型的均方误差。
  • deploy-model:在本文中,我们不会专注于模型的部署和服务,因此该组件将仅记录一条消息,指出它正在部署模型。实际情况下,这可能是将任何模型部署到 QA 或生产环境的通用组件。

3fcc08888086a26d256942265e872437.png
ML 流水线视图

Preprocess Data 组件

第一个 Pipelines 组件用 sklearn.datasets 加载 Boston Housing 数据集。我们使用 Sci-kit Learntrain_test_split 函数将此数据集分为训练集和测试集,然后用 np.save 将数据集保存到磁盘,以便以后的组件重复使用。

5f15f40180b6193044bb0aa7cd563b2b.png

到目前为止,我们只有一个简单的 Python 脚本。现在,我们需要创建一个执行该脚本的 Docker 镜像,这里编写一个 Dockerfile 来创建镜像:

85b74f2a35d53827f06c0a5534027d6f.png

python:3.7-slim 基础镜像开始,我们使用 pip 安装必需的软件包,将预处理的 Python 脚本从本地计算机复制到容器,然后将 preprocess.py 脚本指定为容器 Entrypoint,这样在容器启动时,脚本就会执行。K8sMeetup

构建流水线

现在,我们着手构建流水线,首先要确保可以从 Kubernetes 集群访问上文构建的 Docker 镜像。本文使用 GitHub Actions 构建镜像并将其推送到 Docker Hub。

3d305cbccb8c39e9740fe00af7d9a050.png

现在定义一个组件,每个组件都要定义为一个返回 ContainerOp 类型的对象(object)。此类型来自我们先前安装的 kfp SDK。这是流水线中第一个组件的组件定义:

7c5b6c8df8bd76a04faed45a9127fe9a.png

请注意,对于 image 参数,我们传递了上文 Dockerfile 定义的 Docker 镜像的名称,对于 file_outputs 参数,指定了 Python 脚本组件保存到磁盘的四个 .npy 文件的文件路径。通过将这四个文件指定为“File Output”,我们可以将它们用于流水线中的其他组件。

注意:在组件中对文件路径进行硬编码不是一个很好的做法,就如上面的代码中那样,这要求创建组件定义的人员要了解有关组件实现的特定细节。这会让组件接受文件路径作为命令行参数更加干净,定义组件的人员也可以完全控制输出文件的位置。

定义了第一个组件后,我们创建一个使用 preprocess-data 组件的流水线:

bfc7ded2a4824217772e6d1e11368116.png

流水线由一个注解 @dsl.pipeline 修饰的 Python 函数定义。在函数内,我们可以像使用其他任何函数一样使用组件。为了运行流水线,我们创建一个 kfp.Client 对象,再调用 create_run_from_pipeline_func 函数,并传入定义流水线的函数。

如果执行该脚本,然后导航到 Kubeflow 中央仪表板流水线部分的“Experiment”视图,我们就能看到流水线的执行情况。在流水线的图形视图中单击该组件,我们还可以看到来自 preprocess-data 组件的四个文件输出。

c8143ddd8d31b195b41b55c04c03918a.png
Kubeflow 流水线用户界面

因此,我们可以运行流水线并在 GUI 中进行可视化,但是只有一个步骤的流水线并没什么意思,下面我们来创建其余的组件。

其余组件

对于 train-model 组件,我们创建一个简单的 Python 脚本,该脚本使用 Sci-kit Learn 来训练回归模型。这类似于预处理器组件的 Python 脚本,其中最大的区别是,这里用 argparse 来接受训练数据的文件路径以作为命令行参数。

8fc6d48bf67fca15e65028c8ffcade17.png

这个 Dockerfile 与我们用于第一个组件的非常相似,从基础镜像开始,安装必要的软件包,将 Python 脚本复制到容器中,然后执行脚本。

df333b22044bd10c14dbe04ba4dfa81a.png

其他两个组件 test-model 和 deploy-model 遵循着相同的模式。实际上,它们与我们已经实现的两个组件非常像,这里就不再赘述。如果大家有兴趣,可以在以下 GitHub 存储库中找到该流水线的所有代码:https : //http://github.com/gnovack/kubeflow-pipelines

就像之前的 preprocess-data 组件一样,我们将从这三个组件中构建 Docker 镜像并将其推送到 Docker Hub:

  • train-model: gnovack/boston_pipeline_train
  • test-model: gnovack/boston_pipeline_test
  • deploy-model: gnovack/boston_pipeline_deploy

完整的流水线

现在是时候创建完整的机器学习流水线了。首先,我们为 train-model、test-model 和 deploy-model 组件创建组件定义。

f6ed087165341686e49bc93ef4cad283.png

该 train-model 组件的定义与之前的 preprocess-data 组件的定义之间的唯一主要区别是, train-model 接受两个参数,x_trainy_train,其将作为命令行参数传递给容器并进行解析,这会在使用 argparse 模块的组件实现中。

这里 test-model 和 deploy-model 组件定义为:

e446bf4de73b307eb0c0e3c821c6bec4.png

625185d7e166b1eb44d74a86210b58cb.png

定义了四个 Pipelines 组件后,我们现在重新访问 boston_pipeline 函数,并将所有组件一起使用。

515ffcd25077222c68cefd93b2eb788f.png

这里有几点要注意:

  • 在第 6 行,当我们调用 preprocess_op() 函数时,将函数的输出存储在名为 _preprocess_op 的变量中。要访问 preprocess-data 组件的输出,我们使用 _preprocess_op.outputs['NAME_OF_OUTPUT']
  • 默认情况下,当我们从组件访问 file_outputs 时,我们获取的是文件内容而不是文件路径。在本文中,由于这些不是纯文本文件,因此我们不能仅将文件内容作为命令行参数传递到 Docker 容器组件中。要访问文件路径,我们需要使用 dsl.InputArgumentPath() 并传入组件输出。

现在,如果我们运行创建的流水线并导航到 Kubeflow 中央仪表板中的“Pipelines UI”,我们可以看到流水线图中显示的所有四个组件。

5bd6563af6e9d4215d9503c56a35a758.png

结论

在本文中,我们创建了一个非常简单的机器学习流水线,该流水线可以加载一些数据、训练模型、在保留数据集上对其进行评估、对其进行“deploy”。通过使用 Kubeflow Pipelines,我们能够将该工作流中的每个步骤封装到 Pipelines 组件中,每个组件都在各自独立的 Docker 容器环境中运行。这种封装促进了机器学习工作流程中各步骤之间的松散耦合,并为将来流水线中组件的重复使用提供了可能性。

本文简单介绍了 Kubeflow Pipelines 的功能,希望能够帮助大家了解组件(component)的基础知识,以及如何使用它们创建和运行流水线。

原文链接:如何使用 Kubeflow 机器学习流水线

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

markdown一边写一边预览_markdown文章编辑利器-基础篇

John Gruber(约翰-格鲁伯)创造了一个简单的语法,却是文章笔记的编辑利器,看看他是怎么做的吧。约翰君一天躺在床上正在思考着给烦人的老总提交会议笔记,一边写一边碎碎念,让我写会议笔记还不如让我写代码。约翰君越想越气&#xf…

【C#】解析C#中JSON.NET的使用

目录结构: contents structure [-]JSON.NET简介Serializing and Deserializing JSONJson ConvertJson SerializerLINQ TO JSONConverting XMLConvert JSON to XMLConvert XML to JSON原文链接JSON.NET对于.NET来说是一个非常高效的JSON框架。 1. JSON.NET的简介 使用…

android闹钟唤醒不准的原因_俄罗斯睡眠专家:闹钟铃声选错了,可能扰乱你的内分泌...

对不少人来说,起床是件和天性对抗的事。而“自然醒”和“被闹钟吵醒”,完全是两种不同的睡眠体验。近日,俄罗斯一项新研究指出,错误的闹铃声可能给健康带来负面影响。《生命时报》结合研究采访专家,解读闹铃声对身体的…

软件工程个人作业01

|小学生四则运算| 设计思想: 1 程序生成数据,并存到数据库Mysql; 2用户输入数据 3程序接收数据,并判断数据 4返回信息。 源程序代码: java文件 package pers.sun.operateion;//产生一个算式,及相应的结果public class …

db设计专用excel_工程师必备:硬件EMC设计规范

一引言广义的电磁兼容控制技术包括抑制干扰源的发射和提高干扰接收器的敏感度,我们都知道干扰源、干扰传输途径和干扰接收器是电磁干扰的三要素,同时EMC也是围绕这些问题进行研究,而运用最为广泛的抑制方法是屏蔽、滤波和接地,用它…

快速手动替换 Windows 7 系统字体

自从发现 GDI 这个能把 Windows 字体显示效果变得更平滑的软件之后,就欲罢不能了。借用网上的一张图片(来源未知),对比了 Windows 标准、Windows Cleartype、GDI 和 Mac OS 四种情况下的字体效果,很明显 GDI 的效果非常…

使用说明 思迅收银系统_便利店收银使用的收银系统应该取决于什么?

生活中,我们常见的便利店规模可大可小,比如最小就十平米,大的话也有可能会好几百平米,有些人疑惑,到底便利店该不该使用收银系统,又或者该如何选择合适的收银系统。其实,不管如何,只…

MFC+GDI+绘制出雷达余晖效果

MFCGDI绘制出雷达余晖效果 1.首先要画出静态的坐标轴,用双缓冲方法在onpain消息中绘制。绘制方法都比较简单。声明一个内存DC,绘制一个圆形,再把坐标轴画上去。 void CDlg_RadarScanning::OnPaint() {CPaintDC dc(this); // device context …

如果你们都忘记了鼓励原创,那,我们来 - 2017年度原创IT博主全网评选

2017最后一个月,当全世界都是各种年度总结,奖励的时候,IT博客圈似乎已经被人遗忘。而,那些还在半夜,加班写博客,分享自己经验的热心程序猿们,依然,吭哧吭哧的写着,为了几…

android用户界面-菜单

创建菜单 Creating Menus Android提供了三种基础菜单类型: 选项菜单Options Menu 这是一个活动的主菜单。通过按下设备菜单键来显示它。选项菜单包含两组菜单项: 图标菜单Icon Menu 这个是当用户按下菜单键时最初出现屏幕下方的item集合。它支持最多…

流浪宠物救助网站前端页面_全国爱心人士齐聚鞍山 救助流浪猫狗

入冬之后,流浪猫狗的“吃饭问题”成了众多爱心人士的牵挂。12日上午,来自全国各地的20余位爱心人士,来到宁远镇张忠堡村一流浪猫狗救助站,将价值7000余元的宠物用品捐赠给救助站。当日早上8时许,爱心人士们特意到铁西八…

微信小程序 开发过程中遇到的坑(一)

21241.我们使用app.json文件来对微信小程序进行全局配置,决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 的时候在pages中写注释的时候回报错。 例如: {"pages":[//这是首页面"pages/welcome/welcome"] } 此时就会报错…

java 创建日程到期提醒_日程管理工具—Things 3

Mac上最好用的日程管理工具是哪个?Things 3 for Mac是首选,Things3 Mac全新的设计,外观简洁、大气,功能也是非常强大的,让你用一种优雅而直观的方式来管理个人事务,无论在生活还是工作中,都能取…

钢材规格解读的软件_万维软件ERP五金建材行业解决方案

一、五金建材行业的特征:1、企业的规对较小:身为老板却“身兼多职”,采购、销售、发货、出纳啥都做;2、业务非常多样:虽然这类企业规模小,但也涉及到批发、零售、工程(局部工程)、家装等经营型态&#xff0…

duilib学习

记录duilib自学过程。 最近年底公司也没啥事情,自己就想着上网看看duilib怎么制作界面,因为之前想学习一直没时间,现在来看看。 其实学习的就好办法就是看demo,关于duilib网上的学习教程并不多,自己跟着demo敲一遍代…

记:ubuntu下交叉编译arm的链接库

以第三方库libjpeg为例,编译所需要的三步: 1、配置./configure脚本参数, ./configure --prefix/home/huanghaitao/Winshare/jpeg-9c/libjpeg CCarm-linux-gnueabihf-gcc --hostarm-linux --enable-shared --enable-static–prefix&#xff0…

flash 绘图API:绘制弧线

把之前没有记录的笔记都记录一下,顺便方便日后查询。绘制弧线,对于一些制作课件的人来讲会有一些用处的。绘制弧线采用的基本思路是采用描点的方法实现。从一个开始角度,到另一个角度结束,在这个角度区间里面进行描点连线。 【A&a…

关于SDL SDL_CreateWindowFrom和SDL_DestroyWindow第二次后无法将视频显示出来。

最近自己用QT搞一个监控平台的程序UI,然后后台一些视频处理是使用FFMPEG和SDL来做的。 在关闭播放窗口SDL_DestroyWindow后,再次去显示视频就会发现显示不出来。代码如下 int SDLPlayer::SDLPlay() {SDL_Window *sdlScreen{ NULL };//窗口SDL_Renderer*…

vos限制客户呼出时间

问题: 公司希望自己的卡线晚上 21:00-24:00 早上00:00-7:30不能打出电话,以防遭投拆, 那么如何设置? 方法: 找到客户使用的落地网关, 落地网关——补充设置…

QT-监视平台

空余时间学习QT的UI,做了一个监视平台,直接上图。 页面1:视频监控 页面2:视频回放 页面3:系统设置 未完成。。。。。。。。 做的不好的地方请大家指正,项目现在还在开发阶段,仅供学习参考…