任务YAML配置示例
重调度模式和优雅容错模式可参考如下操作步骤配置示例。当subHealthyStrategy取值为graceExit时,需要参考(可选)修改训练脚本适配启动脚本确保训练框架能够配合重调度。
操作步骤
- 将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 # 容器重启策略
- 以a800_AscendJob_{xxx}b.yaml为例,在一台Atlas 200T A2 Box16 异构子框节点创建分布式训练任务,任务使用2*4个芯片,修改示例如下。
- 配置MindIO的通信地址。在代码中新增以下加粗内容。
... Master: ... env: - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP # 用于MindIO通信,如果不配置此参数会影响训练任务的正常拉起。
- (可选)如果开启了临终遗言,需要在训练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 ...
- (可选)如果使用临终遗言和进程级恢复,需要在训练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 ...
- 使用断点续训功能,建议扩展内存,请按注释添加参数,示例如下。
... volumeMounts: #断点续训扩容 - name: shm mountPath: /dev/shm volumes: - name: shm emptyDir: medium: Memory sizeLimit: 16Gi ...
- 若需要配置CPU、Memory资源,请参见如下示例手动添加“cpu”和“memory”参数和对应的参数值,具体数值请根据实际情况配置。
... resources: requests: huawei.com/Ascend910: 8 cpu: 100m memory: 100Gi limits: huawei.com/Ascend910: 8 cpu: 100m memory: 100Gi ...
- 修改训练脚本、代码的挂载路径,并添加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容器外日志挂载目录
- (可选)如下所示,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模型需要跳过此步骤。
- TensorFlow命令参数
- 选择存储方式。
- (可选)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
- (可选)NFS场景需要指定NFS服务器地址、训练数据集路径、脚本路径和训练输出路径,请根据实际修改。如果不使用NFS请根据K8s相关指导自行修改。
(可选)修改训练脚本
如果开启了graceExit策略,需保证训练框架能够接收SIGTERM信号后并保存ckpt文件。
以MindSpeed-LLM框架为例,开启方式如下:
- 准备MindSpeed-LLM框架运行环境和数据集。
- 切换commitID为1c365b1a2e5ba059ab742ee176549d7cddd3b98b。
git checkout 1c365b1a2e5ba059ab742ee176549d7cddd3b98b
- 在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 "
- 训练脚本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 ...
父主题: 配置任务YAML