配置yaml
本章节指导用户配置整卡调度或静态vNPU调度特性的任务yaml,使用HCCL Controller的用户请参考使用HCCL Controller;使用Ascend Operator的用户请参考使用Ascend Operator。
使用HCCL Controller
- 将yaml文件上传至管理节点任意目录,并根据实际情况修改文件内容。
表1 操作参考 特性名称
操作示例
整卡调度
整卡调度
静态vNPU调度
- 使用整卡调度特性,参考本配置。以a800_tensorflow_vcjob.yaml为例,在一台Atlas 800 训练服务器节点创建单机训练任务,任务使用8个芯片,修改示例如下。修改完成后直接执行步骤2。
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 # 任务名,可自定义 ... spec: minAvailable: 1 # 单机为1 ... - name: "default-test" replicas: 1 # 单机为1 template: metadata: ... spec: ... 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 ...
- 使用整卡调度特性,参考本配置。以a800_tensorflow_vcjob.yaml为例,在两台Atlas 800 训练服务器节点创建分布式训练任务,任务使用2*8个芯片,修改示例如下,分布式任务的每个Pod只能调度到不同节点。修改完成后直接执行步骤2。
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 # 任务名,可自定义 ... spec: minAvailable: 2 # 2节点分布式任务则为2,N节点则为N,Deployment类型的任务不需要该参数 ... - name: "default-test" replicas: 2 # N节点分布式场景为N template: metadata: ... spec: affinity: # 本段配置表示分布式任务的Pod调度到不同节点 podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: volcano.sh/job-name # vcjob固定字段,当任务类型为deployment时,key为deploy-name operator: In # 固定字段 values: - mindx-dls-test # 需要和上面的任务名一致 topologyKey: kubernetes.io/hostname ... 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 ...
- 使用整卡调度特性,参考本配置。以a800_tensorflow_vcjob.yaml为例,在两台Atlas 800T A2 训练服务器节点创建分布式训练任务,任务使用2*8个芯片,修改示例如下,分布式任务的每个Pod只能调度到不同节点。修改完成后直接执行步骤2。
apiVersion: v1 kind: ConfigMap metadata: name: rings-config-mindx-dls-test # rings-config-后的名字需要与任务名一致 ... labels: ring-controller.atlas: ascend-{xxx}b .. --- apiVersion: batch.volcano.sh/v1alpha1 # 不可修改,必须使用Volcano的API kind: Job # 目前只支持Job类型 metadata: name: mindx-dls-test # 任务名字 ... labels: ring-controller.atlas: ascend-{xxx}b # The value must be the same as the label in ConfigMap and cannot be changed. ... spec: minAvailable: 2 # 此处建议与下面的为节点个数保持一致 schedulerName: volcano # Use the Volcano scheduler to schedule jobs. ... tasks: - name: "default-test" replicas: 2 # 此处为节点个数 template: metadata: labels: app: tf ring-controller.atlas: ascend-{xxx}b # The value must be the same as the label in ConfigMap and cannot be changed. spec: affinity: # 本段配置表示分布式任务的Pod调度到不同节点 podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: volcano.sh/job-name # vcjob固定字段,当任务类型为deployment时,key为deploy-name operator: In # 固定字段 values: - mindx-dls-test # 需要和上面的任务名一致 topologyKey: kubernetes.io/hostname containers: - image: tf_arm64:b030 # Training framework image, which can be modified. ... env: ... - name: XDL_IP # 本段固定不变 valueFrom: fieldRef: fieldPath: status.hostIP - name: framework value: "Tensorflow" # 根据实际框架变化进行修改 - name: ASCEND_VISIBLE_DEVICES # 会使用该字段 valueFrom: fieldRef: fieldPath: metadata.annotations['huawei.com/Ascend910'] # 需要和下面resources.requests保持一致 ... resources: requests: huawei.com/Ascend910: 8 # 每台Atlas 800T A2 训练服务器芯片数量最多为8 limits: huawei.com/Ascend910: 8 # 每台Atlas 800T A2 训练服务器芯片数量最多为8 ... nodeSelector: host-arch: huawei-arm accelerator-type: module-{xxx}b-8 # 调度到Atlas 800T A2 训练服务器节点 ...
- 使用静态vNPU调度特性,参考本配置。以a800_tensorflow_vcjob.yaml为例,在一台Atlas 800 训练服务器节点创建单机训练任务,申请2个AI Core的任务为例,修改示例如下。静态vNPU调度特性只支持单机训练任务。修改完成后直接执行步骤2。
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 # 任务名,可自定义 ... spec: minAvailable: 1 # vNPU调度此处需要为1 ... - name: "default-test" replicas: 1 # vNPU调度此处需要为1 template: metadata: ... spec: ... env: ... # 静态vNPU调度暂不支持ASCEND_VISIBLE_DEVICES相关字段,需要删除以下加粗字段 - name: ASCEND_VISIBLE_DEVICES valueFrom: fieldRef: fieldPath: metadata.annotations['huawei.com/Ascend910'] ... resources: requests: huawei.com/Ascend910-2c: 1 # vNPU调度此处数量只能为1 limits: huawei.com/Ascend910-2c: 1 # vNPU调度此处数量只能为1 ... nodeSelector: host-arch: huawei-arm accelerator-type: module ...
整卡调度或静态vNPU调度特性配置yaml的操作只在步骤1中有区别,整卡调度和静态vNPU调度特性在步骤1之后的操作相同。
- 使用整卡调度特性,参考本配置。以a800_tensorflow_vcjob.yaml为例,在一台Atlas 800 训练服务器节点创建单机训练任务,任务使用8个芯片,修改示例如下。修改完成后直接执行步骤2。
- 若需要配置CPU、Memory资源,请参见如下示例手动添加“cpu”和“memory”参数和对应的参数值,具体数值请根据实际情况配置。
... resources: requests: huawei.com/Ascend910: 8 cpu: 100m # means 100 milliCPU.For example 100m CPU, 100 milliCPU, and 0.1 CPU are all the same memory: 100Gi # means 100*230 bytes of memory limits: huawei.com/Ascend910: 8 cpu: 100m memory: 100Gi ...
- 修改训练脚本、代码的挂载路径。
从昇腾镜像仓库拉取的基础镜像中不包含训练脚本、代码等文件,训练时通常使用挂载的方式将训练脚本、代码等文件映射到容器内。
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 # 容器中训练输出路径
- 如下所示,yaml中训练命令bash train_start.sh后跟的三个参数依次为容器内训练代码目录、输出目录(其中包括生成日志重定向文件以及TensorFlow框架模型文件)、启动脚本相对代码目录的路径。之后的以“--”开头的参数为训练脚本需要的参数。单机和分布式训练脚本、脚本参数可参考模型脚本来源处的模型说明修改。
- 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 --world-size=1 --dist-backend='hccl' --multiprocessing-distributed --epochs=90 --batch-size=1024;" ...
- MindSpore命令参数
command: - "/bin/bash" - "-c" - "cd /job/code/scripts;chmod +x train_start.sh;bash train_start.sh /job/code/ /job/output/ train.py --config_path=/job/code/config/resnet50_imagenet2012_config.yaml --output_dir=/job/output --run_distribute=True --device_num=8 --data_path=/job/data/imagenet/train" ...
- TensorFlow命令参数
- yaml为使用NFS场景,需要指定NFS服务器地址、训练数据集路径、脚本路径和训练输出路径,请根据实际修改。如果不使用NFS请根据K8s相关指导自行修改。
... 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 # 容器中训练输出路径 ... 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" # 设置脚本相关配置模型保存路径 ...
使用Ascend Operator
- 将yaml文件上传至管理节点任意目录,并根据实际情况修改文件内容。
表2 操作参考 特性名称
操作示例
整卡调度
说明:若需要使用PyTorch框架支持的交换机亲和性调度,配置示例请参见配置交换机亲和性调度参考示例。
整卡调度
静态vNPU调度
- 使用整卡调度特性,参考本配置。以tensorflow_standalone_acjob.yaml为例,在Atlas 800 训练服务器节点创建单机训练任务,执行1*8芯片训练任务,修改示例如下。修改完成后直接执行步骤2。
apiVersion: mindxdl.gitee.com/v1 kind: AscendJob metadata: name: default-test-tensorflow labels: framework: tensorflow spec: schedulerName: volcano # 当Ascend Operator组件的启动参数enableGangScheduling为true时生效 runPolicy: schedulingPolicy: # 当Ascend Operator组件的启动参数enableGangScheduling为true时生效 minAvailable: 1 queue: default successPolicy: AllWorkers replicaSpecs: Chief: replicas: 1 restartPolicy: Never template: spec: nodeSelector: host-arch: huawei-arm accelerator-type: module # 其他可选值可参考表2 containers: - name: ascend # 必须为ascend,不能修改 ... env: ... - name: ASCEND_VISIBLE_DEVICES # Ascend Docker Runtime会使用该字段 valueFrom: fieldRef: fieldPath: metadata.annotations['huawei.com/Ascend910'] # 需要和下面resources.requests保持一致 ... ports: - containerPort: 2222 name: ascendjob-port resources: limits: huawei.com/Ascend910: 8 requests: huawei.com/Ascend910: 8 ...
- 使用整卡调度特性,参考本配置。PyTorch和MindSpore框架新增了使用交换机亲和性调度的功能,该功能支持大模型任务和普通任务。以pytorch_standalone_acjob.yaml为例,在一台Atlas 800 训练服务器节点创建单机训练任务,任务使用1个芯片,修改示例如下。修改完成后直接执行步骤2。
apiVersion: mindxdl.gitee.com/v1 kind: AscendJob metadata: name: default-test-pytorch labels: framework: pytorch tor-affinity: "normal-schema" #该标签为任务是否使用交换机亲和性调度标签,null或者不写该标签则不使用该特性。large-model-schema表示大模型任务,normal-schema 普通任务 spec: schedulerName: volcano # 当Ascend Operator组件的启动参数enableGangScheduling为true时生效 runPolicy: schedulingPolicy: # 当Ascend Operator组件的启动参数enableGangScheduling为true时生效 minAvailable: 1 queue: default successPolicy: AllWorkers replicaSpecs: Master: replicas: restartPolicy: Never template: spec: nodeSelector: host-arch: huawei-arm accelerator-type: module containers: - name: ascend # 必须为ascend,不能修改 ... env: ... - name: ASCEND_VISIBLE_DEVICES # Ascend Docker Runtime会使用该字段 valueFrom: fieldRef: fieldPath: metadata.annotations['huawei.com/Ascend910'] # 需要和下面resources.requests保持一致 ... ports: - containerPort: 2222 name: ascendjob-port resources: limits: huawei.com/Ascend910: 1 requests: huawei.com/Ascend910: 1 ...
- 使用整卡调度特性,参考本配置。tensorflow_multinodes_acjob_{xxx}b.yaml为例,在两台Atlas 800T A2 训练服务器节点创建分布式训练任务,执行2*8芯片训练任务,修改示例如下,分布式任务的每个Pod只能调度到不同节点。修改完成后直接执行步骤2。
apiVersion: mindxdl.gitee.com/v1 kind: AscendJob metadata: name: default-test-tensorflow # 任务名 labels: framework: tensorflow ring-controller.atlas: ascend-{xxx}b # 使用Atlas 训练系列产品时需要删除该字段 spec: schedulerName: volcano # 当Ascend Operator组件的启动参数enableGangScheduling为true时生效 runPolicy: schedulingPolicy: # 当Ascend Operator组件的启动参数enableGangScheduling为true时生效 minAvailable: 2 queue: default successPolicy: AllWorkers replicaSpecs: Chief: replicas: 1 restartPolicy: Never template: metadata: labels: ring-controller.atlas: ascend-{xxx}b # 使用Atlas 训练系列产品时需要删除该字段 spec: affinity: # 本段配置表示分布式任务的Pod调度到不同节点 podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: job-name operator: In values: - default-test-tensorflow # 需要和上面的任务名一致 topologyKey: kubernetes.io/hostname nodeSelector: host-arch: huawei-arm accelerator-type: module-{xxx}b-8 containers: - name: ascend # 必须为ascend,不能修改 ... resources: limits: huawei.com/Ascend910: 8 requests: huawei.com/Ascend910: 8 volumeMounts: ... volumes: ... Worker: replicas: 1 restartPolicy: Never template: metadata: labels: ring-controller.atlas: ascend-{xxx}b spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: job-name operator: In values: - default-test-tensorflow # 需要和上面的任务名一致 topologyKey: kubernetes.io/hostname nodeSelector: host-arch: huawei-arm accelerator-type: module-{xxx}b-8 containers: - name: ascend # 必须为ascend,不能修改 ... env: ... - name: ASCEND_VISIBLE_DEVICES # Ascend Docker Runtime会使用该字段 valueFrom: fieldRef: fieldPath: metadata.annotations['huawei.com/Ascend910'] # 需要和下面resources.requests保持一致 ... ports: - containerPort: 2222 name: ascendjob-port resources: limits: huawei.com/Ascend910: 8 requests: huawei.com/Ascend910: 8 volumeMounts: ... volumes: ...
- 使用静态vNPU调度特性,参考本配置。以tensorflow_standalone_acjob.yaml为例,在一台Atlas 800 训练服务器节点创建单机训练任务,申请2个AI Core的任务为例,修改示例如下。静态vNPU调度只支持单机训练任务。修改完成后直接执行步骤2。
apiVersion: mindxdl.gitee.com/v1 kind: AscendJob metadata: name: default-test-tensorflow labels: framework: tensorflow ring-controller.atlas: ascend-{xxx}b # 使用Atlas 训练系列产品时需要删除该字段 spec: schedulerName: volcano # 当Ascend Operator组件的启动参数enableGangScheduling为true时生效 runPolicy: schedulingPolicy: # 当Ascend Operator组件的启动参数enableGangScheduling为true时生效 minAvailable: 1 queue: default successPolicy: AllWorkers replicaSpecs: Chief: replicas: 1 restartPolicy: Never template: metadata: labels: ring-controller.atlas: ascend-{xxx}b # 使用Atlas 训练系列产品时需要删除该字段 spec: nodeSelector: host-arch: huawei-arm # 可选值,根据实际情况填写 accelerator-type: module-{xxx}b-8 containers: - name: ascend # 必须为ascend,不能修改 image: tensorflow-test:latest ... env: ... # 静态vNPU调度暂不支持ASCEND_VISIBLE_DEVICES相关字段,需要删除以下加粗字段 - name: ASCEND_VISIBLE_DEVICES valueFrom: fieldRef: fieldPath: metadata.annotations['huawei.com/Ascend910'] ... ports: - containerPort: 2222 name: ascendjob-port resources: limits: huawei.com/Ascend910-2c: 1 # vNPU调度此处数量只能为1 requests: huawei.com/Ascend910-2c: 1 # vNPU调度此处数量只能为1 volumeMounts: ...z
整卡调度或静态vNPU调度特性配置yaml的操作只在步骤1中有区别,整卡调度和静态vNPU调度特性在步骤1之后的操作相同。
- 使用整卡调度特性,参考本配置。以tensorflow_standalone_acjob.yaml为例,在Atlas 800 训练服务器节点创建单机训练任务,执行1*8芯片训练任务,修改示例如下。修改完成后直接执行步骤2。
- 若需要配置CPU、Memory资源,请参见如下示例手动添加“cpu”和“memory”参数和对应的参数值,具体数值请根据实际情况配置。
... resources: requests: huawei.com/Ascend910: 8 cpu: 100m # means 100 milliCPU.For example 100m CPU, 100 milliCPU, and 0.1 CPU are all the same memory: 100Gi # means 100*230 bytes of memory limits: huawei.com/Ascend910: 8 cpu: 100m memory: 100Gi ...
- 修改训练脚本、代码的挂载路径。
从昇腾镜像仓库拉取的基础镜像中不包含训练脚本、代码等文件,训练时通常使用挂载的方式将训练脚本、代码等文件映射到容器内。
volumeMounts: - name: ascend-server-config mountPath: /user/serverid/devindex/config - name: code mountPath: /job/code # 容器中训练脚本路径 - name: data mountPath: /job/data # 容器中训练数据集路径 - name: output mountPath: /job/output # 容器中训练输出路径
- 如下所示,yaml中训练命令bash train_start.sh后跟的三个参数依次为容器内训练代码目录、输出目录(其中包括生成日志重定向文件以及TensorFlow框架模型文件)、启动脚本相对代码目录的路径。之后的以“--”开头的参数为训练脚本需要的参数。单机和分布式训练脚本、脚本参数可参考模型脚本来源处的模型说明修改。
- TensorFlow命令参数
command: - /bin/bash - -c args: [ "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/resnet50/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 args: ["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 --world-size=1 --lr=1.6 --epochs=90 --batch-size=512"] ...
- MindSpore命令参数
command: - /bin/bash - -c args: ["cd /job/code/scripts; chmod +x train_start.sh; bash train_start.sh /job/code/ /job/code/output train.py --data_path=/job/data/resnet50/imagenet/train --config=/job/code/config/resnet50_imagenet2012_config.yaml"] ...
- TensorFlow命令参数
- yaml为使用NFS场景,需要指定NFS服务器地址、训练数据集路径、脚本路径和训练输出路径,请根据实际修改。如果不使用NFS请根据K8s相关指导自行修改。
... volumeMounts: - name: ascend-server-config mountPath: /user/serverid/devindex/config - name: code mountPath: /job/code # 容器中训练脚本路径 - name: data mountPath: /job/data # 容器中训练数据集路径 - name: output mountPath: /job/output # 容器中训练输出路径 ... 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" # 设置脚本相关配置模型保存路径 ...
父主题: 准备任务yaml