You need to enable JavaScript to run this app.
导航
RDMA 拓扑感知调度
最近更新时间:2024.11.04 20:21:23首次发布时间:2024.04.24 18:42:54

本文主要介绍使用 RDMA 拓扑感知调度的方法以及使用限制等。

说明

邀测·申请试用】:该功能目前处于邀测阶段,如需使用,请提交申请。

背景信息

在大模型训练等 AI 场景中,经常会出现一个 Job 中的多个 Pod 并行执行训练任务的情况,这些 Pod 在运行过程中需要频繁地相互交换参数、梯度值等数据。为了保障网络通讯开销不成为训练任务的性能瓶颈,通常使用 RDMA 网络在 GPU 之间直接传输数据。而在数据中心当中,一台交换机可以连接的 RDMA 网络设备有限,通常需要 S0 S1 两级交换机连接一个 miniPod 中的所有服务器。这样的网络拓扑结构,会导致不同 RDMA 网卡之间的通讯距离不一样,因此不同的 GPU 设备之间的通讯性能也会有差异。

针对上述情况,火山引擎容器服务提供 RDMA 拓扑感知调度能力,通过对 GPU 卡和 RDMA 设备的网络拓扑信息的感知,调度器能够将同一个 Job 中的所有 Pod 调度到 RDMA 网络中拓扑距离尽可能接近的节点和 RDMA 网卡上,进而帮助用户充分发挥 RDMA 网络的通信能力,提升 AI 大模型训练性能。

使用限制

项目要求补充说明

集群版本

  • 集群版本不满足要求时,请升级集群到要求版本。详细操作,请参见 升级集群
  • Kubernetes v1.28 版本集群暂不支持使用该功能,将在后续提供支持。
集群网络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 参数

在需要感知 RDMA 拓扑的节点 kubelet 参数中添加参数,以开启对应的特性门控(Feature Gate)。

容器服务支持通过控制台配置节点所在节点池的 kubelet 参数,在节点池的 高级配置 中添加 kubelet 自定义参数:feature-gates: QoSResourceManager=true

说明

创建集群时新增的节点、创建节点池时新增的节点、已有节点池新增的节点、已有节点池存量的节点均可以配置 kubelet 参数。详细的操作说明,请参见 配置节点池 kubelet 参数

alt

为节点添加指定 Label

为节点配置启用 RDMA 拓扑感知的 Label,其中 Key 为vke.node.katalyst.deploy,Value 为true
alt

步骤四:查询 RDMA 拓扑信息

完成上述三个步骤后,RDMA 拓扑信息都记录在 Kubernetes 自定义资源 CustomNodeResource 中(简称 KCNR)。

  1. 使用 kubectl 连接集群。详情请参见 连接集群
  2. 执行以下命令,查询集群中 RDMA 拓扑感知节点的 KCNR。
    其中,将<node-name>替换为您的节点名称。
    kubectl get kcnr <node-name> -oyaml
    
  3. 在获取到的 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"