配置进程级在线恢复
本章节将指导用户了解配置进程级在线恢复的关键步骤。进程级在线恢复的特性介绍、使用约束、支持的产品型号及原理请参见进程级在线恢复。
构建镜像
使用Dockerfile构建容器镜像,新增启动命令。
# MindCluster断点续训适配脚本,TASKD_WHL为TaskD whl安装包的路径,MINDIO_TTP_PKG为MindIO的whl安装包的路径,请根据实际情况填写 # 可选,PyTorch框架下,使用优雅容错、Pod级别重调度或进程级别重调度时必须配置以下命令 RUN pip3 install $TASKD_WHL RUN pip3 install $MINDIO_TTP_PKG RUN sed -i '/import os/i import taskd.python.adaptor.patch' $(pip3 show torch | grep Location | awk -F ' ' '{print $2}')/torch/distributed/run.py # 可选,MindSpore框架下,使用进程级在线恢复需配置以下命令 RUN pip3 install $TASKD_WHL RUN pip3 install $MINDIO_TTP_PKG
准备任务YAML
在任务YAML中,修改容器端口,在所有的Pod下增加TaskD通信使用的端口9601。
...
ports:
- containerPort: 9601
name: taskd-port
...
在任务YAML中,新增以下字段,开启进程级别恢复。recover-strategy是训练进程恢复使用的策略,其中的retry代表开启进程级在线恢复。
...
labels:
...
fault-scheduling: "grace"
...
...
annotations:
...
recover-strategy: "retry" # 任务可用恢复策略(retry:进程级在线恢复;recover:进程级别重调度;recover-in-place: 进程级原地恢复;elastic-training:弹性训练;dump:保存临终遗言;exit:退出训练),6种策略可随意组合,策略之间由逗号分割
...
...
spec:
replicaSpecs:
Master:
template:
spec:
containers:
- name: ascend # do not modify
...
args:
- |
...
bash scripts/train_start.sh /job/code /job/output pretrain_gpt.py \
...
Worker:
template:
spec:
containers:
- name: ascend # do not modify
...
args:
- |
...
bash scripts/train_start.sh /job/code /job/output pretrain_gpt.py \
...
...
MindSpore场景下,用户需修改模型参数配置YAML。打开QWEN3_for_MS_code/configs/qwen3/pretrain_qwen3_32b_4k.yaml文件,在代码中增加以下加粗字段。
# mindspore context init config
context:
mode: 0 #0--Graph Mode; 1-Pynative Mode
device_target: "Ascend"
graph_kernel_flags: "--disable_pass=cluster.floatstatus_fusion,preprocess.depend_elimination"
max_call_depth: 10000
max_device_memory: "59GB"
mempool_block_size: "59GB"
save_graphs: True
save_graphs_path: "./graph"
device_id: 0
jit_config:
jit_level: "O1"
memory_optimize_level: "00"
ascend_config:
hccl_watchdog: False
适配训练脚本
- 在分布式环境初始化完成,能够获取到全局rank之后,修改训练脚本,在训练脚本中拉起TaskD Manager。
- 创建manager.py文件,放在调用训练脚本时的当前目录下,manager.py文件内容如下所示。
from taskd.api import init_taskd_manager, start_taskd_manager import os job_id=os.getenv("MINDX_TASK_ID") node_nums=XX # 用户填入任务节点总数 proc_per_node=XX # 用户填入任务每个节点的训练进程数量 init_taskd_manager({"job_id":job_id, "node_nums": node_nums, "proc_per_node": proc_per_node}) start_taskd_manager() - 在训练脚本(例如train_start.sh)中增加以下代码,拉起TaskD Manager。在以下代码中,TASKD_SO_PATH和export LD_PRELOAD两条语句的作用是将安装TaskD后libtaskd.so的路径配置到环境变量LD_PRELOAD中。如果这两条语句配置不成功,可通过手动执行pip show taskd命令获取Location的值拼接上/taskd/python/cython_api/libs/libtaskd.so,然后通过export设置。
TASKD_SO_PATH="$(pip show taskd | awk '/^Location: / {print $2"/taskd/python/cython_api/libs/libtaskd.so"}')" export LD_PRELOAD=$TASKD_SO_PATH:$LD_PRELOAD export TASKD_PROCESS_ENABLE="on" # PyTorch框架下 if [[ "${RANK}" == 0 ]]; then export MASTER_ADDR=${POD_IP} python manager.py & # 具体执行路径由当前路径决定 fi # MindSpore框架下 if [[ "${MS_SCHED_HOST}" == "${POD_IP}" ]]; then python manager.py & # 具体执行路径由当前路径决定 fi
- 创建manager.py文件,放在调用训练脚本时的当前目录下,manager.py文件内容如下所示。
- (可选)在启动脚本(例如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"- MindSpeed场景下,用户需修改训练启动脚本train_start.sh,在代码中增加如下加粗字段,示例如下。
export HCCL_OP_RETRY_ENABLE="L0:0, L1:1, L2:1" # 开启HCCL算子的重执行特性(算子级在线恢复)。重执行是指当执行通信算子时报SDMA或者RDMA CQE类型的错误,HCCL会尝试重新执行此通信算子。 export HCCL_ASYNC_ERROR_HANDLING=0
- MindFormers场景下,用户需修改训练启动脚本msrun_launcher.sh文件,在代码中增加如下加粗字段,示例如下。
export MS_ENABLE_TFT='{UCE:1, HCCE:1}' # 分别开启片上内存故障进程级在线恢复和网络故障进程级在线恢复 export HCCL_OP_RETRY_ENABLE="L0:0, L1:1, L2:1" # 此环境变量用于配置是否开启HCCL算子的重执行特性。重执行是指当执行通信算子时报SDMA或者RDMA CQE类型的错误,HCCL会尝试重新执行此通信算子。
- MindSpeed场景下,用户需修改训练启动脚本train_start.sh,在代码中增加如下加粗字段,示例如下。
父主题: 配置故障处理
