像Google一样构建机器学习系统3 - 利用MPIJob运行ResNet101

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 从上篇文章中,我们可以看到如何通过Kubeflow Pipeline运行单节点任务机器学习工作流,在本文中,我们会介绍如何使用Pipeline运行分布式MPI任务,该MPI任务运行模型ResNet101的测试。

本系列将利用阿里云容器服务,帮助您上手Kubeflow Pipelines.

上篇文章中,我们可以看到如何通过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是表示工作流的装饰器,这个装饰器中需要定义两个属性,分别是namedescription

入口方法mpirun_pipeline中定义了一系列参数,由于数量较多就不在这里一一列举了。这里的参数的值实际上是 dsl.PipelineParam类型,定义成dsl.PipelineParam的目的在于可以通过Kubeflow Pipelines的原生UI可以将其转换成输入表单,表单的关键字是参数名称,而默认值为参数的值. 值得注意的是,这里的dsl.PipelineParam对应值的实际上只能是字符串和数字型;而数组和map,以及自定义类型都是无法通过转型进行变换的。

而实际上,这些参数都可以在用户提交工作流时进行覆盖,以下就是提交工作流对应的UI:

5_input

提交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

5_upload_pipeline

运行试验

1.在pipeline页面,点击mpi_run链接

2.点击右上角按钮Create run

3.在Start a new run的界面上填写Run name,同时选择已有或者创建相关的实验。同时按照实际情况设置运行参数,也就是Run parameters。注意,如果您没有配置数据相关的配置,请将data中的参数清空即可。点击启动即可。

5_param

查看运行结果

登录到Kubeflow Pipelines的UI: [https://{pipeline地址}/pipeline/#/experiments],查看实验结果:

5_param

点击具体Run,选择all-reduce, 并点击logs查看日志

5_logs

总结

本文介绍了如何利用Pipeline运行MPIJob,实际上这个例子并不一定严丝合缝的满足使用者的需求:

  1. arena.mpi_job_op是使用MPIJob的API,您可以根据需要自定义调用方式。
  2. def mpirun_pipeline的灵活性更是掌握在用户的手里,如何定义具体Pipeline的输入参数,也是有足够的灵活性。
相关实践学习
基于阿里云DeepGPU实例,用AI画唯美国风少女
本实验基于阿里云DeepGPU实例,使用aiacctorch加速stable-diffusion-webui,用AI画唯美国风少女,可提升性能至高至原性能的2.6倍。
目录
相关文章
|
3天前
|
机器学习/深度学习 数据采集 自然语言处理
构建高效机器学习模型的策略与实践
【4月更文挑战第30天】 在数据驱动的时代,机器学习(ML)作为一项核心技术,其应用范围和影响力日益扩大。然而,构建一个既高效又准确的机器学习模型并非易事。本文将探讨一系列实用的策略和技术,用于优化机器学习的工作流程,包括数据预处理、特征工程、模型选择、超参数调优以及模型评估等方面。通过这些策略,读者可以提升模型的性能,确保在实际应用中达到预期的准确度和效率。
|
1天前
|
机器学习/深度学习 数据采集 算法
构建高效机器学习模型的最佳实践
【5月更文挑战第2天】 在数据驱动的时代,机器学习已成为智能系统不可或缺的组成部分。本文将深入探讨构建高效机器学习模型的策略,包括数据预处理、特征工程、模型选择、调参技巧以及模型评估方法。我们将通过实际案例分析,揭示如何避免常见陷阱,并利用最佳实践提高模型的性能和泛化能力。文章旨在为从业者提供一套实用的技术指南,帮助他们在面对复杂数据时能够做出明智的决策,并最终实现机器学习项目的高效落地。
|
3天前
|
机器学习/深度学习 运维 持续交付
构建高效自动化运维体系:Ansible与Docker的完美结合构建高效机器学习模型的五大技巧
【4月更文挑战第30天】 在当今快速发展的云计算和微服务架构时代,自动化运维已成为维持系统稳定性和提高效率的关键。本文将探讨如何通过结合Ansible和Docker技术构建一个高效的自动化运维体系。文章不仅介绍了Ansible与Docker的基本原理和优势,还详细阐述了如何整合这两种技术以简化部署流程、加强版本控制,并提高整体运维效率。通过案例分析,我们将展示这一组合在实际环境中的应用效果,以及它如何帮助企业实现持续集成和持续部署(CI/CD)的目标。 【4月更文挑战第30天】 在数据驱动的时代,构建一个高效的机器学习模型是获取洞察力和预测未来趋势的关键步骤。本文将分享五种实用的技巧,帮助数
|
3天前
|
机器学习/深度学习 算法 数据挖掘
构建高效机器学习模型的五大技巧
【4月更文挑战第30天】 在数据科学领域,构建一个高效的机器学习模型是实现精准预测与分析的核心。本文将深入探讨提升模型效能的五个关键技巧:特征工程、模型选择、超参数调优、正则化技术以及交叉验证。通过这些方法的综合应用,读者可以显著提高其机器学习项目的准确率和泛化能力。
|
3天前
|
机器学习/深度学习 数据可视化 TensorFlow
【Python 机器学习专栏】使用 TensorFlow 构建深度学习模型
【4月更文挑战第30天】本文介绍了如何使用 TensorFlow 构建深度学习模型。TensorFlow 是谷歌的开源深度学习框架,具备强大计算能力和灵活编程接口。构建模型涉及数据准备、模型定义、选择损失函数和优化器、训练、评估及模型保存部署。文中以全连接神经网络为例,展示了从数据预处理到模型训练和评估的完整流程。此外,还提到了 TensorFlow 的自动微分、模型可视化和分布式训练等高级特性。通过本文,读者可掌握 TensorFlow 基本用法,为构建高效深度学习模型打下基础。
|
3天前
|
机器学习/深度学习 自然语言处理 监控
构建高效机器学习模型的最佳实践
【4月更文挑战第30天】 在数据驱动的时代,机器学习已成为智能系统的核心。本文将深入探讨如何构建高效的机器学习模型,涵盖从数据处理到模型优化的全过程。我们将分析特征工程的重要性,讨论不同算法的优势与局限,并提出一系列实用的调参技巧。通过这些最佳实践,读者将能够提升其机器学习项目的性能与准确性。
|
3天前
|
机器学习/深度学习 数据采集 监控
构建高效机器学习模型的最佳实践
【4月更文挑战第30天】 在数据驱动的时代,构建高效且可靠的机器学习模型已成为技术发展的核心。本文旨在探讨并总结一系列实用的技术和策略,帮助读者优化其机器学习项目。从数据预处理到模型训练,再到最终的评估和部署,我们将深入分析每个步骤中应当考虑的关键因素。通过实例演示和理论分析,文章不仅为初学者提供了清晰的入门指南,也为经验丰富的开发者提供了一系列高级技巧。
|
3天前
|
机器学习/深度学习 数据采集 人工智能
构建高效机器学习模型的最佳实践
【4月更文挑战第30天】 在数据驱动的时代,机器学习已成为解决复杂问题的重要工具。然而,构建一个既高效又准确的机器学习模型并非易事。本文将分享一系列经过实践检验的技巧与策略,涵盖数据预处理、特征工程、模型选择、调参优化及模型部署等关键环节。读者将了解到如何通过这些最佳实践提升模型性能,避免常见的陷阱,并最终实现高效的机器学习工作流程。
|
3天前
|
机器学习/深度学习 Cloud Native 持续交付
构建高效机器学习模型的策略与实践构建未来:云原生技术在企业数字化转型中的关键作用
【4月更文挑战第30天】 在机器学习领域,构建一个高效的模型不仅需要深厚的理论基础,还需结合先进的技术手段和策略。本文将探讨一系列提升模型性能的方法,包括数据预处理、特征选择、模型调参以及集成学习等。通过具体案例分析,揭示这些方法如何在实际问题中得以应用,并讨论它们对模型性能的影响。文中还将涉及最新的研究进展,为读者提供前瞻性的指导意义。 【4月更文挑战第30天】随着企业加速其数字化转型之旅,云原生技术已成为推动创新和灵活性的核心。本文深入探讨了云原生架构的原则,包括微服务、容器化、持续集成/持续部署(CI/CD)、以及声明式APIs。分析了这些技术如何共同促进可伸缩性、敏捷性和容错性,同时
|
3天前
|
机器学习/深度学习 数据采集 自然语言处理
构建高效机器学习模型的策略与实践
【4月更文挑战第30天】 在机器学习领域,构建一个高效的模型不仅需要深厚的理论基础,还需结合先进的技术手段和策略。本文将探讨一系列提升模型性能的方法,包括数据预处理、特征选择、模型调参以及集成学习等。通过具体案例分析,揭示这些方法如何在实际问题中得以应用,并讨论它们对模型性能的影响。文中还将涉及最新的研究进展,为读者提供前瞻性的指导意义。