
topologyManagerPolicy: best-effort),以实现 NUMA 亲和调度。

feature.node.kubernetes.io/tke-shared-rdma=true:

# <nodeName> 替换成存量节点的名称,通过 kubectl get node 可查询kubectl label node <nodeName> feature.node.kubernetes.io/tke-shared-rdma=true

参数配置项 | 描述 |
CpuRequest | 组件在每个节点上运行时需要占用的 CPU,默认为 10m。 |
CpuLimit | 组件在每个节点上运行时最大占用的 CPU,默认为 50m。 |
MemoryRequest | 组件在每个节点上运行时需要占用的内存,默认为 100Mi。 |
MemoryLimit | 组件在每个节点上运行时最大占用的内存,默认为 500Mi。 |
KubeletRootDir | 组件运行所在节点的 kubelet 的根目录,默认为 /var/lib/kubelet,根目录修改时需同步修改组件的这个配置。 |
NodeSelector | 组件所需运行节点的 label 键值对,默认配置是 feature.node.kubernetes.io/tke-shared-rdma=true,若需自定义部署的节点 label,则需要修改这个配置。 |
tke-rdma-shared-agent 皆为 Running:kubectl -n kube-system get po -o wide -l k8s-app=tke-rdma-shared-agent
tke.cloud.tencent.com/tke-shared-rdma 不为 0:kubectl describe node <nodeName> | grep tke-shared-rdma
tke.cloud.tencent.com/tke-shared-rdma: 8
annotations:tke.cloud.tencent.com/networks: "tke-bridge,tke-rdma-macvlan"
annotations:tke.cloud.tencent.com/networks: "tke-route-eni,tke-rdma-macvlan"
kubectl -n kube-system get cm tke-cni-agent-conf -o yaml | grep defaultDelegates
securityContext:capabilities:add: ["IPC_LOCK"]
resources:limits:nvidia.com/gpu: "8"tke.cloud.tencent.com/tke-shared-rdma: "8"
nvidia.com/gpu: 请求的 GPU 数量。tke.cloud.tencent.com/tke-shared-rdma: 请求的 RDMA 设备数量,推荐与 GPU 数量相等。apiVersion: apps/v1kind: StatefulSetmetadata:labels:k8s-app: ibv-appname: ibv-appnamespace: defaultspec:replicas: 4selector:matchLabels:k8s-app: ibv-appqcloud-app: ibv-appserviceName: ""template:metadata:annotations:tke.cloud.tencent.com/networks: "tke-route-eni,tke-rdma-macvlan"creationTimestamp: nulllabels:k8s-app: ibv-appqcloud-app: ibv-appspec:containers:- command:- sh- -c- |ls -l /dev/infiniband /sys/class/infiniband /sys/class/netsleep 1000000image: ccr.ccs.tencentyun.com/tke-eni-test/mofed-5.4-3.1.0.0:ubuntu20.04-amd64-testimagePullPolicy: Alwaysname: ibv-app-ctrsecurityContext:capabilities:add: ["IPC_LOCK"]resources:limits:nvidia.com/gpu: "4"tke.cloud.tencent.com/tke-shared-rdma: "4"volumeMounts:- mountPath: /dev/shmname: dshmvolumes:- emptyDir:medium: MemorysizeLimit: 64Giname: dshm
rdma-test.yaml),然后部署:kubectl apply -f rdma-test.yaml
kubectl get pods -l k8s-app=ibv-app
kubectl exec -it ibv-app-0 -- bash
ibv_devinfo 命令确认 RDMA 设备功能正常:# ibv_devinfohca_id: mlx5_bond_0transport: InfiniBand (0)fw_ver: 22.33.1048node_guid: 946d:ae03:00a9:3ed0sys_image_guid: 946d:ae03:00a9:3ed0vendor_id: 0x02c9vendor_part_id: 4125hw_ver: 0x0board_id: MT_0000000359phys_port_cnt: 1port: 1state: PORT_ACTIVE (4)max_mtu: 4096 (5)active_mtu: 4096 (5)sm_lid: 0port_lid: 0port_lmc: 0x00link_layer: Ethernet
show_gids 命令获取 gid,在 TKE RDMA 方案下,GID index 统一为 Host GID Index:# show_gidsDEV PORT INDEX GID IPv4 VER DEV--- ---- ----- --- ------------ --- ---mlx5_bond_0 1 0 fe80:0000:0000:0000:401d:55ff:fe14:6ce8 v1 bond0mlx5_bond_0 1 1 fe80:0000:0000:0000:401d:55ff:fe14:6ce8 v2 bond0mlx5_bond_0 1 2 0000:0000:0000:0000:0000:ffff:1e3d:b4ac 30.61.180.172 v1 bond0mlx5_bond_0 1 3 0000:0000:0000:0000:0000:ffff:1e3d:b4ac 30.61.180.172 v2 bond0
ibv_rc_pingpong 命令测试 RDMA 连通性:# ibv_rc_pingpong -d mlx5_bond_0 -g 3local address: LID 0x0000, QPN 0x003a22, PSN 0xc882ae, GID ::ffff:30.61.130.20remote address: LID 0x0000, QPN 0x001234, PSN 0x58320b, GID ::ffff:30.61.180.1728192000 bytes in 0.01 seconds = 7687.51 Mbit/sec1000 iters in 0.01 seconds = 8.52 usec/iter
# ibv_rc_pingpong -d mlx5_bond_0 -g 3 30.61.130.20local address: LID 0x0000, QPN 0x001234, PSN 0x58320b, GID ::ffff:30.61.180.172remote address: LID 0x0000, QPN 0x003a22, PSN 0xc882ae, GID ::ffff:30.61.130.208192000 bytes in 0.01 seconds = 7924.55 Mbit/sec1000 iters in 0.01 seconds = 8.27 usec/iter
ib_write_bw 命令测试 RDMA 写带宽:# ib_write_bw -d mlx5_bond_0 -x 3************************************* Waiting for client to connect... *************************************---------------------------------------------------------------------------------------RDMA_Write BW TestDual-port : OFF Device : mlx5_bond_0Number of qps : 1 Transport type : IBConnection type : RC Using SRQ : OFFCQ Moderation : 100Mtu : 4096[B]Link type : EthernetGID index : 3Max inline data : 0[B]rdma_cm QPs : OFFData ex. method : Ethernet---------------------------------------------------------------------------------------local address: LID 0000 QPN 0x3a25 PSN 0x8877cd RKey 0x00ca88 VAddr 0x007fb84630d000GID: 00:00:00:00:00:00:00:00:00:00:255:255:30:61:130:20remote address: LID 0000 QPN 0x1235 PSN 0xe2acbc RKey 0x007c3e VAddr 0x007f8f164b7000GID: 00:00:00:00:00:00:00:00:00:00:255:255:30:61:180:172---------------------------------------------------------------------------------------#bytes #iterations BW peak[MB/sec] BW average[MB/sec] MsgRate[Mpps]65536 5000 97.50 97.49 0.185950---------------------------------------------------------------------------------------
# ib_write_bw -d mlx5_bond_0 -x 3 30.61.130.20 --report_gbits---------------------------------------------------------------------------------------RDMA_Write BW TestDual-port : OFF Device : mlx5_bond_0Number of qps : 1 Transport type : IBConnection type : RC Using SRQ : OFFTX depth : 128CQ Moderation : 100Mtu : 4096[B]Link type : EthernetGID index : 3Max inline data : 0[B]rdma_cm QPs : OFFData ex. method : Ethernet---------------------------------------------------------------------------------------local address: LID 0000 QPN 0x1235 PSN 0xe2acbc RKey 0x007c3e VAddr 0x007f8f164b7000GID: 00:00:00:00:00:00:00:00:00:00:255:255:30:61:180:172remote address: LID 0000 QPN 0x3a25 PSN 0x8877cd RKey 0x00ca88 VAddr 0x007fb84630d000GID: 00:00:00:00:00:00:00:00:00:00:255:255:30:61:130:20---------------------------------------------------------------------------------------#bytes #iterations BW peak[Gb/sec] BW average[Gb/sec] MsgRate[Mpps]65536 5000 97.50 97.49 0.185950---------------------------------------------------------------------------------------
ib_write_lat -d mlx5_bond_0 -x 3
ib_write_lat -d mlx5_bond_0 -x 3 <server-ip>
ib_send_bw -d mlx5_bond_0 -x 3
ib_send_bw -d mlx5_bond_0 -x 3 <server-ip> --report_gbits
ib_send_lat -d mlx5_bond_0 -x 3
ib_send_lat -d mlx5_bond_0 -x 3 <server-ip>
ib_read_bw -d mlx5_bond_0 -x 3
ib_read_bw -d mlx5_bond_0 -x 3 <server-ip> --report_gbits
ib_read_lat -d mlx5_bond_0 -x 3
ib_read_lat -d mlx5_bond_0 -x 3 <server-ip>
apiVersion: apps/v1kind: StatefulSetmetadata:labels:k8s-app: nccl-testname: nccl-testnamespace: defaultspec:replicas: 2selector:matchLabels:k8s-app: nccl-testqcloud-app: nccl-testserviceName: ""template:metadata:annotations:tke.cloud.tencent.com/networks: "tke-route-eni,tke-rdma-macvlan"creationTimestamp: nulllabels:k8s-app: nccl-testqcloud-app: nccl-testspec:containers:- command:- sh- -c- |ls -l /dev/infiniband /sys/class/infiniband /sys/class/netsleep 1000000image: ccr.ccs.tencentyun.com/qcloud-ti-platform/nccl_ofed:cu12.0imagePullPolicy: IfNotPresentname: nccl-testsecurityContext:capabilities:add: ["IPC_LOCK"]resources:limits:nvidia.com/gpu: "8"tke.cloud.tencent.com/tke-shared-rdma: "8"volumeMounts:- mountPath: /dev/shmname: dshmvolumes:- emptyDir:medium: MemorysizeLimit: 64Giname: dshm
nccl-test.yaml),然后部署:kubectl apply -f nccl-test.yaml
kubectl get pods -l k8s-app=nccl-test
# 生成密钥ssh-keygen# 查看公钥cat ~/.ssh/id_rsa.pub
# 创建 sshd 运行目录mkdir -p /run/sshd# 启动 sshd/usr/sbin/sshd# 创建 .ssh 目录mkdir -p ~/.ssh# 将 nccl-test-0 的公钥添加到 authorized_keys# <id_rsa.pub> 为 nccl-test-0 Pod 里 /root/.ssh/id_rsa.pub 的文件内容echo "<id_rsa.pub>" >> ~/.ssh/authorized_keys
# 在 nccl-test-0 上执行ssh root@172.21.5.6
mpirun 可启动 NCCL all_reduce_perf 测试任务:mpirun --allow-run-as-root -np 16 \\-npernode 8 -H 172.21.4.8:8,172.21.5.6:8 \\-mca btl_tcp_if_include bond0 \\-x NCCL_IB_DISABLE=0 \\-x NCCL_IB_GID_INDEX=3 \\-x NCCL_DEBUG=INFO \\/root/nccltest/all_reduce_perf -b 1G -e 1G -f 2 -g 1 -n 20
--allow-run-as-root:允许以 root 用户运行。-np 16: 总进程数(2 个节点 × 8 个 GPU)。-npernode 8:每个节点的进程数。-H 172.21.4.8:8,172.21.5.6:8:指定主机和每个主机的进程数。btl_tcp_if_include:指定 OpenMPI 运行时通信使用的网卡。由于网络环境同时有多个网段(每个 RDMA 独属一个网段,eth0 一个网段),所以需要指定只使用 bond0 或者 eth0 进行通信。若该变量不设置会出现报错:Open MPI failed to TCP connect to a peer MPI process.NCCL_IB_DISABLE:0 代表 NCCL 使用 IB/RoCE 传输,1 代表禁止 NCCL 使用 IB/RoCE 传输。此时 NCCL 将退回到使用 IP 套接字。NCCL_IB_GID_INDEX:指定 RoCE 模式中使用的全局 ID 索引。获取方法请参考本文中的 验证 RDMA 设备 部分。注意:只有在 NCCL 2.21 版本以前需要设置这个变量,而在 2.21 版本及以后,该值会被动态设置,不需要设置。详情请参见 NCCL 库官网文档。NCCL_DEBUG:NCCL_DEBUG 变量控制从 NCCL 显示的调试信息。-b 1G:起始数据大小为 1GB。-e 1G:结束数据大小为 1GB。-f 2:数据大小增长因子。-g 1:每个进程使用的 GPU 数量。-n 20:迭代次数。## out-of-place in-place# size count type redop root time algbw busbw #wrong time algbw busbw #wrong# (B) (elements) (us) (GB/s) (GB/s) (us) (GB/s) (GB/s)1073741824 268435456 float sum -1 6455.8 166.32 311.85 0 6426.3 167.09 313.29 0# Out of bounds values : 0 OK# Avg bus bandwidth : 312.571#
size:数据大小(字节)。time:操作耗时(微秒)。algbw:算法带宽(GB/s)。busbw:总线带宽(GB/s)。Avg bus bandwidth:平均总线带宽,这是衡量 RDMA 性能的关键指标。busbw 达到较高值(通常 > 300 GB/s),说明 RDMA 网络配置成功,可以用于分布式训练任务。NCCL_IB_GID_INDEX=3 环境变量。文档反馈