昇腾社区首页
中文
注册
开发者
下载

配置进程级别重调度

本章节将指导用户了解配置进程级别重调度的关键步骤。进程级别重调度的特性介绍、使用约束、支持的产品型号及原理请参见进程级别重调度

构建镜像

使用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 $MINDIO_TTP_PKG
RUN pip3 install $TASKD_WHL

准备任务YAML

在任务YAML中,修改容器端口,在所有的Pod下增加TaskD通信使用的端口9601。

...
ports:                         
   - containerPort: 9601             
     name: taskd-port 
...

在任务YAML中,新增以下字段,开启进程级别重调度。recover-strategy是训练进程恢复使用的策略,其中的recover代表开启进程级别恢复。

目前进程级别重调度支持以下2种方式,用户可根据实际使用场景,选择其中一种方式进行使用。

  • 方式一:故障后迁移故障Pod到健康节点
    ...  
    metadata: 
       labels:  
         ...  
         fault-scheduling: "grace"
     ... 
    ...  
       annotations:  
         ...  
         recover-strategy: "recover"   # 任务可用恢复策略(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 \
                      ...
    ...
  • 方式二:故障后不迁移故障Pod,仅重启故障进程
    ...  
    metadata: 
       labels:  
         ...  
         fault-scheduling: "grace"
     ... 
    ...  
       annotations:  
         ...  
         recover-strategy: "recover-in-place"   # 任务可用恢复策略(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 \
                      ...
    ...

适配训练脚本

  1. (可选)在启动脚本(例如train_start.sh)中,配置monitor_interval参数,示例如下。
    # PyTorch场景下,设置训练进程监控间隔
    ...
       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  --monitor_interval 1"
    ...
  2. 在分布式环境初始化完成,能够获取到全局rank之后,修改训练脚本,在训练脚本中拉起TaskD Manager。
    1. 创建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()

      manager.py文件中的参数详细说明请参见def init_taskd_manager(config:dict) -> bool:

    2. 在训练脚本(例如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