在大规模的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上完成分布式训练和推理。
支持RDMA的GPU型号列表
ACS支持多种GPU型号,目前支持高性能网络RDMA的GPU型号以及使用约束如下。
卡型 | compute-class | 支持RDMA约束 | 对应的RDMA网卡类型 |
GU8TF | gpu | 仅8卡Pod支持RDMA | 类型1 |
GU8TEF | gpu | 仅8卡Pod支持RDMA | 类型1 |
GX8SF | gpu | 仅8卡Pod支持RDMA | 类型1 |
P16EN | gpu | 仅16卡Pod支持RDMA | 类型2 |
gpu-hpn | 1/2/4/8/16卡Pod支持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应用。
使用以下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
部署应用。
kubectl apply -f dep-demo-hpn-gpu.yaml
等待应用Pod状态变为
Running
。kubectl get pod |grep dep-demo-hpn-gpu
预期输出:
dep-demo-hpn-gpu-5d9xxxxxb6-xxxxx 1/1 Running 0 25m16s
查看高性能网络网卡信息。
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
。