You need to enable JavaScript to run this app.
文档中心
容器服务

容器服务

复制全文
下载 pdf
拓扑感知调度
RDMA 拓扑感知调度
复制全文
下载 pdf
RDMA 拓扑感知调度
本文主要介绍在容器服务(VKE)中使用 RDMA 拓扑感知调度的方法以及使用限制等。​
背景信息​
在大模型训练等 AI 场景中,经常会出现一个 Job 中的多个 Pod 并行执行训练任务的情况,这些 Pod 在运行过程中需要频繁地相互交换参数、梯度值等数据。为了保障网络通讯开销不成为训练任务的性能瓶颈,通常使用 RDMA 网络在 GPU 之间直接传输数据。而在数据中心当中,一台交换机可以连接的 RDMA 网络设备有限,通常需要 S0 S1 两级交换机连接一个 miniPod 中的所有服务器。这样的网络拓扑结构,会导致不同 RDMA 网卡之间的通讯距离不一样,因此不同的 GPU 设备之间的通讯性能也会有差异。​
针对上述情况,VKE 提供 RDMA 拓扑感知调度能力,通过对 GPU 卡和 RDMA 设备的网络拓扑信息的感知,调度器能够将同一个 Job 中的所有 Pod 调度到 RDMA 网络中拓扑距离尽可能接近的节点和 RDMA 网卡上,进而帮助用户充分发挥 RDMA 网络的通信能力,提升 AI 大模型训练性能。​
使用限制​
​
项目​
要求​
补充说明​
集群版本​
集群版本不满足要求时,请升级集群到要求版本。详细操作,请参见 升级集群。​
集群网络​
VPC-CNI 网络模型​
若无 VPC-CNI 网络模型的集群,请先创建集群。详细操作,请参见 创建集群。​
组件依赖​
  • katalyst 组件(公测)​
  • scheduler-plugin 组件​
  • rdma-device-plugin 组件(公测)​
组件安装和配置说明,请参见 安装组件。​
功能依赖​
kubelet 自定义配置参数​
功能相关介绍,请参见 配置节点池 kubelet 参数。​
​
前提条件​
已创建满足使用限制的集群。详细操作,请参见 创建集群。​
使用方法​
步骤一:集群中使用 RDMA 资源​
在集群中需要准备支持 RDMA 设备的节点(例如:高性能计算 GPU 型),可新建或使用存量符合要求的节点。同时需要手动添加 Key 为vke.node.rdma.mode、Value 为shared的节点标签(Label),为节点配置 RDMA 使用模式。详细操作,请参见 VKE 集群中使用 RDMA 资源。​
注意​
  • RDMA 的 exclusive(独占)、shared(共享)、shared-multi(1:N 共享)3 种模式中只有 shared 模式才能支持 RDMA 拓扑信息上报。​
  • 您可以通过开启或关闭节点池的 节点标签及污点自动更新 功能,控制是否同步标签到节点池中的存量节点中。关闭该功能时,可能导致集群无法使用节点池中的存量 RDMA 节点资源,请谨慎配置。​
​alt​​
步骤二:确保集群中安装依赖的组件​
RDMA 拓扑感知调度依赖集群中的 scheduler-plugin、rdma-device-plugin、katalyst 三个组件,须确保已安装该三个组件。详细操作,请参见 安装组件。​
  • scheduler-plugin​
  • 安装该组件且需要开启 RDMA 拓扑感知调度 开关。​
  • ​alt​​
  • rdma-device-plugin​
  • 该组件直接安装即可,无配置操作。​
  • katalyst​
  • 安装该组件且需要开启 拓扑感知调度 特性开关。​
  • ​alt​​
步骤三:配置需要感知 RDMA 拓扑的节点​
更改节点 kubelet 参数​
注意​
  • 仅 Kubernetes v1.24 和 v1.26 版本集群中需要配置 kubelet 自定义参数,v1.28 及以上集群无需配置。​
  • 创建集群时新增的节点、创建节点池时新增的节点、已有节点池新增的节点、已有节点池存量的节点均可以配置 kubelet 参数。详细的操作说明,请参见 配置节点池 kubelet 参数。​
在需要感知 RDMA 拓扑的节点 kubelet 参数中添加参数,以开启对应的特性门控(Feature Gate)。​
VKE 支持通过控制台配置节点所在节点池的 kubelet 参数,在节点池的 高级配置 中添加 kubelet 自定义参数:feature-gates: QoSResourceManager=true。​
​alt​​
为节点添加指定 Label​
为节点配置启用 RDMA 拓扑感知的 Label,其中 Key 为vke.node.katalyst.deploy,Value 为true。​
​alt​​
步骤四:查询 RDMA 拓扑信息​
完成上述三个步骤后,RDMA 拓扑信息都记录在 Kubernetes 自定义资源 CustomNodeResource 中(简称 KCNR)。​
  1. 使用 kubectl 连接集群。详情请参见 连接集群。​
  1. 执行以下命令,查询集群中 RDMA 拓扑感知节点的 KCNR。​
  • 其中,将<node-name>替换为您的节点名称。​
  • ​
    kubectl get kcnr <node-name> -oyaml​
    ​
  1. 在获取到的 KCNR 中查询以下带有注释的字段,查看该节点的 RDMA 拓扑和资源余量信息。​
  • ​
    apiVersion: node.katalyst.kubewharf.io/v1alpha1​
    kind: CustomNodeResource​
    metadata:​
    name: 10.27.0.4 # Node Name​
    # spec 中描述了节点中所有的 RDMA 网卡 ID 和对应连接的 S0 交换机信息。​
    spec:​
    nodeResourceProperties: # nodeResourceProperties 中包含本节点的所有 RDMA 网卡信息,包括网卡的 ID 和连接的交换机 Hash。​
    - propertyName: RDMATOR/0000:1a:00.0 # RDMA 的 ID。​
    propertyValues:​
    - b6f73fb8fb523a512a30edf3c73b7ab******** # RDMA 所连接的 S0 交换机的 Hash,可以唯一标识一个 S0。​
    - propertyName: RDMATOR/0000:3f:00.0​
    propertyValues:​
    - b6f73fb8fb523a512a30edf3c73b7ab********​
    - propertyName: RDMATOR/0000:d1:00.0​
    propertyValues:​
    - 985abf31e6b7bd2aef8dfe551406912********​
    - propertyName: RDMATOR/0000:e7:00.0​
    propertyValues:​
    - 985abf31e6b7bd2aef8dfe551406912********​
    # status 中描述了节点各个 RDMA 网卡对应的可分配资源信息,用于判断该网卡是否已经被 Pod 占用。​
    # 节点资源通过树状结构描述,最上层为 socket zone,socket zone 中包含多个 numa zone,numa zone 中包含多块 RDMA 网卡。​
    status:​
    topologyPolicy: SingleNUMANodeContainerLevel​
    topologyZone:​
    # socket zone​
    - name: "0"​
    type: Socket​
    resources: {}​
    children:​
    # numa zone​
    - name: "0"​
    type: Numa​
    resources:​
    allocatable:​
    cpu: "61"​
    nvidia.com/gpu: "4"​
    vke.volcengine.com/rdma: "2"​
    capacity:​
    cpu: "64"​
    nvidia.com/gpu: "4"​
    vke.volcengine.com/rdma: "2"​
    allocations:​
    - consumer: test-rdma-metrics/test-rdma-host-57bezr9pt-76b4cbf99c-bm7k8/667e2f44-e5ec-496f-81c0-0794********​
    requests:​
    vke.volcengine.com/rdma: "1"​
    children:​
    # 该 numa zone 中的 RDMA 网卡信息。​
    # 每个 name 对应一块 RDMA 网卡,其中 allocatable 表示可分配的 RDMA 资源,capacity 表示总共的 RDMA 资源。​
    - name: 0000:1a:00.0​
    type: NIC​
    resources:​
    allocatable:​
    vke.volcengine.com/rdma: "1"​
    capacity:​
    vke.volcengine.com/rdma: "1"​
    # 分配在该 RDMA 网卡上的 Pod 信息。​
    allocations:​
    # 格式为:Pod 所属命名空间/Pod 名称/Pod uid​
    - consumer: test-rdma-metrics/test-rdma-host-57bezr9pt-76b4cbf99c-bm7k8/667e2f44-e5ec-496f-81c0-0794********​
    # 该 Pod 在该 RDMA 网卡上分配的资源量。​
    requests:​
    vke.volcengine.com/rdma: "1"​
    - name: 0000:3f:00.0​
    type: NIC​
    resources:​
    allocatable:​
    vke.volcengine.com/rdma: "1"​
    capacity:​
    vke.volcengine.com/rdma: "1"​
    - name: "1"​
    type: Socket​
    resources: {}​
    children:​
    - name: "1"​
    type: Numa​
    resources:​
    allocatable:​
    cpu: "64"​
    nvidia.com/gpu: "4"​
    vke.volcengine.com/rdma: "2"​
    capacity:​
    cpu: "64"​
    nvidia.com/gpu: "4"​
    vke.volcengine.com/rdma: "2"​
    allocations:​
    - consumer: default/test-rdma-fc69fc8b-qv6s8/d981a1f8-ea64-440c-9155-3bab********​
    requests:​
    vke.volcengine.com/rdma: "2"​
    children:​
    - name: 0000:d1:00.0​
    type: NIC​
    resources:​
    allocatable:​
    vke.volcengine.com/rdma: "1"​
    capacity:​
    vke.volcengine.com/rdma: "1"​
    allocations:​
    - consumer: default/test-rdma-fc69fc8b-qv6s8/d981a1f8-ea64-440c-9155-3bab********​
    requests:​
    vke.volcengine.com/rdma: "1"​
    - name: 0000:e7:00.0​
    type: NIC​
    resources:​
    allocatable:​
    vke.volcengine.com/rdma: "1"​
    capacity:​
    vke.volcengine.com/rdma: "1"​
    allocations:​
    - consumer: default/test-rdma-fc69fc8b-qv6s8/d981a1f8-ea64-440c-9155-3bab********​
    requests:​
    vke.volcengine.com/rdma: "1" ​
    ​
​
最近更新时间:2025.09.09 20:31:04
这个页面对您有帮助吗?
有用
有用
无用
无用