昇腾社区首页
中文
注册

恢复时间优化(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。

关键操作

PyTorch 2.1.0及以上版本默认开启watchdog故障检测,无需手动配置环境变量

(可选)如需关闭watchdog故障检测,需在训练的shell启动脚本(例如train_start.sh)中,修改以下环境变量。

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

export HCCL_ASYNC_ERROR_HANDLING=0            # 取值为1,表示开启watchdog功能;取值为0,表示关闭watchdog

集合通信初始化时间优化

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

表2 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建链进行了性能优化,详细说明请参考表3
    表3 原生HCCL建链性能优化功能说明

    功能名称

    原生HCCL建链性能优化。

    功能特点

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

    使用说明

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

    关键操作

    无。

  • RankTable模式建链优化:集群调度Ascend Operator组件为PyTorch框架提供生成集合通信配置文件(RankTable File,也叫hccl.json文件)功能,可以通过RankTable模式建链,缩短集群通信建链时间,详细说明请参考表4
    表4 集合通信使用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/任务运行的命名空间.任务名称
      chown 9000:9000 /user/mindx-dl/ranktable/default.pytorch-test
      例如:
      mkdir -m 777 /user/mindx-dl/ranktable/default.pytorch-test
      chown 9000:9000 /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,详细说明请参考表5
    表5 异步保存CheckPoint功能说明

    功能名称

    MindIO ACP异步保存CheckPoint。

    功能特点

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

    使用说明

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

    关键操作

    安装和使用MindIO组件,请参考《MindCluster CheckPoint保存与加载优化》

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

    功能名称

    MindIO CheckPoint高效恢复。

    功能特点

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

    使用说明

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

    关键操作

    安装和使用MindIO组件,请参考《MindCluster CheckPoint保存与加载优化》

算子编译时间优化

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

算子二进制和算子编译缓存二者不兼容,请选择其中之一进行使用。

表7 算子二进制功能说明

功能名称

使用算子二进制。

功能特点

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

使用说明

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

关键操作

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

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

功能名称

算子编译缓存。

功能特点

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

使用说明

仅支持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    # 使用共享存储时建议开启,可解决多节点读取共享存储缓存资源争抢严重问题