使用 PodGroup
概念
PodGroup 是 namespaced-scoped 资源对象,代表一组协同工作的 Pod。PodGroup spec 中定义了 coscheduling 和其他相关的配置信息,调度器 T9k Scheduler 会根据这些信息为 Pod 分配资源。
使用 PodGroup
根据工作负载的种类,创建并使用 PodGroup 的方式如下。
Pod
一般仅需要通过 Job 控制器自动化地实现对 PodGroup 的使用。工作负载控制器的编程者,或者需手工设定 pod 的 PodGroup,可参考本节内容。
用户创建一组使用调度器 T9k Scheduler 进行协同工作的 Pod 时,需要:
- 先在相同的 namespace 中创建一个 PodGroup
- 为 Pod 添加标签
scheduler.tensorstack.dev/group-name: <PodGroup-name>
来表明 Pod 属于步骤一创建的 PodGroup
示例1 - 基本场景
首先需要创建一个 PodGroup:
apiVersion: scheduler.tensorstack.dev/v1beta1
kind: PodGroup
metadata:
name: dance
spec:
minMember: 2
queue: default
priority: 50
然后创建 2 个 Pod 并指定 PodGroup,Pod 通过标签 scheduler.tensorstack.dev/group-name: dance
表明他们属于 PodGroup dance。
apiVersion: v1
kind: Pod
metadata:
name: test1
labels:
scheduler.tensorstack.dev/group-name: dance
spec:
schedulerName: t9k-scheduler
containers:
- image: nginx:latest
name: test
resources:
requests:
cpu: 1
memory: 200Mi
--
apiVersion: v1
kind: Pod
metadata:
name: test2
labels:
scheduler.tensorstack.dev/group-name: dance
spec:
schedulerName: t9k-scheduler
containers:
- image: nginx:latest
name: test
resources:
requests:
cpu: 1
memory: 200Mi
示例2 - 使用 role
本示例展示有 2 个 role 并设置了 role minMember 的 PodGroup 使用场景。
创建 PodGroup
apiVersion: scheduler.tensorstack.dev/v1beta1
kind: PodGroup
metadata:
name: role-test
spec:
roles:
- name: master
minMember: 1
- name: worker
minMember: 1
minMember: 3
queue: default
priority: 50
说明:上面这个 PodGroup 的最小运行需求如下,这些需求都被满足了,调度器才会为 PodGroup 中的 Pod 分配资源:
- PodGroup 的 Pod 数量需要达到 3
- 角色名称是 master 的 Pod 数量需要达到 1
- 角色名称是 worker 的 Pod 数量需要达到 1
创建 Pod:
apiVersion: v1
kind: Pod
metadata:
name: master
labels:
scheduler.tensorstack.dev/group-name: role-test
scheduler.tensorstack.dev/role: master
spec:
schedulerName: t9k-scheduler
containers:
- image: nginx:latest
name: test
resources:
requests:
cpu: 100m
memory: 200Mi
--
apiVersion: v1
kind: Pod
metadata:
name: worker
labels:
scheduler.tensorstack.dev/group-name: role-test
scheduler.tensorstack.dev/role: worker
spec:
schedulerName: t9k-scheduler
containers:
- image: nginx:latest
name: test
resources:
requests:
cpu: 100m
memory: 200Mi
--
apiVersion: v1
kind: Pod
metadata:
name: worker1
labels:
scheduler.tensorstack.dev/group-name: role-test
scheduler.tensorstack.dev/role: worker
spec:
schedulerName: t9k-scheduler
containers:
- image: nginx:latest
name: test
resources:
requests:
cpu: 100m
memory: 200Mi
Pod 通过标签 scheduler.tensorstack.dev/role: <role-name>
来表明自己的角色名称。
T9k Jobs
T9k Job 包括 TensorFlowTrainingJob、PyTorchTrainingJob、XGBoostTrainingJob、GenericJob、MPIJob、ColossalAIJob、DeepSpeedJob 和 BeamJob,这些 Job 中都有相同的 spec.scheduler
字段。
创建 T9k Job 时,用户可以通过设置 spec.scheduler
字段来表明使用 T9k scheduler,并指定 Job 使用哪个队列,然后控制器会自动地创建 PodGroup、并创建 Pod 使用这个 PodGroup。
基本示例
本示例适用于未启用弹性训练的 Job。
以下面这个 GenericJob 为例:
apiVersion: batch.tensorstack.dev/v1beta1
kind: GenericJob
metadata:
name: job-sample
spec:
scheduler:
t9kScheduler:
queue: default
priority: 10
replicaSpecs:
- type: worker
replicas: 4
...
- type: ps
replicas: 1
...
控制器在监测到上述 CRD 后,会创建一个 PodGroup:
apiVersion: scheduler.tensorstack.dev/v1beta1
kind: PodGroup
metadata:
name: job-sample
ownerReferences: [...]
spec:
minMember: 5
priority: 10
queue: default
其中,priority 和 queue 字段参考 job 的 spec.scheduler.t9kScheduler
中的信息设置,minMember 即为 job 所有副本的总数。
随后,控制器会在创建副本的 Pod 时,为 Pod 设置标签 scheduler.tensorstack.dev/group-name: job-sample
来使用上述 PodGroup。
apiVersion: v1
kind: Pod
metadata:
labels:
genericjob: job-sample
genericjob-replica: job-sample-worker-2
scheduler.tensorstack.dev/group-name: job-sample
scheduler.tensorstack.dev/queue: default
tensorstack.dev/component: genericjob
tensorstack.dev/component-type: user
name: job-sample-worker-0
namespace: dev-wangdi
ownerReferences: [...]
弹性训练
弹性训练要求训练规模可以动态调整,所以对 PodGroup 的设置也有所不同。
T9k Job 中,PyTorchTrainingJob 和 DeepSpeedJob 支持弹性训练,他们具有相同的 spec.elastic
字段,以此启动弹性训练。
以下面的 PyTorchTrainingJob 为例:
spec.elastic.enabled
是 true 表明启用弹性训练- PyTorchTrainingJob 支持最少 3 个副本、最多 10 个副本的训练规模
apiVersion: batch.tensorstack.dev/v1beta1
kind: PyTorchTrainingJob
metadata:
name: torch-mnist-trainingjob
spec:
scheduler:
t9kScheduler:
queue: default
priority: 10
elastic:
enabled: true
minReplicas: 3
maxReplicas: 10
expectedReplicas: 7
...
控制器在监测到上述 CRD 后,会创建下列 PodGroup,使用 spec.elastic.minReplicas
作为 PodGroup 的 spec.minMember
:
apiVersion: scheduler.tensorstack.dev/v1beta1
kind: PodGroup
metadata:
name: torch-mnist-trainingjob
ownerReferences: [...]
spec:
minMember: 3
priority: 10
queue: default