创建任务yaml

操作步骤

请根据使用须知里的介绍根据实际情况选择合适的yaml。

yaml示例为使用NFS的场景,NFS需要安装在存储节点,安装操作请参见安装NFS

  1. 请从集群调度组件MindXDL-deploy仓库“5.0.RC1”分支下载yaml文件,yaml文件说明如表1所示。

    表1 任务类型与硬件型号对应yaml文件

    任务类型

    硬件型号

    训练框架

    yaml文件

    获取yaml

    说明

    AscendJob

    Atlas 800 训练服务器

    Tensorflow

    tensorflow_multinodes_acjob.yaml

    根据所使用的框架类型,获取yaml

    示例默认为双机8卡任务。

    Pytorch

    pytorch_multinodes_acjob.yaml

    MindSpore

    mindspore_multinodes_acjob.yaml

    Tensorflow

    tensorflow_standalone_acjob.yaml

    示例默认为单机单卡任务。

    Pytorch

    pytorch_standalone_acjob.yaml

    MindSpore

    mindspore_standalone_acjob.yaml

  2. 将yaml文件上传至管理节点任意目录,并根据实际情况修改文件内容,部分参数说明如表2所示。

    表2 yaml文件参数说明

    参数

    取值

    说明

    framework

    • mindspore
    • pytorch
    • tensorflow

    框架类型,目前只支持三种。

    schedulerName

    默认值为“volcano”,用户需根据自身情况填写

    Ascend Operator启用“gang”调度时所选择的调度器。

    minAvailable

    默认值为任务总副本数

    Ascend Operator启用“gang”调度生效时,任务运行最少副本数。

    queue

    默认值为“default”,用户需根据自身情况填写

    Ascend Operator启用“gang”调度生效时,任务所属队列。

    successPolicy(可选)

    • 默认值为空,若用户不填写该参数,则默认取空值。
    • AllWorkers

    表明任务成功的前提。空值代表只需要一个Pod成功,整个任务判定为成功。取值为“AllWorkers”表示所有Pod都成功,任务才判定为成功代表。

    container.name

    ascend

    训练容器的名称必须是“ascend”

    ports(可选)

    若用户未进行设置,系统默认填写以下参数:

    • name: ascendjob-port
    • containerPort: 2222

    分布式训练集合通讯端口。“name”取值只能为“ascendjob-port”“containerPort”用户可根据实际情况设置,若未进行设置则采用默认端口2222。

    replicas

    • 单机:1
    • 分布式:N

    分布式任务时woker中N为节点个数。

    image

    -

    训练镜像名称,请根据实际修改。

    host-arch

    Arm环境:huawei-arm

    x86_64环境:huawei-x86

    需要运行训练任务的节点架构,请根据实际修改。

    分布式任务中,请确保运行训练任务的节点架构相同。

    accelerator-type

    Atlas 800 训练服务器(NPU满配):module

    Atlas 800 训练服务器(NPU半配):half

    服务器(插Atlas 300T 训练卡):card

    根据需要运行训练任务的节点类型,选取不同的值。(可选)如果节点是Atlas 800 训练服务器(NPU满配),可以省略该标签。

    huawei.com/Ascend910

    Atlas 800 训练服务器(NPU满配)

    • 单机单芯片:1
    • 单机多芯片:2、4、8
    • 分布式:1、2、4、8

    Atlas 800 训练服务器(NPU半配)

    • 单机单芯片:1
    • 单机多芯片:2、4
    • 分布式:1、2、4

    服务器(插Atlas 300T 训练卡):

    • 单机单芯片:1
    • 单机多芯片:2
    • 分布式:2

    请求的NPU数量,请根据实际修改。

    huawei.com/Ascend910-Y

    取值为1

    请求的vNPU数量,其中Y值和vNPU类型相关。

    以mindspore_multinodes_acjob.yaml为例,两个Atlas 800 训练服务器节点,以执行2*8芯片分布式训练任务,修改如下(MindSpore框架Schduler中“resources”字段不需要设置NPU芯片)。
    ...
      Worker:
        replicas: 2                  # N节点分布式场景为N,且requests字段的NPU的数目为8
        template:
          metadata:
    ...
              resources:  
                requests:
                  huawei.com/Ascend910: 8          # 需要的NPU芯片个数为8。可在下方添加行,配置memory、cpu等资源
                limits:
                  huawei.com/Ascend910: 8          # 目前需要和上面requests保持一致
    ...
    若需要配置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
    ...
    若需要分布式任务调度到不同节点,请参考如下示例。
     ...
              affinity:
                podAntiAffinity:
                  requiredDuringSchedulingIgnoredDuringExecution:
                  - labelSelector:
                      matchExpressions:
                        - key: job-name                            #固定字段
                          operator: In                             #固定字段
                          values:
                            - default-test-mindspore               # 需要和任务名一致
                        - key: replica-type                        # 固定字段
                          operator: In                             # 固定字段
                          values:
                            - worker                               # 固定字段
                    topologyKey: kubernetes.io/hostname
    ...

    TensorFlow、PyTorch、MindSpore框架中对应的Chief、Master、Scheduler的“replicas”字段不能超过1。单机任务时,TensorFlow、PyTorch框架不需要Worker。单卡任务时,MindSpore框架不需要Scheduler。

  3. 修改训练脚本、代码的挂载路径。

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

              volumeMounts:
              - name: code
                mountPath: /job/code/                     # 容器中训练脚本路径
              - name: data
                mountPath: /job/data                      # 容器中训练数据集路径
              - name: output
                mountPath: /job/output                    # 容器中训练输出路径

  4. 如下所示,训练命令中的“train_start.sh”后跟的三个参数依次为容器内训练代码目录、输出路径(其中生成日志重定向文件以及TensorFlow框架模型文件)、启动脚本相对代码目录的路径。之后的以“--”开头的参数为训练脚本需要的参数。单机和分布式训练脚本、脚本参数可参考模型脚本来源处的模型说明修改。

    • TensorFlow命令参数
      ...
      command:
      - "/bin/bash"
      - "-c"
      - "cd /job/code/ResNet50_for_TensorFlow_2.6_code/scripts/; chmod +x train_start.sh; bash train_start.sh /job/code/ResNet50_for_TensorFlow_2.6_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"
      - "cd /job/code/ResNet50_for_PyTorch_1.8_code/scripts;chmod +x train_start.sh;bash train_start.sh /job/code/ResNet50_for_PyTorch_1.8_code  /job/code/ResNet50_for_PyTorch_1.8_code/output/ DistributedResnet50/main_apex_d76_npu.py --data=/job/data/resnet50/imagenet --seed=49    --workers=128   --learning-rate=1.6  --warmup=8 --label-smoothing=0.1 --mom=0.9 --weight-decay=1.0e-04   --static-loss-scale=128  --print-freq=1   --dist-url='tcp://127.0.0.1:50000'   --dist-backend='hccl' --epoch=90 --batch-size=256 --save_ckpt_path=/job/code/ResNet50_for_PyTorch_1.8_code/output/;"# 此处省略部分参数
      ...
    • MindSpore命令参数
      ...
      command:
      - "/bin/bash"
      - "-c"
      - "cd /job/code/ResNet50_for_MindSpore_2.0_code/scripts; chmod +x train_start.sh; bash train_start.sh /job/code/ResNet50_for_MindSpore_2.0_code/ /job/code/ResNet50_for_MindSpore_2.0_code/output train.py --data_path=/job/data/resnet50/imagenet/train --config=/job/code/ResNet50_for_MindSpore_2.0_code/config/resnet50_imagenet2012_config.yaml"# 此处省略部分参数
      ...
      TensorFlow命令参数为例。
      • /job/code/ResNet50_for_TensorFlow_2.6_code/:其中/job/code/为步骤3中用户自定义的容器中训练脚本路径,ResNet50_for_TensorFlow_2.6_code为准备模型脚本章节的步骤3中用户自定义的训练代码目录。
      • /job/output/:步骤3中用户自定义的容器中训练数据集路径。
      • tensorflow/resnet_ctl_imagenet_main.py:启动训练脚本路径。

  5. yaml为使用NFS场景,需要指定NFS服务器地址、训练数据集路径、脚本路径和训练输出路径,请根据实际修改。如果不使用NFS请根据K8s相关指导自行修改。

    ...
              volumeMounts:
              - 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"           # 设置脚本相关配置模型保存路径
    ...