使用高性能网络RDMA运行应用

在大规模的AI计算应用中,需要考虑任务间的通信效率,以充分发挥GPU算力的性能。阿里云容器计算服务 ACS(Container Compute Service)提供了低延迟、大吞吐、高弹性的高性能RDMA(Remote Direct Memory Access)网络服务。本文为您介绍如何使用高性能网络RDMA运行应用。

功能简介

传统的TCP/IP协议一直是业界主流的网络通信协议,许多应用都是基于此构建的。然而,随着AI相关业务的蓬勃发展,应用对网络性能的需求日益增加。受限于TCP/IP的一些局限性,如拷贝开销大、协议栈处理复杂、流量控制算法复杂以及频繁的上下文切换等,TCP/IP的网络通信性能已成为应用性能提升的瓶颈。

RDMA针对这些问题提供了解决方案。与TCP/IP相比,RDMA实现了零拷贝和内核旁路等特性,避免了数据拷贝和频繁的上下文切换,从而实现了更低的延迟、更高的吞吐量和更低的CPU占用。

ACS支持为Pod添加alibabacloud.com/hpn-type: "rdma"的标签,让应用运行在RDMA网络中。启用RDMA网络后,用户在容器中能够看到对应的RDMA网卡。结合NCCL环境变量配置,即可以在ACS上完成分布式训练和推理。

支持RDMAGPU型号列表

ACS支持多种GPU型号,目前支持高性能网络RDMAGPU型号以及使用约束如下。

卡型

compute-class

支持RDMA约束

对应的RDMA网卡类型

GU8TF

gpu

8Pod支持RDMA

类型1

GU8TEF

gpu

8Pod支持RDMA

类型1

GX8SF

gpu

8Pod支持RDMA

类型1

P16EN

gpu

16Pod支持RDMA

类型2

gpu-hpn

1/2/4/8/16Pod支持RDMA

不同的RDMA网卡类型在NCCL环境变量的配置上会有所差异,下文展开。

NCCL配置说明

不同的GPU卡型在ACS上对应的RDMA网卡存在差异,这些差异最终会体现到NCCL相关的配置上,当前ACS GPU提供的算力中有两种配置方式。

RDMA网卡类型1(GU8TF/GU8TEF/GX8SF

export NCCL_SOCKET_IFNAME=eth0 
export NCCL_IB_HCA=mlx5
export NCCL_DEBUG=INFO

RDMA网卡类型2(P16EN

export NCCL_IB_DISABLE=1 
export NCCL_SOCKET_IFNAME=eth0 
export NCCL_IB_HCA= 
export NCCL_DEBUG=INFO

环境变量说明

环境变量

环境变量说明

NCCL_SOCKET_IFNAME

NCCL选择建联的端口,ACS上推荐使用eth0建立连接。

NCCL_IB_DISABLE

配置NCCL是否要关闭IB/RoCE网络的使用,而改为使用IP Socket,配置为1的时候代表关闭,P16EN必须配置为1。

NCCL_IB_HCA

指定RDMA通信的网卡,P16EN必须配置为空。

NCCL_DEBUG

控制NCCL调试信息日志的输出等级。

其他未特别说明的环境变量参见NCCL官方文档

使用方式

以下将在ACS集群中部署一个使用RDMA运行的GPU应用。

  1. 使用以下YAML内容,创建dep-demo-hpn-gpu.yaml文件。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dep-demo-hpn-gpu
      labels:
        app: demo-hpn-gpu
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: demo-hpn-gpu
      template:
        metadata:
          labels:
            app: demo-hpn-gpu
            alibabacloud.com/compute-class: gpu
            alibabacloud.com/compute-qos: default
            # 指定GPU型号为GU8TF,请按实际情况填写
            alibabacloud.com/gpu-model-series: "GU8TF"        
            alibabacloud.com/hpn-type: "rdma"
        spec:
          containers:
          - name: demo
            image: registry-cn-wulanchabu.ack.aliyuncs.com/acs/stress:v1.0.4
            command:
            - "sleep"
            - "1000h"
            env:
            - name: NCCL_SOCKET_IFNAME
              value: "eth0"
            - name: NCCL_IB_HCA
              value: "mlx5"
            - name: NCCL_DEBUG
              value: "INFO"
            resources:
              requests:
                cpu: 128
                memory: 512Gi
                nvidia.com/gpu: 8
              limits:
                cpu: 128
                memory: 512Gi
                nvidia.com/gpu: 8
  2. 部署应用。

    kubectl apply -f dep-demo-hpn-gpu.yaml
  3. 等待应用Pod状态变为Running

    kubectl get pod |grep dep-demo-hpn-gpu

    预期输出:

    dep-demo-hpn-gpu-5d9xxxxxb6-xxxxx   1/1     Running   0          25m16s
  4. 查看高性能网络网卡信息。

    kubectl exec -it deploy/dep-demo-hpn-gpu -- ifconfig | grep hpn -A 8 

    预期输出:

    hpn0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx  
              inet6 addr: xxxx::x:xxxx:xxxx:xxx/xx Scope:Link
              inet6 addr: xxxx:xxx:xxx:x:x:xxxx:x:xxx/xxx Scope:Global
              UP BROADCAST RUNNING MULTICAST  MTU:xxxx  Metric:1
              RX packets:0 errors:0 dropped:0 overruns:0 frame:0
              TX packets:xx errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:0 (0.0 B)  TX bytes:x (892.0 B)

    可以看到,Pod中已经配置了高性能网卡hpn0