You need to enable JavaScript to run this app.
导航

发起 MPI 分布式训练

最近更新时间2023.08.04 10:55:48

首次发布时间2021.09.23 11:57:28

MPI 是一种基于信息传递的并行编程技术。机器学习平台支持用户发起 MPI 的分布式训练任务,同时也支持常见的 Horovod、DeepSpeed 等基于 MPI 的训练框架。本文以上述两种框架为例,介绍如何在机器学习平台上发起分布式训练任务。

相关概念
基本流程
  1. 用户在【自定义训练】模块创建一个训练任务时选择实例配置为 MPI,按需配置各种训练角色并提交任务表单进入任务创建环节。MPI 仅包含 worker 这一种角色用于训练模型,其中编号为 0 的 worker(worker0)负责执行入口命令(其它 worker 不会执行入口命令)及保存 checkpoint 或日志的任务。
  2. 任务提交后,机器学习平台将为用户创建对应的实例并向所有实例注入相关的环境变量,通过环境变量用户代码得知集群的信息以及当前实例对应的训练角色,从而完成对应角色的本职任务直到训练结束。
    • 训练之前,平台将等待所有实例之间的网络通畅。
    • 训练过程中,任意实例失败(退出码非 0)则训练任务失败。
    • worker0 训练完成(退出码为 0)则训练任务成功。
调用方式

平台为用户注入了有可能在训练代码或者入口命令需要用到的环境变量,分别通过 Horovod 和 DeepSpeed 官方提供的启动命令(horovodrundeepspeed)结合环境变量启动训练任务。
环境变量

  • MLP_WORKER_NUM:worker 的数量。
  • MLP_WORKER_GPU:单个 woker 包含的 GPU 数量。
  • MLP_MPI_HOSTS:各训练实例的域名及单个实例上的进程数量。
    • 选择 CPU 实例规格时:MLP_MPI_HOSTS = worker0:1,worker1:1, ...,即每个 worker 上执行 1 个训练进程。
    • 选择 GPU 实例规格时:MLP_MPI_HOSTS = worker0:MLP_WORKER_GPU,worker1:MLP_WORKER_GPU, ...,即每个 worker 上训练进程的数量与 GPU 的数量一致。
  • MLP_MPI_RACK_HOSTS:与 MLP_MPI_HOSTS 类似,但其中各 worker 的 IP 是按照交换机 hash_id 排序后的。
  • MLP_MPI_HOSTFILE:MPI 任务所需的 hostfile 地址。hostfile 的作用与 MLP_MPI_HOSTS 类似,记录着每个 worker 的 IP 以及 worker 上对应的训练进程数量。
    • 每个 worker 分配训练进程的策略与 MLP_MPI_HOSTS 一致(CPU 的 worker 实例上只有 1 个训练进程,GPU 实例上的训练进程数等于该实例包含的 GPU 数量)。
    • hostfile 示例:代表总共 2 个 worker,每个 worker 分别包含 2 个训练进程。
    172.22.128.95 slots=2
    172.22.128.94 slots=2
    
  • MLP_MPI_NP:训练进程的总数量。
    • 选择 CPU 实例规格时:MLP_MPI_NP = MLP_WORKER_NUM。
    • 选择 GPU 实例规格时:MLP_MPI_NP = MLP_WORKER_NUM * MLP_WORKER_GPU。

如需使用【自定义训练】模块的通用环境变量详见通用环境变量列表

关键参数

  • np:对应 MLP_MPI_NP 的值。
  • H:对应 MLP_MPI_HOSTS 的值。
  • hostfile:对应 MLP_MPI_HOSTFILE 的值。

使用如下命令启动 Horovod 和 DeepSpeed 分布式训练任务:

  • Horovod 可以选择通过 -H 或者 -hostfile 启动任务。
    horovodrun -np $MLP_MPI_NP -H $MLP_MPI_HOSTS python <代码文件的绝对路径>
    
    horovodrun -np $MLP_MPI_NP -hostfile $MLP_MPI_HOSTFILE python <代码文件的绝对路径>
    
  • DeepSpeed 仅支持使用 --hostfile 启动任务。
    deepspeed --hostfile=$MLP_MPI_HOSTFILE <代码文件的绝对路径>
    
调试方法

当用户在 MPI 的任务容器中调试时,通常需要在所有容器中安装相同的依赖包或者执行相同的代码,平台提供了对应的工具用于该场景,详见如何使用 MPI 的 allrun 工具

示例代码

具体的示例代码详见 GitHub