昇腾社区首页
EN
注册

任务YAML配置示例

重调度模式和优雅容错模式可参考如下操作步骤配置示例。当subHealthyStrategy取值为graceExit时,需要参考(可选)修改训练脚本适配启动脚本确保训练框架能够配合重调度。

前提条件

用户已创建hccl.json文件的具体挂载路径,详细操作步骤请参见步骤4

操作步骤

  1. 将YAML文件上传至管理节点任意目录,并根据实际情况修改文件内容。
    • 以a800_AscendJob_{xxx}b.yaml为例,在一台Atlas 200T A2 Box16 异构子框节点创建分布式训练任务,任务使用2*4个芯片,修改示例如下。
      apiVersion: mindxdl.gitee.com/v1
      kind: AscendJob
      metadata:
        name: default-test-mindspore
        labels:
          framework: mindspore  # 训练框架名称
          fault-scheduling: "grace"     # 开启优雅删除模式
          ring-controller.atlas: ascend-{xxx}b
          fault-retry-times: "3"            # 开启业务面故障无条件重试能力,同时需要将restartPolicy取值设置为Never
          tor-affinity: "normal-schema" #该标签为任务是否使用交换机亲和性调度标签,null或者不写该标签则不使用该特性。large-model-schema表示大模型任务或填充任务,normal-schema表示普通任务
          pod-rescheduling: "on"     # 开启Pod级别重调度
          subHealthyStrategy: "ignore"  # 忽略健康状态为亚健康的节点,后续任务会调度到该节点
      spec:
        schedulerName: volcano    # 当Ascend Operator组件的启动参数enableGangScheduling为true时生效
        runPolicy:
          backoffLimit: 3      # 任务重调度次数
          schedulingPolicy:
            minAvailable: 3       # 任务总副本数
            queue: default     # 任务所属队列
        successPolicy: AllWorkers  # 任务成功的前提
        replicaSpecs:
          Scheduler:
            replicas: 1            #只能为1
            restartPolicy:  Never   #容器重启策略
            template:
              metadata:
                labels:
                  ring-controller.atlas: ascend-{xxx}b  # 标识产品类型
              spec:
                terminationGracePeriodSeconds: 360  #容器收到SIGTERM到被K8s强制停止经历的时间
                nodeSelector:                       
                  host-arch: huawei-x86          # Atlas 200T A2 Box16 异构子框只有x86_64架构
                  accelerator-type: module-{xxx}b-16   # 节点类型
                containers:
                - name: ascend     # 不能修改
      ...
                  ports:                     # 可选,分布式训练集合通讯端口
                    - containerPort: 2222    
                      name: ascendjob-port 
                  volumeMounts:
      ...
        
          Worker:
            replicas: 2
            restartPolicy: Never  # 容器重启策略
            template:
              metadata:
                labels:
                  ring-controller.atlas: ascend-{xxx}b  # 标识产品类型
              spec:
                terminationGracePeriodSeconds: 360   #容器收到SIGTERM到被K8s强制停止经历的时间
                affinity:
      ...
                nodeSelector:           
                  host-arch: huawei-x86      # Atlas 200T A2 Box16 异构子框只有x86_64架构
                  accelerator-type: module-{xxx}b-16   # 节点类型
                containers:
                - name: ascend      # 不能修改
      ...
                  env:
                  - name: ASCEND_VISIBLE_DEVICES
                    valueFrom:
                      fieldRef:
                        fieldPath: metadata.annotations['huawei.com/Ascend910']         # 需要和下面resources和requests保持一致     
      ...
      
                  ports:        # 可选,分布式训练集合通讯端口
                    - containerPort: 2222    
                      name: ascendjob-port  
                  resources:
                    limits:
                      huawei.com/Ascend910: 4      # 需要的NPU芯片个数为4
                    requests:
                      huawei.com/Ascend910: 4       # 与limits取值一致
    • 以a800_vcjob.yaml为例,在一台Atlas 800 训练服务器节点创建单机训练任务,任务使用8个芯片,修改示例如下。
      apiVersion: v1
      kind: ConfigMap
      metadata:
        name: rings-config-mindx-dls-test     # rings-config-后的名字需要与任务名一致
      ...
        labels:
          ring-controller.atlas: ascend-910  # 标识产品类型
      ...
      ---
      apiVersion: batch.volcano.sh/v1alpha1   # 不可修改。必须使用Volcano的API。
      kind: Job                               # 目前只支持Job类型
      metadata:
        name: mindx-dls-test                  # 任务名,可自定义
        labels:
          ring-controller.atlas: ascend-910   
          fault-scheduling: "force"        # 开启强制删除模式
          fault-retry-times: "3"            # 开启业务面故障无条件重试能力,同时需要将restartPolicy取值设置为Never;并将policies的event设置为PodFailed,action设置为Ignore
          tor-affinity: "normal-schema" #该标签为任务是否使用交换机亲和性调度标签,null或者不写该标签则不使用该特性。large-model-schema表示大模型任务或填充任务,normal-schema表示普通任务
          pod-rescheduling: "on"     # 开启Pod级别重调度
          subHealthyStrategy: "ignore"     # 忽略健康状态为亚健康的节点,后续任务会调度到该节点
      ...
      spec:
        policies:  #使用Pod级别重调度,需要删除policies及其子参数event和action
          - event: PodEvicted   # 使用业务面故障无条件重试(或同时使用Pod级别重调度和业务面故障无条件重试),需要将event设置为PodFailed
            action: RestartJob  # 使用业务面故障无条件重试(或同时使用Pod级别重调度和业务面故障无条件重试),需要将action设置为Ignore
      ...
        minAvailable: 1                  # 单机为1
      ...
        maxRetry: 3              # 重调度次数
      ...
        - name: "default-test"
            replicas: 1                  # 单机为1
            template:
              metadata:
      ...
              spec:
                terminationGracePeriodSeconds: 360  #容器收到SIGTERM到被K8s强制停止经历的时间
      ...
                  env:
      ...
                - name: ASCEND_VISIBLE_DEVICES                       # Ascend Docker Runtime使用该字段
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.annotations['huawei.com/Ascend910']               # 需要和下面resources和requests保持一致
      ...
                  resources:  
                    requests:
                      huawei.com/Ascend910: 8          # 需要的NPU芯片个数为8。可在下方添加行,配置memory、cpu等资源
                    limits:
                      huawei.com/Ascend910: 8          # 目前需要和上面requests保持一致
      ...
                  nodeSelector:
                    host-arch: huawei-arm               # 可选值,根据实际情况填写
                    accelerator-type: module      #调度到Atlas 800 训练服务器节点上
      ...
              restartPolicy: Never   # 容器重启策略
  2. 配置MindIO的通信地址。在代码中新增以下加粗内容。
    ...
       Master:
    ...
                env:        
                  - name: POD_IP
                    valueFrom:
                      fieldRef:
                        fieldPath: status.podIP             # 用于MindIO通信,如果不配置此参数会影响训练任务的正常拉起。
  3. (可选)如果开启了临终遗言,需要在训练YAML中增加临终遗言通信的端口信息,以pytorch_multinodes_acjob_{xxx}b.yaml为例,新增以下加粗内容。
    ...
       Master:
    ...
              env:
                  - name: TTP_PORT                  
                    value: "8000"  # 用于临终遗言通信,请注意上下保持一致
    ...
                ports:                         
                    - containerPort: 2222        
                    name: ascendjob-port       
                  - containerPort: 8000    # 用于临终遗言通信,请注意上下保持一致
                    name: ttp-port
    ...
       Worker:
    ...
              env:
                  - name: TTP_PORT                  
                    value: "8000"  # 用于临终遗言通信,请注意上下保持一致
    ...
                ports:                          
                    - containerPort: 2222         
                    name: ascendjob-port       
                  - containerPort: 8000    # 用于临终遗言通信,请注意上下保持一致
                    name: ttp-port
    
    ...
  4. (可选)如果使用临终遗言和进程级恢复,需要在训练YAML中增加临终遗言通信的端口信息和进程级恢复开关等信息,以pytorch_multinodes_acjob_{xxx}b.yaml为例,新增以下加粗内容。
    ...
      labels:    
           framework: pytorch   
           ring-controller.atlas: ascend-{xxx}b    
           fault-scheduling: "force"    
           fault-retry-times: "10"   // 开启无条件重试
           pod-rescheduling: "on"   // 开启Pod级重调度
           process-recover-enable: "on"  // 开启进程级别重调度及进程级在线恢复
           tor-affinity: "null" # 该标签为任务是否使用交换机亲和性调度标签,null或者不写该标签则不适用。large-model-schema表示大模型任务,normal-schema表示普通任务
    ...
      replicaSpecs:    
          Master:     
            replicas: 1      
            restartPolicy: Never      
            template:        
                metadata:
    ...
               - name: TTP_PORT
                 value: "8000"  # 用于MindIO通信,请注意上下保持一致
            command:                           # training command, which can be modified             
            - /bin/bash              
            - -c            
            args: [ "export ELASTIC_PROCESS_RECOVER_ENABLE=1;cd /job/code; chmod +x scripts/train_start.sh; bash scripts/train_start.sh /job/code /job/output pretrain_gpt.py --tensor-model-parallel-size 4  --pipeline-model-parallel-size 1 --sequence-parallel --use-distributed-optimizer  --num-layers 8 --hidden-size 8192   --ffn-hidden-size 28672  --num-attention-heads 64 --tokenizer-type Llama2Tokenizer  --tokenizer-model ${TOKENIZER_MODEL} --seq-length 2048 --max-position-embeddings 2048  --micro-batch-size 2  --global-batch-size 48  --make-vocab-size-divisible-by 1  --lr 1.0e-6  --train-iters 5000  --lr-decay-style cosine  --untie-embeddings-and-output-weights  --disable-bias-linear  --attention-dropout 0.0   --init-method-std 0.01  --hidden-dropout 0.0  --position-embedding-type rope  --normalization RMSNorm  --swiglu  --load ${LOAD_CHECKPOINT_PATH}  --no-masked-softmax-fusion --attention-softmax-in-fp32  --min-lr 1.0e-7   --weight-decay 1e-1   --lr-warmup-fraction 0.01   --clip-grad 1.0  --adam-beta1 0.9  --initial-loss-scale 65536  --adam-beta2 0.95  --no-gradient-accumulation-fusion --no-load-optim  --no-load-rng  --enable-high-availability --enable-worker-reboot  --bf16 
    --data-path $DATA_PATH  --split 100,0,0 --log-interval 1  --save-interval 10000   --eval-interval 1000  --eval-iters 0 --distributed-backend nccl --save ${SAVE_CHECKPOINT_PATH};" ]            
             ports:                          # default value 
               - containerPort: 2222 
               name: ascendjob-port if not set              
               - containerPort: 8000    # 用于MindIO通信,请注意上下保持一致
               name: ttp-port
    ...
    
    ...
      replicaSpecs:    
          Worker:     
            replicas: 1      
            restartPolicy: Never      
            template:        
                metadata:
    ...
                - name: TTP_PORT
                value: "8000"  # 用于MindIO通信,请注意上下保持一致
            command:                           # training command, which can be modified             
            - /bin/bash              
            - -c            
            args: [ "export ELASTIC_PROCESS_RECOVER_ENABLE=1;cd /job/code; chmod +x scripts/train_start.sh; bash scripts/train_start.sh /job/code /job/output pretrain_gpt.py --tensor-model-parallel-size 4  --pipeline-model-parallel-size 1 --sequence-parallel --use-distributed-optimizer  --num-layers 8 --hidden-size 8192   --ffn-hidden-size 28672  --num-attention-heads 64 --tokenizer-type Llama2Tokenizer  --tokenizer-model ${TOKENIZER_MODEL} --seq-length 2048 --max-position-embeddings 2048  --micro-batch-size 2  --global-batch-size 48  --make-vocab-size-divisible-by 1  --lr 1.0e-6  --train-iters 5000  --lr-decay-style cosine  --untie-embeddings-and-output-weights  --disable-bias-linear  --attention-dropout 0.0   --init-method-std 0.01  --hidden-dropout 0.0  --position-embedding-type rope  --normalization RMSNorm  --swiglu  --load ${LOAD_CHECKPOINT_PATH}  --no-masked-softmax-fusion --attention-softmax-in-fp32  --min-lr 1.0e-7   --weight-decay 1e-1   --lr-warmup-fraction 0.01   --clip-grad 1.0  --adam-beta1 0.9  --initial-loss-scale 65536  --adam-beta2 0.95  --no-gradient-accumulation-fusion --no-load-optim  --no-load-rng  --enable-high-availability --enable-worker-reboot  --bf16 
    --data-path $DATA_PATH  --split 100,0,0 --log-interval 1  --save-interval 10000   --eval-interval 1000  --eval-iters 0 --distributed-backend nccl --save ${SAVE_CHECKPOINT_PATH};" ]            
             ports:                          # default value 
               - containerPort: 2222 
               name: ascendjob-port if not set              
               - containerPort: 8000    # 用于MindIO通信,请注意上下保持一致
               name: ttp-port
    ...
  5. 使用断点续训功能,建议扩展内存,请按注释添加参数,示例如下。
    ...
              volumeMounts:                             #断点续训扩容
             - name: shm
               mountPath: /dev/shm
            volumes:
            - name: shm
              emptyDir:
                medium: Memory
                sizeLimit: 16Gi
    ...
  6. 若需要配置CPU、Memory资源,请参见如下示例手动添加“cpu”“memory”参数和对应的参数值,具体数值请根据实际情况配置。
    ...
              resources:  
                requests:
                  huawei.com/Ascend910: 8
                  cpu: 100m               
                  memory: 100Gi           
                limits:
                  huawei.com/Ascend910: 8
                  cpu: 100m
                  memory: 100Gi
    ...
  7. 修改训练脚本、代码的挂载路径,并添加Elastic Agent日志挂载目录。

    从昇腾镜像仓库拉取的基础镜像中不包含训练脚本、代码等文件,训练时通常使用挂载的方式将训练脚本、代码等文件映射到容器内。

              volumeMounts:
              - name: ascend-910-config
                mountPath: /user/serverid/devindex/config
              - name: code
                mountPath: /job/code                     # 容器中训练脚本路径
              - name: data
                mountPath: /job/data                      # 容器中训练数据集路径
              - name: output
                mountPath: /job/output                    # 容器中训练输出路径
              - name: elastic
                mountPath: /var/log/mindx-dl/elastic         # Elastic Agent容器内日志挂载目录
              volumes:
              - name: elastic
                hostPath:
                  path: /var/log/mindx-dl/elastic             # Elastic Agent容器外日志挂载目录        
  8. (可选)如下所示,YAML中训练命令bash train_start.sh后跟的三个参数依次为容器内训练代码目录、输出目录(其中包括生成日志重定向文件以及TensorFlow框架模型文件)、启动脚本相对代码目录的路径(PyTorch命令参数不涉及启动脚本)。之后的以“--”开头的参数为训练脚本需要的参数。单机和分布式训练脚本、脚本参数可参考模型脚本来源处的模型说明修改。

    使用优雅容错模式可跳过该步骤。

    • TensorFlow命令参数
      command:
      - "/bin/bash"
      - "-c"
      - "cd /job/code/scripts;chmod +x train_start.sh;bash train_start.sh /job/code/ /job/output/ tensorflow/resnet_ctl_imagenet_main.py --data_dir=/job/data/imagenet_TF --distribution_strategy=one_device --use_tf_while_loop=true --epochs_between_evals=1 --skip_eval --enable_checkpoint_and_export;"
      ...
    • PyTorch命令参数
      command:
      - "/bin/bash"
      - "-c"
      - "cd /job/code/scripts;chmod +x train_start.sh;bash train_start.sh /job/code/ /job/output/ main.py --data=/job/data/resnet50/imagenet --amp --arch=resnet50 --seed=49 -j=128 --lr=1.6 --dist-backend='hccl' --multiprocessing-distributed --epochs=90 --batch-size=1024 --resume=true;"
      ...
    • 使用MindSpore架构的模型包括resnet50模型和Pangu_alpha模型需要跳过此步骤。
  9. 选择存储方式。
    • (可选)NFS场景需要指定NFS服务器地址、训练数据集路径、脚本路径和训练输出路径,请根据实际修改。如果不使用NFS请根据K8s相关指导自行修改。

      请勿使用ConfigMap挂载RankTable文件,否则可能会导致任务重调度失败。

      ...
                volumeMounts:
                - name: ascend-910-config
                  mountPath: /user/serverid/devindex/config
                - name: code
                  mountPath: /job/code                     # 容器中训练脚本路径
                - name: data
                  mountPath: /job/data                      # 容器中训练数据集路径
                - name: output
                  mountPath: /job/output                    # 容器中训练输出路径
      ...
                 # 可选,使用Ascend Operator组件为训练任务生成RankTable文件,需要新增以下加粗字段,设置容器中hccl.json文件保存路径,该路径不可修改。
                - name: ranktable        
                  mountPath: /user/serverid/devindex/config
      ...
              volumes:
      ...
              - name: code
                nfs:
                  server: 127.0.0.1        # NFS服务器IP地址
                  path: "xxxxxx"           # 配置训练脚本路径
              - name: data
                nfs:
                  server: 127.0.0.1
                  path: "xxxxxx"           # 配置训练集路径
              - name: output
                nfs:
                  server: 127.0.0.1
                  path: "xxxxxx"           # 设置脚本相关模型的保存路径
      ...
                 # 可选,使用组件为PyTorch框架生成RankTable文件,需要新增以下加粗字段,设置hccl.json文件保存路径
              - name: ranktable         #请勿修改此参数的默认值,Ascend Operator会用于检查是否开启文件挂载hccl.json。
                hostPath:                    #请使用hostpath挂载或NFS挂载
                  path: /user/mindx-dl/ranktable/default.default-test-pytorch   # 共享存储或者本地存储路径,/user/mindx-dl/ranktable/为前缀路径,必须和Ascend Operator挂载的Ranktable根目录保持一致。default.default-test-pytorch为后缀路径,建议改为:namespace.job-name。
      ...
    • (可选)如果使用本地存储的挂载方式,需要将YAML中的NFS方式改为hostPath。
                volumes:
                - name: code
                  hostPath:                                                        #修改为本地存储
                    path: "/data/atlas_dls/code/resnet/"
                - name: data
                  hostPath:                                                        #修改为本地存储
                    path: "/data/atlas_dls/public/dataset/"
                - name: output
                  hostPath:                                                        #修改为本地存储
                    path: "/data/atlas_dls/output/"
                - name: ascend-driver
                  hostPath:
                    path: /usr/local/Ascend/driver
                - name: dshm
                  emptyDir:
                    medium: Memory
                - name: localtime
                  hostPath:
                    path: /etc/localtime

(可选)修改训练脚本

如果开启了graceExit策略,需保证训练框架能够接收SIGTERM信号后并保存ckpt文件。

以MindSpeed-LLM框架为例,开启方式如下:

  1. 准备MindSpeed-LLM框架运行环境和数据集。
  2. 切换commitID为1c365b1a2e5ba059ab742ee176549d7cddd3b98b。
    git checkout 1c365b1a2e5ba059ab742ee176549d7cddd3b98b
  3. 在MindSpeed-LLM代码目录下,按如下方式修改训练启动脚本。以examples/llama2/pretrain_llama2_7b_ptd.sh为例:
    # 新增以下加粗字段exit-signal-handler,开启结束SIGTERM信号后,保存ckpt功能
     GPT_ARGS="
        --tensor-model-parallel-size ${TP} \
     ...
        --exit-signal-handler \
        --bf16
    "
  4. 训练脚本YAML中需要如下所示配置ConfigMap信息,确保Elastic Agent可以正常使用。
    ...
    apiVersion: v1
    kind: ConfigMap
    metadata: 
      name: reset-config-default-test-pytorch     #name的值必须与下面job name的属性一致,且前缀reset-config-不能修改
      namespace: default                      # namespace和任务保持一致 
      labels: 
        reset: "true"
    data: 
      reset.json: | 
        { 
          "status":"initializing" 
        } 
      checkCode: ""
    ...
    
    ...
    - name: reset-config 
      mountPath: /user/restore/reset/config 
      readOnly: true 
    volumes: 
    - name: reset-config 
      hostPath: 
        path: /user/restore/reset/default.reset-config-default-test-pytorch 
    ...