2. 快速入门

2.1. 安装依赖

安装DLRover的 host 系统必须满足如下条件:

  • 已安装配置Kubernetes集群,Kubernetes版本 ≥ 1.21

  • 工作节点已正确安装相应曦云系列GPU的内核驱动

  • 已安装Helm

  • 已部署沐曦GPU k8s插件 metax-gpu-extensions

2.2. 基于k8s部署DLRover

DLRover的k8s微服务通过Helm Chart进行部署,放在离线安装包中。

2.2.1. Helm方式安装DLRover Operator

  1. 执行以下命令,解压DLRover压缩包。

    $ mkdir k8s
    
    $ tar -C k8s -xvzf dlrover-package-0.11.1.tar.gz
    ./dlrover-0.11.1.tgz
    ./dlrover-0.4.0-py3-none-any.whl
    ./dlrover-images.0.11.1.run
    ./py_xpu_timer-1.1+lite-py3-none-any.whl
    ./py_xpu_timer-1.1+maca231-cp310-cp310-linux_x86_64.whl
    ./py_xpu_timer-1.1+maca231-cp38-cp38-linux_x86_64.whl
    ./mxomclient_0.11.1.amd64.deb
    
  2. 假设容器仓库路径为domain/project,执行以下命令,通过Docker将容器镜像推送至仓库。

    ./dlrover-images.0.7.12.run push domain/project
    
  3. 安装Helm Chart。

    helm install dlrover-0.7.12.tgz \
    --create-namespace -n dlrover \
    --generate-name \
    --wait
    

    可在命令中增加 --set option=value 设置可选参数,参见 3.1.1 Helm Chart的配置

  4. 验证部署。

    部署后,执行以下命令,可以看到 dlrover-controller-manager-pod 的运行状态为 Running

    $ kubectl get pod -n dlrover
    …
    dlrover-controller-manager-7756646b5f-4c2wh 2/2 Running
    

2.2.2. Helm方式升级DLRover Operator

通过 helm upgrade 升级安装在 dlrover namespace下的Helm Chart。

  1. 通过 helm 命令查询名称。

    $ helm list -n dlrover
    NAME           NAMESPACE
    dlrover-xxx    dlrover
    
  2. 通过 helm 命令升级DLRover。

    $ helm upgrade dlrover-xxx -n dlrover dlrover-0.7.12.tgz --set option=groupScheduler.enable=False -f value.yaml
    

2.2.3. Helm方式卸载DLRover Operator

  1. 通过 helm 命令查询名称。

    $ helm list -n dlrover
    NAME           NAMESPACE
    dlrover-xxx    dlrover
    
  2. 通过 helm 命令卸载DLRover。

    $ helm uninstall dlrover-xxx -n dlrover
    

2.3. 基于k8s提交训练任务

2.3.1. 基础训练镜像中集成DLRover

基于基础训练镜像,安装 DLRover 的 Python wheel包。

FROM your-base-image:tag
…
pip install dlrover-0.3.5-py3-none-any.whl

2.3.2. 编写训练任务的配置文件

根据DLRover ElasticJob 的CRD(Custom Resource Definition)描述,编写训练任务的YAML文件。

YAML文件如下:

apiVersion: elastic.iml.github.io/v1alpha1
kind: ElasticJob
metadata:
  name: fine-tuning-llama2
  namespace: dlrover
spec:
  distributionStrategy: AllreduceStrategy
  optimizeMode: single-job
  replicaSpecs:
    worker:
      replicas: 4  # 任务数量
      template:
        spec:
          restartPolicy: Never
          containers:
            - name: main
              # yamllint disable-line rule:line-length
              image: registry.cn-hangzhou.aliyuncs.com/intell-ai/dlrover:llama-finetuning # 训练镜像
              imagePullPolicy: Always
              command: # 训练执行命令
                - /bin/bash
                - -c
                - "dlrover-run --nnodes=$NODE_NUM \
                  --nproc_per_node=1 --max_restarts=1  \
                  ./examples/pytorch/llama2/fine_tuning.py  \
                  ./examples/pytorch/llama2/btc_tweets_sentiment.json"
              resources:
                limits:
                  cpu: "8"
                  memory: 16Gi
                  metax-tech.com/gpu: 8 # 单个任务申请的GPU数量

YAML文件中的主要参数说明参见 3.1.2 提交训练任务的配置

其中 command 部分指定训练的命令,命令中通过 dlrover-run 指定训练框架,框架基于PyTorch的分布式弹性训练,在各个GPU节点分别启动代理,和DLRover的master做交互。dlrover-run 的主要配置参见 3.1.3 dlrover-run的配置

2.3.3. 下发训练任务

  1. 执行以下命令下发训练任务:

    kubectl apply -f xxx.yaml
    

    或者

    kubectl create -f xxx.yaml
    
  2. 任务下发后,可执行以下命令查询任务的下发和完成情况:

    kubectl get elasticjob -n dlrover
    NAME              PHASE       AGE
    demo-xxx          Succeeded   19h
    
    
    kubectl get pods -n dlrover
    NAME                                         READY   STATUS      RESTARTS   AGE
    demo-xxx-edljob-worker-0                     0/1     Completed   0          19h
    demo-xxx-edljob-worker-1                     0/1     Completed   0          19h
    dlrover-controller-manager-64c5846678-ml858  2/2     Running     0          20d
    elasticjob-demo-xxx-dlrover-master           0/1     Completed   0          19h
    

2.3.4. 删除训练任务

执行以下命令删除训练任务:

kubectl delete -f xxx.yaml