作业调度
旧版本
此页面是关于 Kubeflow Training Operator V1 的内容,最新信息请查阅 Kubeflow Trainer V2 文档。
按照 此指南 迁移到 Kubeflow Trainer V2。
本指南介绍了如何使用 Kueue、Volcano 调度器和带有 coscheduling 的调度器插件来支持 Kubeflow 中的 gang-scheduling,以允许作业同时运行多个 pod。
使用 gang-scheduling 运行作业
Training Operator 和 MPI Operator 支持使用 Kueue、Volcano 调度器和带有 coscheduling 的调度器插件来运行具有 gang-scheduling 的作业。
将 Kueue 与 Training Operator 作业一起使用
按照 本指南学习 如何将 Kueue 与 Training Operator 作业一起使用,并管理您的 ML 训练作业队列
带有 coscheduling 的调度器插件
您必须首先在您的集群中安装带有 coscheduling 的调度器插件,将其作为 Kubernetes 的默认调度器或辅助调度器,并配置操作员以在以下内容中选择 gang-scheduling 的调度器名称
- training-operator
...
spec:
containers:
- command:
- /manager
+ - --gang-scheduler-name=scheduler-plugins
image: kubeflow/training-operator
name: training-operator
...
- mpi-operator (已将调度器插件安装为默认调度器)
...
spec:
containers:
- args:
+ - --gang-scheduling=default-scheduler
- -alsologtostderr
- --lock-namespace=mpi-operator
image: mpioperator/mpi-operator:0.4.0
name: mpi-operator
...
- mpi-operator (已将调度器插件安装为辅助调度器)
...
spec:
containers:
- args:
+ - --gang-scheduling=scheduler-plugins-scheduler
- -alsologtostderr
- --lock-namespace=mpi-operator
image: mpioperator/mpi-operator:0.4.0
name: mpi-operator
...
- 按照 kubernetes-sigs/scheduler-plugins 仓库中的说明 安装带有 coscheduling 的调度器插件。
注意: Kubeflow 中的调度器插件和操作员通过使用 PodGroup 实现 gang-scheduling。操作员会自动创建作业的 PodGroup。
如果您在集群中将调度器插件安装为辅助调度器,您需要在 CustomJob 资源(例如 TFJob)中指定调度器名称,例如
apiVersion: "kubeflow.org/v1"
kind: TFJob
metadata:
name: tfjob-simple
namespace: kubeflow
spec:
tfReplicaSpecs:
Worker:
replicas: 2
restartPolicy: OnFailure
template:
spec:
+ schedulerName: scheduler-plugins-scheduler
containers:
- name: tensorflow
image: kubeflow/tf-mnist-with-summaries:latest
command:
- "python"
- "/var/tf_mnist/mnist_with_summaries.py"
如果您将调度器插件安装为默认调度器,则无需在 CustomJob 资源(例如 TFJob)中指定调度器名称。
Volcano 调度器
您必须首先在集群中安装 volcano 调度器,将其作为 Kubernetes 的辅助调度器,并配置操作员以在以下内容中选择 gang-scheduling 的调度器名称
- training-operator
...
spec:
containers:
- command:
- /manager
+ - --gang-scheduler-name=volcano
image: kubeflow/training-operator
name: training-operator
...
- mpi-operator
...
spec:
containers:
- args:
+ - --gang-scheduling=volcano
- -alsologtostderr
- --lock-namespace=mpi-operator
image: mpioperator/mpi-operator:0.4.0
name: mpi-operator
...
- 按照 volcano 仓库中的说明 安装 Volcano。
注意: Volcano 调度器和 Kubeflow 中的操作员通过使用 PodGroup 实现 gang-scheduling。操作员会自动创建作业的 PodGroup。
使用 volcano 调度器将作业作为 gang 调度的 yaml 与非 gang 调度器相同,例如
apiVersion: "kubeflow.org/v1beta1"
kind: "TFJob"
metadata:
name: "tfjob-gang-scheduling"
spec:
tfReplicaSpecs:
Worker:
replicas: 1
template:
spec:
containers:
- args:
- python
- tf_cnn_benchmarks.py
- --batch_size=32
- --model=resnet50
- --variable_update=parameter_server
- --flush_stdout=true
- --num_gpus=1
- --local_parameter_device=cpu
- --device=gpu
- --data_format=NHWC
image: gcr.io/kubeflow/tf-benchmarks-gpu:v20171202-bdab599-dirty-284af3
name: tensorflow
resources:
limits:
nvidia.com/gpu: 1
workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
restartPolicy: OnFailure
PS:
replicas: 1
template:
spec:
containers:
- args:
- python
- tf_cnn_benchmarks.py
- --batch_size=32
- --model=resnet50
- --variable_update=parameter_server
- --flush_stdout=true
- --num_gpus=1
- --local_parameter_device=cpu
- --device=cpu
- --data_format=NHWC
image: gcr.io/kubeflow/tf-benchmarks-cpu:v20171202-bdab599-dirty-284af3
name: tensorflow
resources:
limits:
cpu: "1"
workingDir: /opt/tf-benchmarks/scripts/tf_cnn_benchmarks
restartPolicy: OnFailure
关于 gang-scheduling
当使用 Volcano 调度器或带有 coscheduling 的调度器插件应用 gang-scheduling 时,作业只有在具备足够资源以供作业的所有 pod 使用时才能运行。否则,所有 pod 将处于 Pending 状态,等待足够的资源。例如,如果创建了一个需要 N 个 pod 的作业,但只有足够的资源调度 N-2 个 pod,则该作业的所有 N 个 pod 将保持 Pending 状态。
注意:在高负载下,如果作业的某个 pod 在作业运行时崩溃,它可能会让其他 pod 有机会占用资源并导致死锁。
故障排除
如果您的 volcano 调度器持续出现与 RBAC 相关的问题。
您可以尝试将以下规则添加到 volcano 调度器使用的调度器的 clusterrole 中。
- apiGroups:
- '*'
resources:
- '*'
verbs:
- '*'