在大規模的AI計算應用中,需要考慮任務間的通訊效率,以充分發揮GPU算力的效能。阿里雲Container Compute Service (ACS)提供了低延遲、大吞吐、高彈性的高效能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=INFORDMA網卡類型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。