在ACK集群上使用eRDMA

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

操作步骤

步骤一:创建节点池

eRDMA的节点需要特殊的配置,您需要使用独立的节点池来配置。

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

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

  3. 节点池页面,单击右上角的创建节点池

    下表介绍主要配置项。关于其他配置项的详细信息,请参见创建节点池

    配置项

    说明

    操作系统

    配置为Alibaba Cloud Linux 3.x。

    期望节点数

    配置节点数量为0,后续手动添加节点。

    (建议)CPU Policy

    单击显示高级选项,选择Static启用CPU管理策略。

步骤二:添加eRDMA节点

配置eRDMA机器

不同机型物理网卡的配额不同,从而eRDMA的配额、带宽和配置方式也不一样。

机型的物理网卡配额可以通过实例规格族文档中找到,绝大多数机型无特殊标识的只有一张物理网卡。配置方式如下。

单物理网卡机型

  1. 创建ECS实例。

    1. 登录云服务器控制台,在左侧导航栏选择概览

    2. 概览页面,单击创建实例

      下表介绍主要配置项。关于其他配置项的详细信息,请参见云服务器ECS快速入门

      配置项

      说明

      网络及可用区

      需要选择ACK集群所在的专有网络。

      实例

      需要选择支持eRDMA的实例规格族。更多信息,请参见实例规格族

      弹性网卡

      选中弹性RDMA接口。

多物理网卡机型

  1. 创建ECS实例。

    1. 登录云服务器控制台,在左侧导航栏选择概览

    2. 概览页面,单击创建实例

      下表介绍主要配置项。关于其他配置项的详细信息,请参见云服务器ECS快速入门

      配置项

      说明

      网络及可用区

      需要选择ACK集群所在的专有网络。

      实例

      需要选择支持eRDMA的多物理网卡实例规格族。更多信息,请参见实例规格族

  2. 为节点额外创建和绑定多张eRDMA网卡。

    1. 创建节点支持的物理网卡数量的eRDMA网卡,创建时勾选增加弹性RDMA接口选项。具体操作,请参见创建辅助弹性网卡

    2. 绑定创建的多个eRDMA网卡到eRDMA的每个节点上,具体操作,请参见绑定辅助弹性网卡

  3. 如果集群为Terway网络,需要配置Terway的网卡白名单,避免Terway组件修改eRDMA的网卡。配置方式,请参见为弹性网卡(ENI)配置白名单

将eRDMA机器加入节点池

  1. 将创建的ECS实例添加到节点池中。

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

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

    3. 节点池页面,单击目标节点池右侧操作列下的更多,然后单击添加已有节点

    4. 选择已有云服务器实例配置项页面,选择手动添加已有云服务器实例。具体操作,请参见手动添加节点

  2. 在每个节点上安装最新版本的eRDMA驱动。

    • ECS实例(企业级x86规格)上配置eRDMA的方法,请参见在企业级实例上配置eRDMA

    • GPU实例上配置eRDMA的方法,请参见在GPU实例上配置eRDMA

    • 当运行tensorflow等RDMA带外建联的程序时,安装eRDMA驱动需配置为compat模式:

      rmmod erdma
      insmod /var/lib/dkms/erdma/1.0.1/`uname -r`/x86_64/module/erdma.ko compat_mode=1

步骤三:运行应用

  1. 在Dockerfile中增加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 -y ethtool groff-base hwdata libnl3 pciutils
    sudo yum install libibverbs rdma-core librdmacm libibverbs-utils -y --disablerepo=* --enablerepo="erdma"                        
  2. 设置应用运行模式。

    您需要对Pod的相关参数进行设置。

  3. 使用如下YAML部署Tensorflow示例应用。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: netperf
      name: netperf
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: netperf
      template:
        metadata:
          labels:
            app: netperf
        spec:
          hostNetwork: true
          containers:
          - command:
            - bash
            - -c
            - sleep 360000
            image: registry-vpc.cn-beijing.aliyuncs.com/wangbs/tftest
            imagePullPolicy: Always
            name: netperf
            resources:
              limits:
                cpu: "10"
              requests:
                cpu: "10"
            securityContext:
              privileged: true
  4. 运行应用并进行测试。

    1. 执行如下命令,并记录Pod的IP地址。

      kubectl get pod -o wide

      预期输出:记录IP

    2. 创建两个进程,其中一个为PS,一个为Worker。将记录的IP填写到命令行参数中。

      PS:PSWorker:Worker预期输出如下,您可以看到Tensorflow示例应用的计算速度。

      # Worker
      CUDA_VISIBLE_DEVICES= python benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py \
        --ps_hosts=172.18.XX.XX:9100\
        --worker_hosts=172.18.XX.XX:9200 \
        --job_name=worker \
        --task_index=0 \
        --server_protocol=grpc+verbs \
        --variable_update=parameter_server \
        --local_parameter_device=cpu \
        --model=resnet50 \
        --device=cpu \
        --batch_size=16 \
        --data_format=NHWC
      
      # PS
      CUDA_VISIBLE_DEVICES= python benchmarks/scripts/tf_cnn_benchmarks/tf_cnn_benchmarks.py \
        --ps_hosts=172.18.XX.XX:9100\
        --worker_hosts=172.18.XX.XX:9200 \
        --job_name=ps \
        --local_parameter_device=cpu \
        --task_index=0 \
        --device=cpu \
        --data_format=NHWC \
        --server_protocol=grpc+verbs