像Google一样构建机器学习系统3 - 利用MPIJob运行ResNet101
本系列将利用阿里云容器服务,帮助您上手Kubeflow Pipelines.
- 第一篇:在阿里云上搭建Kubeflow Pipelines
- 第二篇:开发你的机器学习工作流
- 第三篇:利用MPIJob运行ResNet101
从上篇文章中,我们可以看到如何通过Kubeflow Pipeline运行单节点任务机器学习工作流,在本文中,我们会介绍如何使用Pipeline运行分布式MPI任务,该MPI任务运行模型ResNet101的测试。
开发MPIRun Pipeline
由于Kubeflow Pipelines提供的例子多数都是单机任务,那么如何利用Pipelines运行分布式训练?阿里云容器服务团队提供了利用MPIJob训练ResNet101模型的例子,方便您在阿里云上使用和学习Kubeflow Pipelines,并且训练支持分布式的allreduce模型训练。
在Kubeflow Pipelines中可以用Python代码描述了这样一个流程, 完整代码可以查看mpi_run.py。我们在这个例子中使用了arena_op
这是对于Kubeflow默认的container_op
封装,能够实现对于分布式训练MPI和PS模式的无缝衔接,另外也支持使用GPU和RDMA等异构设备和分布式存储的无缝接入,同时也方便从git源同步代码。是一个比较实用的工具API。而arena_op
是基于开源项目Arena。
env = ['NCCL_DEBUG=INFO','GIT_SYNC_BRANCH={0}'.format(git_sync_branch)]
train=arena.mpi_job_op(
name="all-reduce",
image=image,
env=env,
data=[data],
workers=workers,
sync_source=sync_source,
gpus=gpus,
cpu_limit=cpu_limit,
memory_limit=memory_limit,
metrics=[metric],
command="""
mpirun python code/benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py --model resnet101 \
--batch_size {0} --variable_update horovod --optimizer {1}\
--summary_verbosity=3 --save_summaries_steps=10
""".format(batch_size, optimizer)
)
arena.mpi_job_op
函数的参数如下:
name,image, data和command之外,在模型训练步骤中,还需要指定:
- name: 步骤名称
- image: 需要使用的容器镜像
- workers: 参与运算的worker数量
- data: 要使用的数据以及其对应到容器内部的挂载目录, 这里的data是一个数组类型, 可以设置为data=["user-susan:/training"],表示可以挂载到多个数据。
- env: 系统环境变量,这里的env也是数组类型,可以支持多个env; 如果不需要指定环境变量可以把env设置为
[]
- gpu: 默认为0,就是不使用GPU;如果为大于0的整数值,就代表该步骤需要这个数量的GPU数。
- cpu_limit: cpu的资源上限
- memory_limit: 内存的资源上限
- metrics: 同样是从可重现和可比较的实验目的出发,用户可以将需要的一系列指标导出,并且通过Pipelines UI上直观的显示和比较。具体使用方法分为两步,1.在调用API时以数组的形式指定要收集指标的metrics name和指标的展示格式PERCENTAGE或者是RAW,比如
metrics=["Train-accuracy:PERCENTAGE"]
。2.由于Pipelines默认会从stdout日志中收集指标,你需要在真正运行的模型代码中输出{metrics name}={value}或者{metrics name}:{value}, 可以参考具体样例代码 - command: 就是要提交的mpirun命令
arena中mpi_run方法的调用, 还比较直观,下面就可以定义一个Python方法。
@dsl.pipeline(
name='pipeline to run mpi job',
description='shows how to run mpi job.'
)
def mpirun_pipeline(image="uber/horovod:0.13.11-tf1.10.0-torch0.4.0-py3.5",
batch_size="64",
optimizer='momentum',
sync_source='https://github.com/tensorflow/benchmarks.git',
git_sync_branch='cnn_tf_v1.9_compatible',
data='user-susan:/training',
gpus=1,
workers=1,
cpu_limit='2',
metric='images/sec',
memory_limit='10Gi'):
@dsl.pipeline是表示工作流的装饰器,这个装饰器中需要定义两个属性,分别是
name
和description
入口方法
mpirun_pipeline
中定义了一系列参数,由于数量较多就不在这里一一列举了。这里的参数的值实际上是 dsl.PipelineParam类型,定义成dsl.PipelineParam的目的在于可以通过Kubeflow Pipelines的原生UI可以将其转换成输入表单,表单的关键字是参数名称,而默认值为参数的值. 值得注意的是,这里的dsl.PipelineParam对应值的实际上只能是字符串和数字型;而数组和map,以及自定义类型都是无法通过转型进行变换的。
而实际上,这些参数都可以在用户提交工作流时进行覆盖,以下就是提交工作流对应的UI:
提交Pipeline
整个过程包括:
1.将Python代码编译成Pipelines执行引擎(Argo)识别的DAG文件的压缩包
准备一个python3的环境,并且安装Kubeflow Pipelines SDK
# docker run -itd --name py3 python:3 sleep infinity
# docker exec -it py3 bash
在Python3的环境下执行如下命令
# pip3 install http://kubeflow.oss-cn-beijing.aliyuncs.com/kfp/0.1.16/kfp.tar.gz --upgrade
# pip3 install http://kubeflow.oss-cn-beijing.aliyuncs.com/kfp-arena/kfp-arena-0.6.tar.gz --upgrade
# curl -O https://raw.githubusercontent.com/cheyang/pipelines/add_mpijob/samples/arena-samples/mpi/mpi_run.py
# dsl-compile --py mpi_run.py --output mpi_run.py.tar.gz
# ls -ltr | grep mpi_run
mpi_run.py.tar.gz
# exit
将该文件从容器中拷贝出来
# docker cp py3:/mpi_run.py.tar.gz .
2.将该压缩包上传到Kubeflow Pipeline的web控制台,并且将名字改为mpi_run
运行试验
1.在pipeline页面,点击mpi_run
链接
2.点击右上角按钮Create run
3.在Start a new run
的界面上填写Run name
,同时选择已有或者创建相关的实验。同时按照实际情况设置运行参数,也就是Run parameters
。注意,如果您没有配置数据相关的配置,请将data
中的参数清空即可。点击启动即可。
查看运行结果
登录到Kubeflow Pipelines的UI: [https://{pipeline地址}/pipeline/#/experiments],查看实验结果:
点击具体Run,选择all-reduce, 并点击logs查看日志
总结
本文介绍了如何利用Pipeline运行MPIJob,实际上这个例子并不一定严丝合缝的满足使用者的需求:
arena.mpi_job_op
是使用MPIJob的API,您可以根据需要自定义调用方式。def mpirun_pipeline
的灵活性更是掌握在用户的手里,如何定义具体Pipeline的输入参数,也是有足够的灵活性。
本文作者:必嘫
本文为云栖社区原创内容,未经允许不得转载。
像Google一样构建机器学习系统3 - 利用MPIJob运行ResNet101的更多相关文章
- 解锁云原生 AI 技能|在 Kubernetes 上构建机器学习系统
本系列将利用阿里云容器服务,帮助您上手 Kubeflow Pipelines. 介绍 机器学习的工程复杂度,除了来自于常见的软件开发问题外,还和机器学习数据驱动的特点相关.而这就带来了其工作流程链路更 ...
- Coursera在线学习---第六节.构建机器学习系统
备: High bias(高偏差) 模型会欠拟合 High variance(高方差) 模型会过拟合 正则化参数λ过大造成高偏差,λ过小造成高方差 一.利用训练好的模型做数据预测时,如果效果不好 ...
- 【Scala-ML】怎样利用Scala构建并行机器学习系统
引言 在学习Scala的过程中,我发现其在构建大规模分布式计算系统上有与生俱来的特质. 其丰富的类型系统能够帮助编程设计提供非常好的信息隐藏和抽象,其monoids和monads概念利用Scala高阶 ...
- Google分布式构建软件之二:构建系统如何工作
分布式软件构建第二部分:构建系统如何工作 注:本文英文原文在google开发者工具组的博客上[需要FQ],以下是我的翻译,欢迎转载,但请尊重作者版权,注名原文地址. 上篇文章中提到了在Google,所 ...
- Google分布式构建软件之三:分布式执行构建步骤
注:本文英文原文在google开发者工具组的博客上[需要FQ],以下是我的翻译,欢迎转载,但请尊重作者版权,注名原文地址. 之前两篇文章分别介绍了Google 分布式软件构建系统Blaze相关的为了提 ...
- Google软件构建工具Bazel FAQ
Google软件构建工具Bazel FAQ 本文是我的翻译,原文在这里.欢迎转载,转载请注名本文作者和原始链接 注:如果想了解Bazel的原理,可以看看我之前翻译的Google Blaze原理及使用方 ...
- Google软件构建工具Bazel
转载Google软件构建工具Bazel FAQ 本文是我的翻译,原文在这里.欢迎转载,转载请注名本文作者和原始链接注:如果想了解Bazel的原理,可以看看我之前翻译的Google Blaze原理及使用 ...
- 分布式机器学习系统笔记(一)——模型并行,数据并行,参数平均,ASGD
欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术.应用感兴趣的同学加入. 文章索引::"机器学 ...
- zz 机器学习系统或者SysML&DL笔记
机器学习系统或者SysML&DL笔记(一) Oldpan 2019年5月12日 0条评论 971次阅读 1人点赞 在使用过TVM.TensorRT等优秀的机器学习编译优化系统以及Py ...
随机推荐
- 中断描述符表 IDT
保护模式下三个重要的系统表——GDT.LDT和IDT 这里主要是解释中断描述符表 中断描述符表IDT将每个异常或中断向量分别与它们的处理过程联系起来.与GDT和LDT表类似,IDT也是由8字节长描述符 ...
- MacBook 启用或停用 root 用户
启用或停用 root 用户 选取苹果菜单 () >“系统偏好设置”,然后点按“用户与群组”(或“帐户”). 点按 ,然后输入管理员名称和密码. 点按“登录选项”. 点按“加入”(或“编辑”). ...
- Markdown图片
- GIT → 02:Git和Svn比较
2.1 SVN介绍 2.1.1 SVN简介 SVN 属于集中式版本管理控制系统,服务器中保存了所有文件的不同版本,而协同工作人员通过连接svn服务器,提取出最新的文件,获取提交更新.Subversio ...
- js封装ajax的方法
常用的ajax请求方法封装 /** * ajax请求的封装代码 */ function ajaxPost(url, params, cb) { $.ajax({ type : 'post', url ...
- 洛谷P1368 均分纸牌(加强版) [2017年6月计划 数论14]
P1368 均分纸牌(加强版) 题目描述 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,纸牌总数必为 N 的倍数.可以在任一堆上取1张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取 ...
- 洛谷P1147 连续自然数和 [2017年6月计划 数论01]
P1147 连续自然数和 题目描述 对一个给定的自然数M,求出所有的连续的自然数段,这些连续的自然数段中的全部数之和为M. 例子:1998+1999+2000+2001+2002 = 10000,所以 ...
- Leetcode12.Integer to Roman整数转罗马数字
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并 ...
- js中的如何定位固定层的位置
需要获取一些HTML的对象的坐标来更灵活的设置目标层的坐标,这里可以通过用到document.body.scrollTop等属性,但是这些属性在xhtml的标准网页中或更简单的说就是带<!DOC ...
- PHP判断一个文件是否能够被打开
<?php // 需求:因为系统涉及大量的文档知识库,用户可以在线进行查看.为了验证文档是否正常打开.先需要从数据库取出路径和文件名,判断是否可以从对应的路径下打开文件.header(" ...