开发者
资源

恢复时间优化(PyTorch)

本章节介绍在PyTorch框架上使用断点续训特性时,用户可以选择使用的缩短断点续训时间的相关功能,包括故障检测时间优化重调度时间优化集合通信初始化时间优化训练回滚及加载checkpoint时间优化算子编译时间优化

故障检测时间优化

由于集群中出现的参数面网络故障不一定会影响训练任务,因此集群调度组件不会强制中断任务;当参数面网络故障影响训练任务时,会触发集合通信的网络超时等待机制,在等待时间(通常默认为30分钟)后,集群调度组件才能感知到该故障,从而触发断点续训。针对该问题,PyTorch Adapter插件(torch_npu)提供watchdog故障检测功能,可用于检测训练任务是否受到影响,缩短故障检测时间,该功能的详细说明请参考表1

表1 watchdog故障检测功能说明

功能名称

watchdog故障检测。

功能特点

训练启动时,同时启动一个监测线程不断获取通信异常以及task执行异常。监测到故障发生后,快速抛出异常并终止训练任务进程,触发重调度。

使用说明

仅支持PyTorch 1.11.0、2.1.0及以上版本;PyTorch Adapter插件(torch_npu)版本必须高于6.0.RC1。

关键操作

在训练的shell启动脚本(例如train_start.sh)中,新增以下加粗的环境变量。PyTorch 2.1.0及以上版本默认开启watchdog故障检测,无需手动配置环境变量。

...
# env for breakpoint ckpt
export RESUME_MODE_ENABLE=1

export HCCL_ASYNC_ERROR_HANDLING=1            # 开启watchdog功能,默认取值为0,表示不开启watchdog,取值为1表示开启watchdog

重调度时间优化

断点续训故障处理的重调度模式默认使用Job级别重调度,需要在每次故障时销毁所有Pod,重新创建和调度全部Pod。销毁、创建和调度Pod的过程将浪费大量时间。针对该问题,集群调度组件提供Pod级别重调度功能,该功能的介绍请参考表2

表2 Pod级别重调度功能说明

功能名称

Pod级别重调度。

功能特点

每次故障只停止故障相关的Pod,重新创建并重调度故障相关的Pod后,重启训练任务。

使用说明

仅支持6.0.RC2及以上版本的集群调度组件。

关键操作

  1. 使用Dockerfile构建容器镜像,新增启动命令。
    ...
    # DL无损失断点续训适配脚本
    RUN pip3.7 install $MINDX_ELASTIC_PKG
    RUN pip3.7 install $MINDIO_TTP_PKG
    
    # 使用Pod级别重调度时必须配置以下命令
    RUN sed -i '/import logging/i import mindx_elastic.api \' $(pip3.7 show torch | grep Location | awk -F ' ' '{print $2}')/torch/distributed/run.py 
    ...
  2. 在任务yaml中,新增以下字段,开启Pod级别重调度。
    ...
      labels:
        ...
        pod-rescheduling: "on"
    ...
  3. (可选)用户可以在启动训练的shell脚本(例如train_start.sh)中,新增max_restarts和monitor_interval参数,示例如下。
    ...
      logger "server id is: ""${server_id}"
      if [ "${framework}" == "PyTorch" ]; then
        get_env_for_pytorch_multi_node_job
        DISTRIBUTED_ARGS="--nproc_per_node $GPUS_PER_NODE --nnodes $NNODES --node_rank $NODE_RANK --master_addr $MASTER_ADDR --master_port $MASTER_PORT --max_restarts 5 --monitor_interval 10 "
    ...

    参数说明:

    • max_restarts:配置容器内最大允许触发的故障次数,取值为整数。超出次数后PyTorch训练进程会直接退出训练,不配置该参数时默认为32767次。
    • monitor_interval:配置监测训练进程状态的时间间隔,单位为秒,取值为整数。不配置该参数时默认为30秒。

集合通信初始化时间优化

  • Parallel Store多线程建链优化:PyTorch框架创建通信组时,使用TCP Store进行信息交换。随任务规模变大会影响原生TCP Store的信息处理性能,导致创建通信组时间过长。针对该问题,PyTorch Adapter插件支持使用原生TCP Store的优化版本Parallel Store,详细说明请参考表3
    表3 Parallel Store功能说明

    功能名称

    Parallel Store。

    功能特点

    多线程处理建链请求,减少建链请求队列等待时间,降低总体建链时间。

    使用说明

    PyTorch 1.11.0版本:PyTorch Adapter插件(torch_npu)版本必须高于6.0.RC1。

    PyTorch 2.1.0及以上版本:PyTorch Adapter插件(torch_npu)版本必须高于6.0.RC3。

    关键操作

    将启动训练的shell脚本(例如train_start.sh)中,torchrun启动命令修改为torch_npu_run。

    比如将

    torchrun train.py --train_parameter=xxx ....

    修改为

    torch_npu_run train.py --train_parameter=xxx ....
  • 原生HCCL建链性能优化:PyTorch框架在NPU侧交换集合通信信息后进行NPU间连接建链。随任务规模变大,导致建链时间大幅度增加。针对该问题,CANN对原生HCCL建链进行了性能优化,详细说明请参考表4
    表4 原生HCCL建链性能优化功能说明

    功能名称

    原生HCCL建链性能优化。

    功能特点

    多线程异步完成集合通信信息协商,减少通信信息协商时间,降低总体建链时间。

    使用说明

    仅支持CANN 8.0.RC2及以上版本。

    关键操作

    无。

  • RankTable模式建链优化:集群调度Ascend Operator组件为PyTorch框架提供生成通信集合配置文件(RankTable File,也叫hccl.json文件)功能,可以通过RankTable模式建链,缩短集群通信建链时间,详细说明请参考表5
    表5 集合通信使用RankTable模式建链

    功能名称

    RankTable模式建链。

    功能特点

    使用Ascend Operator为PyTorch任务生成通信集合配置文件,缩短集群通信建链时间。

    使用说明

    PyTorch Adapter插件(torch_npu)版本必须高于6.0.RC3。

    关键操作

    1. 启动yaml中已经默认挂载了hccl.json文件的父目录,用户可以根据实际情况进行修改。
      volumes:
             - name: ranktable-dir
               hostPath:
                 path: /user/mindx-dl/ranktable  # 该宿主机目录需要在共享目录下
                 type: DirectoryOrCreate
      执行以下命令,在宿主机目录下创建hccl.json文件的具体挂载路径。
      mkdir -m 777 /user/mindx-dl/ranktable/任务运行的命名空间.任务名称
      例如:
      mkdir -m 777 /user/mindx-dl/ranktable/default.pytorch-test
    2. 修改训练脚本,添加如下环境变量。
      export RANK_TABLE_FILE=/user/mindx-dl/ranktable/hccl.json
    3. 修改训练yaml,添加如下设置。
      yaml
            volumeMounts:
            - name: ranktable
              mountPath: /user/mindx-dl/ranktable
                       
             volumes:
             - name: ranktable
               hostPath:
                 path: /user/mindx-dl/ranktable/任务运行的命名空间.任务名称  # 宿主机目录下hccl.json文件的实际路径

训练回滚及加载checkpoint时间优化

  • 异步保存CheckPoint:训练任务会定期保存CheckPoint文件,用于保存参数信息,故障恢复需要从上一次保存的CheckPoint回滚恢复训练。由于每次保存CheckPoint文件均会浪费一定的训练时间,为了保证训练效率,保存CheckPoint的时间间隔通常较大,而保存间隔越大,每次故障时训练回滚浪费的时间就会越长。针对该问题,集群调度组件支持通过MindIO ACP异步保存CheckPoint,详细说明请参考表6
    表6 异步保存checkpoint功能说明

    功能名称

    MindIO ACP异步保存checkpoint。

    功能特点

    从NPU中获取checkpoint后,异步写入存储中,降低每次保存checkpoint的训练损失和保存周期,从而降低训练回滚时间。

    使用说明

    仅支持6.0.RC2及以上版本的集群调度组件和MindIO组件。

    关键操作

    安装和使用MindIO组件,请参考。

  • 高效恢复CheckPoint:回滚恢复训练时,通常需要从存储中加载保存的CheckPoint,由于CheckPoint数据量较大,直接从存储读取加载CheckPoint的耗时较长。针对该问题,集群调度组件支持通过MindIO ACP进行CheckPoint高效恢复,详细说明请参考表7
    表7 checkpoint高效恢复功能说明

    功能名称

    MindIO checkpoint高效恢复。

    功能特点

    MindIO将最新的checkpoint存在内存中,故障恢复时可直接从内存中读取checkpoint,降低checkpoint读取时间。

    使用说明

    仅支持6.0.RC2及以上版本的集群调度组件和MindIO组件。

    关键操作

    安装和使用MindIO组件,请参考。

算子编译时间优化

断点续训过程中拉起训练需要重新执行算子时,算子编译需要消耗大量时间。针对该问题,可选择算子二进制或算子编译缓存降低编译时间,详细说明请参考表8表9
表8 算子二进制功能说明

功能名称

使用算子二进制。

功能特点

算子编译时提前加载预置的算子二进制,直接免编译执行算子。

使用说明

仅支持CANN 8.0.RC2及以上版本。

关键操作

Python启动脚本中,添加算子二进制配置命令,开启算子二进制。

torch.npu.set_compile_mode(jit_compile=False)
表9 算子编译缓存功能说明

功能名称

算子编译缓存。

功能特点

算子编译时加载存储上保存的算子编译缓存文件,加载后可降低编译时间。

使用说明

仅支持CANN 8.0.RC2及以上版本。

关键操作

  1. Python启动脚本中,添加算子二进制编译缓存配置命令,开启算子二进制编编译缓存。
    torch.npu.set_compile_mode(jit_compile=True)
  2. 在训练的shell启动脚本中(例如train_start.sh),添加如下环境变量。
    export ASCEND_CACHE_PATH=xxx   # 添加共享存储路径
    export ASCEND_MAX_OP_CACHE_SIZE=-1    # 使用共享存储时建议开启,可解决多节点读取共享存储缓存资源争抢严重问题