跳到主要内容
版本:v1.14.0

Task-topology

概述

Task-topology 算法根据 Job 内任务之间的亲和性和反亲和性配置来计算任务和节点的优先级。通过配置 Job 内任务之间的亲和性和反亲和性策略,并使用 Task-topology 算法,具有亲和性配置的任务将优先被调度到同一节点,而具有反亲和性配置的任务则被调度到不同节点。

工作原理

Task-topology 插件分析作业内的任务关系并优化任务放置:

  • 亲和性(Affinity):适合放置在同一节点上的任务(例如,以实现快速本地通信)
  • 反亲和性(Anti-affinity):应放置在不同节点上的任务(例如,以实现容错)

实现的关键函数:

  • TaskOrderFn:根据拓扑偏好对任务进行排序
  • NodeOrderFn:根据节点满足拓扑要求的程度对节点打分

应用场景

节点亲和性

深度学习与 TensorFlow

Task-topology 对于提高深度学习计算场景中的计算效率非常重要。以 TensorFlow 计算为例,配置"ps"(参数服务器)与"worker"之间的亲和性,Task-topology 算法能够使"ps"和"worker"尽可能被调度到同一节点,从而提高二者之间的网络和数据交互效率,进而提升计算效率。

HPC 与 MPI

HPC 和 MPI 场景中的任务具有高度同步性,需要高速网络 IO。将相关任务放置在同一节点上可降低网络延迟,提升性能。

反亲和性

参数服务器分布

在 TensorFlow 计算中,"ps"实例之间的反亲和性可确保它们分布在不同节点上,以实现更好的负载均衡。

高可用性

电商服务场景可利用反亲和性实现主从备份和数据容灾,确保在主作业故障后备份作业能够继续提供服务。

配置

在调度器中启用 Task-topology 插件:

tiers:
- plugins:
- name: priority
- name: gang
- plugins:
- name: predicates
- name: nodeorder
- name: task-topology
arguments:
task-topology.weight: 10

注解

通过 Job 上的注解配置任务拓扑。Volcano Job 控制器会将这些注解传递给 PodGroup,插件从 PodGroup 中读取注解。

注解说明
volcano.sh/task-topology-affinity定义倾向于调度到同一节点的任务组。使用分号(;)分隔不同组,使用逗号(,)分隔组内的任务名称,例如 "ps,worker;ps,evaluator"。只包含一个任务名称的组表示该任务的多个副本具有自亲和性。
volcano.sh/task-topology-anti-affinity定义倾向于调度到不同节点的任务组。格式与亲和性注解相同,例如 "ps;worker,chief"。只包含一个任务名称的组表示该任务的多个副本具有自反亲和性。
volcano.sh/task-topology-task-order使用逗号分隔的任务名称列表定义任务分配优先级。靠前的任务优先级更高,例如 "ps,worker" 表示 ps 的优先级高于 worker。此注解为可选项,仅影响参与亲和性或反亲和性分组的任务。

注解中的任务名称必须与 Job 中的任务一致,并且同一组内不能重复任务名称。如果拓扑注解无效,插件将忽略该 Job 的拓扑配置。亲和性和反亲和性是评分偏好,而不是硬性调度约束。

示例

带任务亲和性的作业

apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: tensorflow-job
annotations:
volcano.sh/task-topology-affinity: "ps,worker"
volcano.sh/task-topology-task-order: "ps,worker"
spec:
schedulerName: volcano
minAvailable: 3
policies:
- event: PodEvicted
action: RestartJob
tasks:
- replicas: 1
name: ps
policies:
- event: TaskCompleted
action: CompleteJob
template:
metadata:
labels:
role: ps
spec:
containers:
- name: tensorflow
image: tensorflow/tensorflow:latest
- replicas: 2
name: worker
template:
metadata:
labels:
role: worker
spec:
containers:
- name: tensorflow
image: tensorflow/tensorflow:latest
plugins:
env: []
svc: []

插件会先调度 ps 任务,再调度 worker 任务,并提高已运行同一亲和性组内任务的节点得分。

带任务反亲和性的作业

apiVersion: batch.volcano.sh/v1alpha1
kind: Job
metadata:
name: ha-service
annotations:
volcano.sh/task-topology-anti-affinity: "master"
spec:
schedulerName: volcano
minAvailable: 2
tasks:
- replicas: 2
name: master
template:
spec:
containers:
- name: master
image: my-service:latest

在此示例中,已运行 master 副本的节点得分会降低,因此两个副本倾向于调度到不同节点。