本章节介绍在PyTorch框架上使用断点续训特性时,用户可以选择使用的缩短断点续训时间的相关功能,包括故障检测时间优化、重调度时间优化、集合通信初始化时间优化、训练回滚及加载checkpoint时间优化和算子编译时间优化。
故障检测时间优化
由于集群中出现的参数面网络故障不一定会影响训练任务,因此集群调度组件不会强制中断任务;当参数面网络故障影响训练任务时,会触发集合通信的网络超时等待机制,在等待时间(通常默认为30分钟)后,集群调度组件才能感知到该故障,从而触发断点续训。针对该问题,PyTorch Adapter插件(torch_npu)提供watchdog故障检测功能,可用于检测训练任务是否受到影响,缩短故障检测时间,该功能的详细说明请参考表1。
表1 watchdog故障检测功能说明功能名称
|
watchdog故障检测。
|
功能特点
|
训练启动时,同时启动一个监测线程不断获取通信异常以及task执行异常。监测到故障发生后,快速抛出异常并终止训练任务进程,触发重调度。
|
使用说明
|
仅支持PyTorch 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。
|
重调度时间优化
断点续训故障处理的重调度模式默认使用Job级别重调度,需要在每次故障时销毁所有Pod,重新创建和调度全部Pod。销毁、创建和调度Pod的过程将浪费大量时间。针对该问题,集群调度组件提供Pod级别重调度功能,该功能的介绍请参考表2。
表2 Pod级别重调度功能说明功能名称
|
Pod级别重调度。
|
功能特点
|
每次故障只停止故障相关的Pod,重新创建并重调度故障相关的Pod后,重启训练任务。
|
使用说明
|
仅支持6.0.RC2及以上版本的集群调度组件。
|
关键操作
|
- 使用Dockerfile构建容器镜像,新增启动命令。
...
# MindCluster无损失断点续训适配脚本
RUN pip install $MINDX_ELASTIC_PKG
RUN pip install $MINDIO_TTP_PKG
# 可选,使用优雅容错、Pod级别重调度或进程级别重调度时必须配置以下命令
RUN sed -i '/import logging/i import mindx_elastic.api' $(pip3 show torch | grep Location | awk -F ' ' '{print $2}')/torch/distributed/run.py
...
说明: 自6.0.0.SPC1版本起,删除Elastic Agent path相关说明;使用优雅容错、Pod级别重调度或进程级别重调度时新增配置命令。
- 在任务yaml中,新增以下字段,开启Pod级别重调度。
...
labels:
...
pod-rescheduling: "on"
...
- (可选)用户可以在启动训练的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:配置监测训练进程状态的时间间隔,单位为秒,取值为整数。不配置该参数时默认为5秒。
|
集合通信初始化时间优化
- Parallel Store多线程建链优化:PyTorch框架创建通信组时,使用TCP Store进行信息交换。随任务规模变大会影响原生TCP Store的信息处理性能,导致创建通信组时间过长。针对该问题,PyTorch Adapter插件支持使用原生TCP Store的优化版本Parallel Store,详细说明请参考表3。
表3 Parallel Store功能说明功能名称
|
Parallel Store。
|
功能特点
|
多线程处理建链请求,减少建链请求队列等待时间,降低总体建链时间。
|
使用说明
|
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。
|
关键操作
|
- 启动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
- 修改训练脚本,添加如下环境变量。
export RANK_TABLE_FILE=/user/mindx-dl/ranktable/hccl.json
- 修改训练yaml,添加如下设置。
yaml
volumeMounts:
- name: ranktable
mountPath: /user/mindx-dl/ranktable
volumes:
- name: ranktable
hostPath:
path: /user/mindx-dl/ranktable/任务运行的命名空间.任务名称 # 宿主机目录下hccl.json文件的实际路径
|
- 进程级别重调度
表6 进程级别重调度功能名称
|
进程级别重调度
|
功能特点
|
每次故障只停止故障相关节点的进程,将故障节点的容器迁移到健康节点,恢复训练任务。不能恢复则回退至Job级或Pod级重调度模式。
|
使用说明
|
-
|
关键操作
|
- 在训练镜像中安装Elastic Agent、MindIO TTP,具体可参考制作PyTorch框架镜像章节。
- 训练代码适配实例参考LLaMA2模型进程级恢复适配示例进行修改。
- 在任务yaml中,新增以下字段,开启进程级别重调度。
...
metadata:
labels:
...
process-recover-enable: "on"
...
...
annotations:
...
recover-strategy: "recover"
...
...
spec:
replicaSpecs:
Master:
template:
spec:
containers:
env:
- name: PROCESS_RECOVER
value: "on"
args: […; --enable-high-availability; --enable-worker-reboot;…]
...
Worker:
template:
spec:
containers:
env:
- name: PROCESS_RECOVER
value: "on"
args: […; --enable-high-availability; --enable-worker-reboot;…]
...
|
训练回滚及加载checkpoint时间优化
- 异步保存CheckPoint:训练任务会定期保存CheckPoint文件,用于保存参数信息,故障恢复需要从上一次保存的CheckPoint回滚恢复训练。由于每次保存CheckPoint文件均会浪费一定的训练时间,为了保证训练效率,保存CheckPoint的时间间隔通常较大,而保存间隔越大,每次故障时训练回滚浪费的时间就会越长。针对该问题,集群调度组件支持通过MindIO ACP异步保存CheckPoint,详细说明请参考表7。
表7 异步保存CheckPoint功能说明功能名称
|
MindIO ACP异步保存CheckPoint。
|
功能特点
|
从NPU中获取CheckPoint后,异步写入存储中,降低每次保存CheckPoint的训练损失和保存周期,从而降低训练回滚时间。
|
使用说明
|
仅支持6.0.RC2及以上版本的集群调度组件和MindIO组件。
|
关键操作
|
安装和使用MindIO组件,请参考《MindCluster CheckPoint保存与加载优化》。
|
- 高效恢复CheckPoint:回滚恢复训练时,通常需要从存储中加载保存的CheckPoint,由于CheckPoint数据量较大,直接从存储读取加载CheckPoint的耗时较长。针对该问题,集群调度组件支持通过MindIO ACP进行CheckPoint高效恢复,详细说明请参考表8。
表8 CheckPoint高效恢复功能说明功能名称
|
MindIO CheckPoint高效恢复。
|
功能特点
|
MindIO将最新的CheckPoint存在内存中,故障恢复时可直接从内存中读取CheckPoint,降低CheckPoint读取时间。
|
使用说明
|
仅支持6.0.RC2及以上版本的集群调度组件和MindIO组件。
|
关键操作
|
安装和使用MindIO组件,请参考《MindCluster CheckPoint保存与加载优化》。
|
算子编译时间优化
断点续训过程中拉起训练需要重新执行算子时,算子编译需要消耗大量时间。针对该问题,可选择算子二进制或算子编译缓存降低编译时间,详细说明请参考下表。
算子二进制和算子编译缓存二者不兼容,请选择其中之一进行使用。
表9 算子二进制功能说明功能名称
|
使用算子二进制。
|
功能特点
|
算子编译时提前加载预置的算子二进制,直接免编译执行算子。
|
使用说明
|
仅支持CANN 8.0.RC2及以上版本。
|
关键操作
|
在Python启动脚本中,添加算子二进制配置命令,开启算子二进制。
torch.npu.set_compile_mode(jit_compile=False)
|
表10 算子编译缓存功能说明功能名称
|
算子编译缓存。
|
功能特点
|
算子编译时加载存储上保存的算子编译缓存文件,加载后可降低编译时间。
|
使用说明
|
仅支持CANN 8.0.RC2及以上版本。
|
关键操作
|
- 在Python启动脚本中,添加算子二进制编译缓存配置命令,开启算子二进制编编译缓存。
torch.npu.set_compile_mode(jit_compile=True)
- 在训练的shell启动脚本中(例如train_start.sh),添加如下环境变量。
export ASCEND_CACHE_PATH=xxx # 添加共享存储路径
export ASCEND_MAX_OP_CACHE_SIZE=-1 # 使用共享存储时建议开启,可解决多节点读取共享存储缓存资源争抢严重问题
|