7.2. Volcano
Volcano是 CNCF 下首个也是唯一的基于Kubernetes的容器批量计算平台,主要用于通用计算场景。 它提供了Kubernetes目前缺少的一套机制,这些机制通常是机器学习大数据应用、科学计算、特效渲染等多种通用计算工作负载所需的。 作为一个通用批处理平台,Volcano与几乎所有的主流计算框架无缝对接,如 Spark 、 TensorFlow 、 PyTorch 、 Flink 、 Argo 、 MindSpore 、 PaddlePaddle 等。 它还提供了包括基于各种主流架构的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 的方式设置可选参数,参数含义参见下表。
选项 |
类型 |
描述 |
|---|---|---|
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 |
镜像拉取策略。默认为 |
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调度器的扩展框架,沐曦提供了如下扩展调度插件,旨在解决特定场景下的调度需求,提升系统的整体性能和用户体验。
插件 |
描述 |
|---|---|
gpu-aware |
分析集群中所有可调度节点的GPU拓扑信息,结合配置中的权重对节点评分。为申请GPU资源的任务,选择最优的调度节点 |
gpu-podaffinity |
支持超节点集群上的模型并行任务调度:将任务中的模型并行单元调度到超节点 |
用户可根据实际场景的调度需求,选择相应的扩展插件。
备注
使用扩展插件之前,请确保Volcano已经部署且运行状态正常。
7.2.2.1. gpu-aware
gpu-aware 是为GPU调度场景研发的插件。它通过分析GPU拓扑信息,结合配置中的权重,计算可调度节点的分数。为申请GPU的任务推荐适合的调度节点,提升集群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
在配置时,需要填写下表中的所有参数:
参数 |
描述 |
|---|---|
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会将模型并行单元调度至最为匹配的超节点,调度示意图如下。
图 7.2 gpu-podaffinity插件调度示意图
重要
gpu-podaffinity插件使用前,请确保已经部署拓扑组件以生成集群超节点信息。详情参见 4.9 topoDiscovery。
调度参数
用户可通过在任务 annotations 上配置调度参数,以配置任务的模型并行规模,参数详见下表。
选项 |
类型 |
描述 |
|---|---|---|
|
integer/string |
超带宽互联卡数。该参数不可缺省,通常为模型并行单元所使用的卡数。该值需要为Pod GPU数量的整数倍,且任务总GPU数量是其整数倍 |
|
integer/string |
最小超带宽互联卡数。通常为模型并行单元内期望必须满足最佳性能的子切分单元所使用的卡数。缺省时该值与 |
调度参数示例
若任务模型并行单元依赖于最佳性能或用户期望模型并行单元达到最佳性能时,用户可参考以下示例配置调度参数。
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