Skip to content

基于 Volcano 的 Kthena ModelServing 拓扑亲和 / 反亲和调度

Published on
基于 Volcano 的 Kthena ModelServing 拓扑亲和 / 反亲和调度

在大模型推理场景中,调度目标通常不只是把 Pod 调度到有资源的节点上。

一个完整的推理实例往往包含多个 Role,例如 Prefill、Decode;每个 Role 又可能包含多个副本和多个 Pod。除了资源是否满足,还要考虑:多个服务副本是否应该分散到不同故障域;通信频繁的 Role 是否应该部署得更近;同一 Role 的多个实例是否应该分散,避免共享同一故障点。

Kthena 基于 Volcano 的 PodGroup、SubGroup 和 HyperNode 拓扑能力,在 ModelServing 层提供这类调度表达。

ModelServing 的调度单元

ModelServing 和 Volcano 调度对象之间的对应关系:

  • 一个 ServingGroup 副本对应一个 Volcano PodGroup;
  • 一个 Role 对应一个 SubGroupPolicy;
  • 一个 Role 副本对应一个 SubJob;
  • 一个 SubJob 可以包含多个 Pod,例如一个 entry Pod 和多个 worker Pod。

networkTopology 和 topologyAffinity 解决的问题不同

networkTopology 解决的是一个调度单元自身的聚合范围。

例如:

networkTopology:
  groupPolicy:
    mode: hard
    highestTierName: communication-domain

表示一个 ServingGroup 的 Pod 必须收敛在同一个 communication-domain 范围内。

而 topologyAffinity 描述的是多个调度单元之间的关系:是否应该位于同一个拓扑域。

两者可以同时生效。

ServingGroup 反亲和

对于一个多副本 ModelServing:

可以要求不同 ServingGroup 分布在不同 communication-domain:

topologyAffinity:
  servingGroupAntiAffinity:
    required:
    - topologyTierName: communication-domain

主要解决的是服务实例级故障隔离:

  • 单个 communication-domain 故障不会同时影响所有服务副本;
  • 避免多个 ServingGroup 集中在同一个高层故障域。

在 Volcano 层,这类关系最终作用于 PodGroup。

Role 亲和

对于 PD 分离场景,经常希望 Prefill 和 Decode 距离尽可能近。

例如:

roleAffinity:
  required:
  - roles: [prefill, decode]
    topologyTierName: rack

语义是:Prefill 和 Decode 对应的 SubJobs 位于同一个 rack。

这种方式适合表达通信 locality,而不需要在 ModelServing API 中暴露具体的 Role instance ID。

SubGroup / Role 反亲和

Role 反亲和主要用于副本分散和故障隔离。

同 Role 内反亲和

roleAntiAffinity:
  required:
  - roles: [prefill]
    topologyTierName: node

表示不同 Prefill SubJob 不能落在同一个 node domain。

跨 Role 反亲和

- roles: [prefill, decode]
  topologyTierName: node

表示 Prefill SubJob 和 Decode SubJob 不能共享 Node。

如果希望所有 Prefill、Decode 实例都分别占用不同 Node,需要同时配置:

roleAntiAffinity:
  required:
  - roles: [prefill]
    topologyTierName: node

  - roles: [decode]
    topologyTierName: node

  - roles: [prefill, decode]
    topologyTierName: node

一个完整的组合场景

最终表达的是三层调度关系

不同 ServingGroup 分开:降低服务级故障影响范围。

同一个 ServingGroup 内:Prefill + Decode → 同一 Rack,保证 P/D 通信 locality。

Role 实例:P0、P1、D0、D1 → 不同 Node,既保证通信距离,又兼顾实例隔离。

ModelServing 的拓扑亲和能力,本质上是在普通 Pod 调度之上增加了 Group-Level 的调度语义。

结合 Volcano HyperNode,可以在 communication-domain、rack、node 等不同拓扑层级同时表达这些约束。

对于 PD 分离、多副本推理等场景,这样的调度模型比单纯依赖 Pod affinity / anti-affinity 更贴近实际工作负载结构。