在ACK集群中使用eRDMA加速容器网络

更新时间:
复制 MD 格式

弹性RDMA(Elastic Remote Direct Memory Access,简称eRDMA)是阿里云提供的低延迟、大吞吐、高弹性的高性能RDMA网络服务。eRDMA基于第四代神龙系统架构和云上VPC网络,100%兼容RDMA生态,提供超大规模网络部署的ECS普惠RDMA服务。本文介绍如何在ACK集群中配置和使用eRDMA,包括CPU节点和GPU节点场景。

适用范围

  • 集群版本:

    • CPU节点:1.20及以上。

    • GPU节点:1.26及以上。

  • 实例规格:eRDMA仅支持部分实例规格,请参见在企业级实例上启用eRDMA查看支持的实例规格列表。

步骤一:配置Terway白名单

如果集群网络插件为Terway,请为弹性网卡(ENI)配置白名单,避免Terway组件修改eRDMA的网卡。

步骤二:添加支持eRDMA的节点至ACK集群

新建节点

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

  3. 参见创建和管理节点池,通过节点池新建节点。新建节点的规格需要支持eRDMA(请参见适用范围),同时应选择以下镜像或基于以下镜像的自定义镜像:

    1. CPU节点:

      1. Alibaba Cloud Linux 3(所有版本)

      2. Alibaba Cloud Linux 4(所有版本)

      3. Ubuntu 24.04

    2. GPU节点:请在云市场镜像中选择已经预安装eRDMA驱动的镜像,例如:

      1. Alibaba Cloud Linux 3 64位(预装eRDMA软件栈)

添加已有节点

如果您已有支持eRDMAECS实例,可以将其手动添加到ACK集群中。

重要

GPU节点必须安装eRDMA驱动才可添加到集群,有两种方式进行安装:

  • 通过OS镜像预安装(推荐):节点已使用阿里云提供的预装eRDMA软件栈的OS镜像,例如云市场镜像中的Alibaba Cloud Linux 3 64位(预装eRDMA软件栈)

  • 手动安装:参见GPU实例上启用eRDMA在实例上手动安装eRDMA软件栈。在节点加入集群后,请确认eRDMA驱动和网卡配置正常。

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

  3. 参见添加已有节点,将已有节点添加到节点池。已有节点的规格需要支持eRDMA(请参见适用范围)。

步骤三:安装ACK eRDMA Controller组件

说明

当节点存在多张网卡时,ACK eRDMA Controller 为附加的eRDMA网卡配置路由时,采用比同网段网卡路由更低的优先级,默认采用200的路由优先级,如果您在安装ACK eRDMA Controller后需要手动配置网卡,注意避免路由冲突。

  1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,单击组件管理

  2. 组件管理页面,单击安装组件,参照下方配置安装ACK eRDMA Controller组件。

    配置项

    说明

    preferDriver

    选择节点上使用的eRDMA驱动类型。

    • default:默认驱动模式。

    • compat:兼容RoCE驱动模式,适用于OOB建链场景。

    • ofedOFED驱动模式,适用于GPU机型。

    关于驱动类型的详细说明,请参见启用eRDMA

    是否为Pod分配节点全部eRDMA设备

    • 勾选:为Pod分配节点上所有的eRDMA设备。

    • 不勾选:Pod根据NUMA拓扑分配一个eRDMA设备。节点需要开启CPU Static Policy才能保证Pod和设备的固定NUMA分配。关于如何配置CPU Policy,请参见创建和管理节点池

  3. 安装完成后,在左侧导航栏,单击工作负载 > 容器组,选择ack-erdma-controller命名空间,查看Pod运行状态,确认组件运行正常。

步骤四:使用eRDMA加速容器网络

安装ACK eRDMA Controller组件后,在容器资源中通过aliyun/erdma配置项申请资源,即可开启eRDMA加速。

apiVersion: apps/v1
kind: Deployment
metadata:
  ...
spec:
  ...
  template:
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        resources:
          limits:
            aliyun/erdma: 1 # 启动eRDMA
        ports:
        - containerPort: 80

分配后,您可以在Pod中查看分配到的RDMA设备。

/# ls /dev/infiniband/
rdma_cm  uverbs0
preferDriver 配置为 ofed(适用于 GPU 机型)时,Pod 的 /dev/infiniband/ 目录下可能不包含 rdma_cm 设备,仅显示 uverbs0 等设备。这是正常现象,因为 GPU 场景下 NCCL 等通信框架不依赖 rdma_cm,不影响 eRDMA 加速功能的使用。

场景示例:GPU机型使用eRDMA加速NCCL通信

  1. 参考步骤二:添加支持eRDMA的节点至ACK集群,在节点池中添加GPU节点,OS镜像选择Alibaba Cloud Linux 3 64位(预装eRDMA软件栈)

  2. 参考步骤三:安装ACK eRDMA Controller组件,配置preferDrivercompat,用于NCCL类型的通信。

  3. 在应用容器镜像构建时安装eRDMA相关包。

    展开查看构建镜像安装erdma相关包

    # Debian或者Ubuntu: 注意sources.list中的OS名和版本与实际使用的版本设置为一致。
    wget -qO - https://mirrors.aliyun.com/erdma/GPGKEY | apt-key add - \
      && echo "deb [ arch=amd64 ] https://mirrors.aliyun.com/erdma/apt/{OS|ubuntu} {Version|focal}/erdma main" \
      | tee /etc/apt/sources.list.d/erdma.list \
      && apt update \
      && apt install -y libibverbs1 ibverbs-providers ibverbs-utils librdmacm1
    
    # Alibaba Cloud Linux或者RHEL:按照OS找到对应的repo目录,配置到yum.repos.d目录中。
    cat > /etc/yum.repos.d/erdma.repo <<EOF
    [erdma]
    name = ERDMA Repository
    baseurl = http://mirrors.aliyun.com/erdma/yum/redhat/7/erdma/x86_64/
    gpgcheck = 0
    enabled = 1
    EOF
    yum install --disablerepo=*  --enablerepo erdma -y libibverbs ibverbs-providers ibverbs-utils librdmacm
  4. 在集群中运行使用eRDMAGPU应用,以nccl-test为例。

    展开查看使用eRDMAGPU应用示例模板

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: nccltest
    spec:
      selector:
        matchLabels:
          app: nccltest
      serviceName: "nccltest"
      replicas: 2
      template:
        metadata:
          labels:
            app: nccltest
        spec:
          hostNetwork: true 
          dnsPolicy: ClusterFirstWithHostNet
          containers:
          - env:
            - name: NCCL_SOCKET_IFNAME
              value: "eth0"
            - name: NCCL_DEBUG
              value: "INFO"
            - name: NCCL_IB_GID_INDEX
              value: "1"
            image: <nccl-test-image-with-erdma>
            imagePullPolicy: Always
            name: nccltest
            securityContext:
              capabilities:
                add:
                - SYS_RESOURCE
                - IPC_LOCK
            resources:
              limits:
                nvidia.com/gpu: "8"
                aliyun/erdma: "1"
              requests:
                nvidia.com/gpu: "8"
                aliyun/erdma: "1"
  5. 验证NCCL使用了eRDMA加速。

    您可以在应用日志中查看NCCL使用的通讯类型和使用的网卡数量。

    image

    预期输出表明,已使用erdma_0erdma_1eRDMA设备进行了加速。