更新时间:2024-04-30 GMT+08:00

PyTorch

ModelArts训练服务支持了多种AI引擎,并对不同的引擎提供了针对性适配,用户在使用这些引擎进行模型训练时,训练的启动命令也需要做相应适配,本文讲解了使用PyTorch引擎所需要做的适配。

PyTorch框架启动原理

规格和节点个数

下面以选择“GPU: 8*NVIDIA-V100 | CPU: 72核 | 内存:512GB”规格为例,介绍在单机和分布式场景下ModelArts规格资源的分配情况。

单机作业时(即选择的节点数为1),ModelArts只会在一个节点上启动一个训练容器,该训练容器独享节点规格的可使用资源。

分布式作业时(即选择的节点数大于1),worker的数量和创建作业时选择的节点数一致,每个worker将被分配到所选规格对应的计算资源。例如计算节点个数为“2”时,将启动2个worker,每个worker拥有“GPU: 8*NVIDIA-V100 | CPU: 72核 | 内存:512GB”的计算资源。

网络通信介绍

  • 单机作业不涉及网络通信情况。
  • 分布式作业的涉及网络通信则可以分为节点内网络通信和节点间网络通信。

节点内网络

使用NVLink和共享内存通信。

节点间网络

当计算节点个数大于1时,将启动PyTorch引擎分布式训练模式。PyTorch引擎的分布式模式如下图所示,worker之间可通过容器网络和100Gbps的InfiniBand网卡或RoCE网卡通信,部分规格中使用RoCE网卡,将在规格中额外提示。其中,容器网络可以通过DNS域名通信,但网络性能一般,可用于点对点小规模通信需求;InfiniBand网络和RoCE网络为高性能网络,可用于集合通信等分布式训练的场景。

图1 分布式模式

启动命令

训练服务使用作业镜像中默认的python解释器启动训练脚本(即“which python”命令指向的可执行文件),启动时的工作目录(即pwd命令或python中“os.getcwd()”返回的目录)为“/home/ma-user/user-job-dir/<代码目录最外层目录名>”

  • 单机单卡启动命令
    python <启动文件相对路径> <作业运行参数>
    • 启动文件相对路径:启动文件相对“/home/ma-user/user-job-dir/<代码目录最外层目录名>”的路径 。
    • 作业运行参数:训练作业中配置的运行参数 。
    图2 创建训练作业详情

    例如控制台上设置如上图所示,则控制台后台执行命令如下:

    python /home/ma-user/modelarts/user-job-dir/gpu-train/train.py --epochs 5
  • 单机多卡启动命令
    python <启动文件相对路径> --init_method "tcp://${MA_VJ_NAME}-${MA_TASK_NAME}-0.${MA_VJ_NAME}:${port}" <作业运行参数>
    • 启动文件相对路径:启动文件相对“/home/ma-user/user-job-dir/<代码目录最外层目录名>”的路径 。
    • ${MA_VJ_NAME}-${MA_TASK_NAME}-0.${MA_VJ_NAME}:worker-0所在容器的域名,请参考系统默认加载的环境变量说明
    • port: worker-0所在容器的默认通信端口。
    • 作业运行参数:训练作业中配置的运行参数。
    图3 创建训练作业详情

    例如控制台上设置如上图所示,则控制台后台执行命令如下:

    python /home/ma-user/modelarts/user-job-dir/gpu-train/train.py --init_method "tcp://${MA_VJ_NAME}-${MA_TASK_NAME}-0.${MA_VJ_NAME}:${port}" --epochs 5
  • 多机多卡启动命令
    python <启动文件相对路径> --init_method "tcp://${MA_VJ_NAME}-${MA_TASK_NAME}-0.${MA_VJ_NAME}:${port}" --rank <rank_id> --world_size <node_num> <作业运行参数>
    • 启动文件相对路径:启动文件相对“/home/ma-user/user-job-dir/<代码目录最外层目录名>”的路径 。
    • ${MA_VJ_NAME}-${MA_TASK_NAME}-0.${MA_VJ_NAME}:worker-0所在容器的域名,请参考系统默认加载的环境变量说明
    • port: worker-0所在容器的默认通信端口。
    • rank:worker的序号。
    • node_num:worker的数量。
    • 作业运行参数:训练作业中配置的运行参数。
    图4 创建训练作业详情

    例如控制台上设置如上图所示,则控制台后台执行命令如下:

    python /home/ma-user/modelarts/user-job-dir/gpu-train/train.py --init_method "tcp://${MA_VJ_NAME}-${MA_TASK_NAME}-0.${MA_VJ_NAME}:${port}" --rank "${rank_id}" --world_size "${node_num}" --epochs 5