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

配置临终CKPT保存

本章节将指导用户了解临终CKPT保存的关键步骤。临终CKPT保存的特性介绍请参见临终CKPT保存

构建镜像

使用Dockerfile构建容器镜像,新增启动命令。

... 
# MindCluster无损失断点续训适配脚本
RUN pip3 install $TASKD_WHL 
RUN pip3 install $MINDIO_TTP_PKG 

# 可选,使用优雅容错、Pod级别重调度或进程级别重调度时必须配置以下命令
RUN sed -i '/import os/i import taskd.python.adaptor.patch' $(pip3 show torch | grep Location | awk -F ' ' '{print $2}')/torch/distributed/run.py

准备任务YAML

在训练任务YAML中,新增以下字段,开启进程级别恢复。recover-strategy是训练进程恢复使用的策略,其中的dump代表开启临终CKPT。在ports中增加ttp-port为8000,增加TaskD通信使用的端口9601。

临终CKPT保存可以作为进程级别恢复流程中的一个策略,名为“dump”策略,设置到recover-strategy中。示例如下。

... 
metadata:  
   labels:  
     ...  
 ... 
...  
   annotations:  
     ...  
     recover-strategy: "dump"       # 任务可用恢复策略为保存临终遗言
 ... 
  
... 
spec:  
   replicaSpecs:  
      Master: 
         template: 
            spec: 
              containers: 
                 env: 
                   - name: TTP_PORT 
                     value: "8000" 
                 args: […] 
                 ports: 
                   - containerPort: 8000 
                     name: ttp-port 
                   - containerPort: 9601  
                     name: taskd-port
     ...  
     Worker: 
        template: 
          spec: 
            containers: 
               env: 
                 - name: TTP_PORT 
                   value: "8000" 
               args: […] 
               ports: 
                 - containerPort: 8000 
                   name: ttp-port 
                 - containerPort: 9601  
                   name: taskd-port
 ...

适配训练脚本

  1. 在分布式环境初始化完成,能够获取到全局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. 在训练脚本中增加以下代码拉起TaskD Manager。
      export TASKD_PROCESS_ENABLE="on" 
       
      # PyTorch框架下
      if [[ "${RANK}" == 0 ]]; then
          export MASTER_ADDR=${POD_IP} 
          python manager.py &           # 具体执行路径由当前路径决定
      fi 
            
      torchrun ...
  2. 在启动脚本(例如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  --monitor_interval 10" 
     ...

    参数说明:

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

如果训练中出现报错“the libtaskd.so has not been loaded”,则需在训练脚本中导入LD_PRELOAD环境变量。该环境变量允许系统提前加载指定的so文件。示例如下。

export LD_PRELOAD=/usr/local/Ascend/cann/lib64/libmspti.so:/usr/local/lib/python3.10/dist-packages/taskd/python/cython_api/libs/libtaskd.so
  • libmspti.so:该so由MindStudio提供,集成在CANN包内。当使用默认安装路径时,路径为:/usr/local/Ascend/cann/lib64/libmspti.so。
  • libtaskd.so:该so由TaskD组件提供,安装该whl包后,路径为:TaskD所在路径/taskd/python/cython_api/libs/libtaskd.so。

    TaskD所在路径可通过以下命令进行查询。回显中的Location字段即为TaskD所在路径。

    pip show taskd