7.2. Volcano

Volcano是 CNCF 下首个也是唯一的基于Kubernetes的容器批量计算平台,主要用于通用计算场景。 它提供了Kubernetes目前缺少的一套机制,这些机制通常是机器学习大数据应用、科学计算、特效渲染等多种通用计算工作负载所需的。 作为一个通用批处理平台,Volcano与几乎所有的主流计算框架无缝对接,如 SparkTensorFlowPyTorchFlinkArgoMindSporePaddlePaddle 等。 它还提供了包括基于各种主流架构的CPU、GPU在内的异构设备混合调度能力。

Volcano提供了丰富的调度策略,增强型的Job管理能力及良好的生态支持,支持扩展自定义插件。 更多相关信息,参见 Volcano官方文档

7.2.1. 部署Volcano

备注

部署Volcano之前,请确保:

  • 可用的Kubernetes集群,且版本 ≥ 1.23

  • Helm 包管理器 ≥ 3.0

7.2.1.1. 解压离线安装包

Volcano容器镜像及Helm Chart软件包以离线形式发布。 以0.8.1版本为例,用户可在随本文档发布的软件包中找到名为 volcano-package-0.8.1.tar.gz 的压缩包,并进行解压缩。

mkdir k8s
tar -C k8s -xvzf volcano-package.0.8.1.tar.gz
volcano-images.0.8.1.run
volcano-0.8.1.tgz

7.2.1.2. 推送容器镜像

用户可执行以下命令将Volcano镜像推送到镜像仓库。假设仓库地址为 DOMAIN,项目名 PROJECT

./k8s/volcano-images.0.8.1.run push DOMAIN/PROJECT

7.2.1.3. 安装Volcano

在Kubernetes管理节点执行以下命令安装Volcano。

helm install volcano volcano-0.8.1.tgz --create-namespace -n volcano \
  --set basic.controller_image_name=DOMAIN/PROJECT/vc-controller-manager \
  --set basic.scheduler_image_name=DOMAIN/PROJECT/vc-scheduler \
  --set basic.admission_image_name=DOMAIN/PROJECT/vc-webhook-manager \
  --wait

用户可通过在命令中增加 --set option=value 的方式设置可选参数,参数含义参见下表。

表 7.3 可选参数

选项

类型

描述

basic.controller_image_name

string

Volcano controller镜像名称

basic.scheduler_image_name

string

Volcano scheduler镜像名称

basic.admission_image_name

string

Volcano admission镜像名称

basic.image_pull_policy

string

镜像拉取策略。默认为 Always,可选 IfNotPresentNever

7.2.1.4. 验证部署

在Kubernetes管理节点执行以下命令查看Volcano部署状态。

kubectl get pod -n volcano
NAME                                   READY   STATUS      RESTARTS   AGE
volcano-admission-67c4564c6-twzdj      1/1     Running     0          31s
volcano-admission-init-mbtnr           0/1     Completed   0          31s
volcano-controllers-568447f669-g844c   1/1     Running     0          31s
volcano-scheduler-76d6458568-sjbbl     1/1     Running     0          31s

7.2.1.5. 卸载Volcano

在Kubernetes管理节点执行以下命令卸载Volcano。

helm uninstall -n volcano volcano

7.2.2. 扩展插件

基于Volcano调度器的扩展框架,沐曦提供了如下扩展调度插件,旨在解决特定场景下的调度需求,提升系统的整体性能和用户体验。

表 7.4 扩展插件

插件

描述

gpu-aware

分析集群中所有可调度节点的GPU拓扑信息,结合配置中的权重对节点评分。为申请GPU资源的任务,选择最优的调度节点

gpu-podaffinity

支持超节点集群上的模型并行任务调度:将任务中的模型并行单元调度到超节点

用户可根据实际场景的调度需求,选择相应的扩展插件。

备注

使用扩展插件之前,请确保Volcano已经部署且运行状态正常。

7.2.2.1. gpu-aware

gpu-aware 是为GPU调度场景研发的插件。它通过分析GPU拓扑信息,结合配置中的权重,计算可调度节点的分数。为申请GPU的任务推荐适合的调度节点,提升集群GPU资源的利用率。

节点的GPU拓扑信息参见 4.4.3.3 GPU拓扑信息

因为拓扑损失分数的存在,调度时会尽可能调度到有资源恰好满足或接近申请GPU数量的节点上,减少资源碎片化的情况。

配置插件

在Kubernetes管理节点执行以下命令更新Volcano调度插件配置。

kubectl edit configmaps -n volcano volcano-scheduler-configmap
 1  apiVersion: v1
 2  data:
 3    volcano-scheduler.conf: |
 4      actions: "enqueue, allocate, backfill"
 5      tiers:
 6      - plugins:
 7        - name: priority
 8        - name: gang
 9          enablePreemptable: false
10        - name: conformance
11      - plugins:
12        - name: overcommit
13        - name: drf
14          enablePreemptable: false
15        - name: predicates
16        - name: proportion
17        - name: nodeorder
18        - name: binpack
19        - name: gpu-aware       # add it to enable gpu-ware plugin
20          arguments:            # add it to enable gpu-ware plugin
21            weight: 1           # add it to enable gpu-ware plugin
22            loss.weight: 0.5    # add it to enable gpu-ware plugin

在配置时,需要填写下表中的所有参数:

表 7.5 Volcano调度插件配置信息

参数

描述

weight

在所有插件中,当前插件的权重。数值越高,当前插件对调度结果的影响越大

loss.weight

损失分数权重。数值越高,集群中的GPU资源碎片越少

准备作业yaml文件

通过Volcano Job提交任务,用户可参考如下示例编写作业yaml文件:

apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
  name: test-job-plugin
spec:
  minAvailable: 1
  schedulerName: volcano
  policies:
    - event: PodEvicted
      action: RestartJob
  plugins:
    env: []
    ssh: []
    svc: []
  maxRetry: 2
  queue: default
  tasks:
    - replicas: 2
      name: "gpu-vectoradd"
      template:
        spec:
          containers:
            - name: ubuntu
              image: ubuntu:22.04
              imagePullPolicy: IfNotPresent
              command: ['bash', '-c']
              args: ["sleep 10s"]
              resources:
                limits:
                  metax-tech.com/gpu: 2
          restartPolicy: Never

提交任务

在Kubernetes管理节点执行以下命令提交任务。

kubectl create -f sample.yaml

7.2.2.2. gpu-podaffinity

在大模型训练/推理场景中,模型并行将模型拆分到多个节点上。 用户期望将任务中的模型并行单元调度到通信性能最佳的节点组,以满足模型并行对GPU间的通信效率要求。 GPU间通信效率较高的节点组称为超节点。

gpu-podaffinity会将模型并行单元调度至最为匹配的超节点,调度示意图如下。

../_images/gpu-podaffinity.png

图 7.2 gpu-podaffinity插件调度示意图

重要

gpu-podaffinity插件使用前,请确保已经部署拓扑组件以生成集群超节点信息。详情参见 4.9 topoDiscovery

调度参数

用户可通过在任务 annotations 上配置调度参数,以配置任务的模型并行规模,参数详见下表。

表 7.6 调度参数列表

选项

类型

描述

metax-tech.com/gpu-group-size

integer/string

超带宽互联卡数。该参数不可缺省,通常为模型并行单元所使用的卡数。该值需要为Pod GPU数量的整数倍,且任务总GPU数量是其整数倍

metax-tech.com/atomic-gpu-group-size

integer/string

最小超带宽互联卡数。通常为模型并行单元内期望必须满足最佳性能的子切分单元所使用的卡数。缺省时该值与 metax-tech.com/gpu-group-size 的值相同。该值需要为Pod GPU数量的整数倍,且 metax-tech.com/gpu-group-size 的值是其整数倍

调度参数示例

若任务模型并行单元依赖于最佳性能或用户期望模型并行单元达到最佳性能时,用户可参考以下示例配置调度参数。

 1...
 2metadata:
 3  annotations:
 4    metax-tech.com/gpu-group-size: "32"
 5spec:
 6  containers:
 7  - name: pytorch
 8    resources:
 9      limits:
10        metax-tech.com/gpu: 8

备注

仅指定 metax-tech.com/gpu-group-size 调度参数, 模型并行单元会确保被调度到性能最佳的超节点,若无性能最佳的超节点则调度失败。

若集群资源碎片较多或者集群性能限制等因素,用户期望任务尽量能被调度及运行,用户可参考以下示例配置调度参数。

 1...
 2metadata:
 3  annotations:
 4    metax-tech.com/gpu-group-size: "32"
 5    metax-tech.com/atomic-gpu-group-size: "16"
 6spec:
 7  containers:
 8  - name: pytorch
 9    resources:
10      limits:
11        metax-tech.com/gpu: 8

备注

指定 metax-tech.com/atomic-gpu-group-size 调度参数,模型并行单元内的子切分单元会确保被调度到性能最佳的超节点,若无性能最佳的超节点则调度失败。模型并行单元尽量被调度到性能较好的超节点。

配置插件

在Kubernetes管理节点执行以下命令更新Volcano调度插件配置。

kubectl edit configmaps -n volcano volcano-scheduler-configmap
 1  apiVersion: v1
 2  data:
 3    volcano-scheduler.conf: |
 4      actions: "enqueue, allocate, backfill"
 5      tiers:
 6      - plugins:
 7        - name: priority
 8        - name: gang
 9          enablePreemptable: false
10        - name: conformance
11        - name: gpu-podaffinity  # add it to enable gpu-podaffinity plugin
12      - plugins:
13        - name: overcommit
14        - name: drf
15          enablePreemptable: false
16        - name: predicates
17        - name: proportion
18        - name: nodeorder
19        - name: binpack

准备作业yaml文件

gpu-podaffinity插件仅支持PyTorch任务。用户可以参考以下示例在多个平台上编写PyTorch作业yaml文件。

重要

请确保yaml文件中指定了 volcano 调度器及 metax-tech.com/gpu-group-size 注解,否则gpu-podaffinity插件不会工作。

  • kubeflow/PyTorchJob

    apiVersion: "kubeflow.org/v1"
    kind: PyTorchJob
    metadata:
      name: pytorch-demo
      namespace: kubeflow
    spec:
      pytorchReplicaSpecs:
        Master:
          replicas: 1
          restartPolicy: Never
          template:
            metadata:
              annotations:
                metax-tech.com/gpu-group-size: "32"
            spec:
              schedulerName: volcano
              containers:
              - name: pytorch
                image: alpine:3.19
                command: ['sh', '-c']
                args: ["sleep infinity"]
                imagePullPolicy: Always
                resources:
                  limits:
                    metax-tech.com/gpu: 8
        Worker:
          replicas: 7
          restartPolicy: Never
          template:
            spec:
              schedulerName: volcano
              containers:
              - name: pytorch
                image: alpine:3.19
                command: ['sh', '-c']
                args: ["sleep infinity"]
                imagePullPolicy: Always
                resources:
                  limits:
                    metax-tech.com/gpu: 8
    
  • Volcano Job

    apiVersion: batch.volcano.sh/v1alpha1
    kind: Job
    metadata:
      name: pytorch-demo
    spec:
      schedulerName: volcano
      plugins:
        pytorch: ["--master=master","--worker=worker","--port=23456"] # Pytorch plugin register
      tasks:
        - replicas: 1
          name: master
          policies:
            - event: TaskCompleted
              action: CompleteJob
          template:
            metadata:
              annotations:
                metax-tech.com/gpu-group-size: "32"
            spec:
              containers:
              - image: alpine:3.19
                imagePullPolicy: IfNotPresent
                name: master
                command: ['sh', '-c']
                args: ["sleep infinity"]
                resources:
                  limits:
                    metax-tech.com/gpu: 8
              restartPolicy: Never
        - replicas: 7
          name: worker
          template:
            spec:
              containers:
              - image: alpine:3.19
                imagePullPolicy: IfNotPresent
                name: worker
                command: ['sh', '-c']
                args: ["sleep infinity"]
                resources:
                  limits:
                    metax-tech.com/gpu: 8
    
  • dlrover/ElasticJob

    apiVersion: elastic.iml.github.io/v1alpha1
    kind: ElasticJob
    metadata:
      name: pytorch-demo
      namespace: dlrover
    spec:
      distributionStrategy: AllreduceStrategy
      optimizeMode: single-job
      replicaSpecs:
        worker:
          replicas: 8
          template:
            metadata:
              annotations:
                metax-tech.com/gpu-group-size: "32"
            spec:
              schedulerName: volcano
              restartPolicy: Never
              containers:
                - name: main
                  image: alpine:3.19
                  imagePullPolicy: Always
                  command: ['sh', '-c']
                  args: ["sleep infinity"]
                  resources:
                    limits:
                      metax-tech.com/gpu: 8
    

提交任务

备注

在提交任务之前,请确保相应的平台组件已经部署且运行状态正常。

在Kubernetes管理节点执行以下命令提交任务。

kubectl create -f sample.yaml