ModelArts分布式训练

功能介绍

ModelArts提供了如下能力:

  • 丰富的官方预置镜像,满足用户的需求。
  • 支持基于预置镜像自定义制作专属开发环境,并保存使用。
  • 丰富的教程,帮助用户快速适配分布式训练,使用分布式训练极大减少训练时间。
  • 分布式训练调测的能力,可在PyCharm/VSCode/JupyterLab等开发工具中调试分布式训练。

约束限制

  • 总览页面打开的CodeLab不支持此项功能,但是如果用户在AI Hub中打开了可用的案例,会自动跳转到CodeLab中,此时是可以使用这项功能的。
  • 如果切换了Notebook的规格,那么只能在Notebook进行单机调测,不能进行分布式调测,也不能提交远程训练任务。
  • 当前仅支持Pytorch和MindSpore AI框架,如果MindSpore要进行多机分布式训练调试,则每台机器上都必须有8张卡。
  • ModelArts提供的调测代码中涉及到的OBS路径,实际使用时请替换为自己的实际OBS路径。
  • ModelArts提供的调测代码是以Pytorch为例编写的,不同的AI框架之间,整体流程是完全相同的,只需要修改个别的参数即可。

不同类型分布式训练介绍

  • 单机多卡数据并行-DataParallel(DP)

    介绍基于Pytorch引擎的单机多卡数据并行分布式训练原理和代码改造点。MindSpore引擎的分布式训练参见MindSpore官网

  • 多机多卡数据并行-DistributedDataParallel(DDP)

    介绍基于Pytorch引擎的多机多卡数据数据并行分布式训练原理和代码改造点。

分布式训练代码示例

  • 分布式调测适配及代码示例

    对resnet18在cifar10数据集上的分类任务,给出了单机训练和分布式训练改造(DDP)的代码。直接执行代码为多节点分布式训练且支持CPU分布式和GPU分布式,将代码中的分布式改造点注释掉后即可进行单节点单卡训练。

  • 分布式训练完整代码示例

    对resnet18在cifar10数据集上的分类任务,给出了分布式训练改造(DDP)的完整代码示例。

训练作业常见问题

创建训练作业常见问题

  • 两个训练作业的模型都保存在容器相同的目录下是否有冲突?

    ModelArts训练作业之间的存储目录相互不影响,每个环境之间彼此隔离,看不到其他作业的数据。

  • 训练好的模型是否可以下载或迁移到其他帐号?如何获取下载路径?

    通过训练作业训练好的模型可以下载,然后将下载的模型上传存储至其他帐号对应区域的OBS中。

    获取模型下载路径

    1、登录ModelArts管理控制台,在左侧导航栏中选择“训练管理 > 训练作业”,进入“训练作业”列表。

    2、在训练作业列表中,单击目标训练作业名称,查看该作业的详情。

    3、在“配置信息”页签,获取“训练输出位置”下的路径,即为训练模型的下载路径。

    模型迁移到其他帐号

    您可以通过如下两种方式将训练的模型迁移到其他帐号。

    1、将训练好的模型下载至本地后,上传至目标帐号对应区域的OBS桶中。

    2、通过对模型存储的目标文件夹或者目标桶配置策略,授权其他帐号进行读写操作。详请参见配置高级桶策略

  • 日志提示“RuntimeError: connect() timed out”

    问题现象

    使用pytorch进行分布式训练时,报错“RuntimeError: connect() timed out”。

    原因分析

    如果在此之前是有进行数据拷贝的,每个节点拷贝的速度不是同一个时间完成的,然后有的节点没有拷贝完,其他节点进行torch.distributed.init_process_group()导致超时。

    处理方法

    如果是多个节点拷贝不同步,并且没有barrier的话导致的超时,可以在拷贝数据之前,先进行torch.distributed.init_process_group(),然后再根据local_rank()==0去拷贝数据,之后再调用torch.distributed.barrier()等待所有rank完成拷贝。具体可参考如下代码:

    import moxing as mox

    import torch

    torch.distributed.init_process_group()

    if local_rank == 0:

    mox.file.copy_parallel(src,dst)

    torch.distributed.barrier()

    建议与总结

    在创建训练作业前,推荐您先使用ModelArts开发环境调试训练代码,避免代码迁移过程中的错误。

    直接使用线上notebook环境调试请参考使用JupyterLab开发模型

    配置本地IDE(Pycharm或者VSCode)联接云上环境调试请参考使用本地IDE开发模型

  • 如何在ModelArts上获得RANK_TABLE_FILE进行分布式训练?

    ModelArts会帮用户生成RANK_TABLE_FILE文件,可通过环境变量查看文件位置。

    在Notebook中打开terminal,可以运行如下命令查看RANK_TABLE_FILE:

    env | grep RANK

    在训练作业中,您可以在训练启动脚本的首行加入如下代码,把RANK_TABLE_FILE的值打印出来:

    os.system('env | grep RANK')


  • 多节点训练TensorFlow框架ps节点作为server会一直挂着,ModelArts是怎么判定训练任务结束?如何知道是哪个节点是worker呢?

    TensorFlow框架分布式训练的情况下,会启动ps与worker任务组,worker任务组为关键任务组,会以worker任务组的进程退出码,判断训练作业是否结束。

    通过task name判断的哪个节点是worker。下发的训练作业是一个volcano job,里边会有两个task:一个是ps、一个是worker。两个task的启动命令不同,会自动生成超参--task_name,ps的--task_name=ps,worker的 --task_name=worker。