使用AICK工具测试实例通信库性能
概览
AI Communication Kit,AICK通信组件是百度智能云自研工具包,协助运维人员高效、便捷地进行集群状态诊断、通信性能测试和通信故障或慢节点定位。
需求场景
- 压测集群NCCL、DeepEP等主流通信库通信性能,参考本篇中的通信库性能测试。
- 检测实例RDMA网卡运行环境是否符合预期,参考本篇中的RDMA环境检测。
- 定位、检测集群通信中的慢节点或故障节点,参考本篇中的故障节点定位。
方案概述
- AICK:脚本工具包,支持集群通信测试、集群故障节点定位、RDMA网卡环境检查等功能。
- AIXL容器:集成AICK以及NCCL、DeepEP、MPI等通信库环境的容器镜像,配置SSH免密。
前置依赖
- 您已购买多台弹性高性能计算GPU实例(支持RDMA网卡的GPU实例)。
- 实例已安装完成驱动和CUDA等运行环境。您可在创建或重装时自动安装驱动。
- 实例已安装Docker和NVIDIA Container Toolkit,您可使用云助手自动安装docker公共命令对批量实例快速安装。
- 检查实例安全组,确保放开入向、出向的23335端口
环境准备
登陆任意一台需要测试的实例,安装AICK:
1# sshpass 在手动使用 --password 指定密码时使用,如果已经配置免密可以不安装
2sudo apt-get install -y sshpass
3pip3 install aick -i http://mirrors.baidubce.com/pypi/simple --trusted-host mirrors.baidubce.com
准备hostfile文件,通过vim hostfile添加需要通信的所有主机VPC IP
1192.168.117.6
2192.168.117.8
下文中所有的多机命令,都需要操作目录中存在 hostfile 文件、也可以使用 -f / --hostfile 进行指定,后文中不再赘述。注意如果进入容器,需要在容器内准备 hostfile 文件。
运行 aick_bootstrap 命令在所有机器上进行 bootstrap(默认使用 ./hostfile 文件,也可以使用 -f / --hostfile 进行指定),密码替换为实际实例登陆密码:
1aick_bootstrap --password 123456
启动AIXL容器:
1* AIXL 镜像已配置免密,如果使用自己的容器镜像,请配置免密或在所有多机执行的命令指定 --password 参数;
2* AXIL 镜像已集成 aick-1.0.2,如果使用自己的容器镜像,在进入容器后请参照上文安装 aick 的方法,在所有容器内安装 aick。
在所有机器上获取启动容器脚本(aick_cmd 在执行多机任务时默认使用 ./hostfile 文件,也可以使用 -f / --hostfile 进行指定):
1aick_cmd --password 123456 exec -- 'wget http://mirrors.baidubce.com/baidu/aixl/easy_aixl.sh -O /tmp/easy_aixl.sh'
使用 aick_cmd 命令在所有机器上启动 AIXL 容器:
1aick_cmd --password 123456 exec -- 'bash /tmp/easy_aixl.sh'
通信库性能测试
进行性能测试时,需要将 hostfile 中的机器进行亲和性排序:
1aick_topo_check --hostfile hostfile --sort
执行单项通信库测试
执行具体某个通信库的某个通信算子测试。
查看通信库测试模板,包含执行的环境变量及命令脚本:
1aick_cmd -l
输出结果如下:
1deepep_test_ll.txt
2 # 多机调度测试 deepep test_low_latency.py
3deepep_test_normal.txt
4 # 多机调度测试 deepep test_internode.py
5mpirun_bccl_perf.txt
6 # 传入 hostfile 执行多机 bccl_perf
7mpirun_nccl_perf_all_gather.txt
8 # 传入 hostfile 执行多机 nccl_perf
9mpirun_nccl_perf_all_reduce.txt
10 # 传入 hostfile 执行多机 nccl_perf
11mpirun_nccl_perf_alltoall.txt
12 # 传入 hostfile 执行多机 nccl_perf
13mpirun_nccl_perf_broadcast.txt
14 # 传入 hostfile 执行多机 nccl_perf
15mpirun_nccl_perf_gather.txt
16 # 传入 hostfile 执行多机 nccl_perf
17mpirun_nccl_perf_reduce.txt
18 # 传入 hostfile 执行多机 nccl_perf
19mpirun_nccl_perf_reduce_scatter.txt
20 # 传入 hostfile 执行多机 nccl_perf
21mpirun_nccl_perf_scatter.txt
22 # 传入 hostfile 执行多机 nccl_perf
23mpirun_nccl_perf_sendrecv.txt
24 # 传入 hostfile 执行多机 nccl_perf
25torchrun_aick_perf_ring.txt
26 # 使用 torchrun 拉起多机 aick_perf 测试
27partition/mpirun_nccl_perf_all_reduce.txt
28 # 传入 hostfile 执行多机 nccl_perf(用于 partirion 检测慢节点, 数据大小为 2G)
29partition/mpirun_nccl_perf_alltoall.txt
30 # 传入 hostfile 执行多机 nccl_perf(用于 partirion 检测慢节点, 数据大小为 2G)
以测试nccl_perf_all_reduce为例子,导出模板到当前目录:
1aick_cmd -t mpirun_nccl_perf_all_reduce.txt -o
可执行如下命令,按标准模板执行测试:
1aick_cmd -t mpirun_nccl_perf_all_reduce.txt --fire
如需修改执行的环境变量,可先修改模板,再执行:
1# 修改模板
2vim ./mpirun_nccl_perf_all_reduce.txt
3# 修改模板内容,比如把 -b 与 -e 的参数都改为 2G
4...
5
6# 使用修改后的模板
7aick_cmd -u ./mpirun_nccl_perf_all_reduce.txt --fire
执行批量通信库测试
NCCL通信库:
如您需要对集群同时执行多项通信库算子测试,可参考如下示例 分别进行 2 机、4 机、8 机多种节点数量的 all_reduce、alltoall 的测试:
1aick_test nccl -c all_reduce alltoall -n 2 4 8 --per-nodes
支持以下常用命令行参数:
默认参数 | 指定选项 | 含义 |
---|---|---|
./hostfile | -f / --hostfile | 使用的hostfile 文件 |
all_reduce | -c / --coll | 测试的集合通信类型,填写all代表测试所有算子 |
8 | -g / --gpu | 每台机器 GPU 的数量 |
2G | -s / --size | NCCL 结合通信测试的数据大小 |
无 | --per-nodes | 每种节点数量单独展示 |
测试2机、4机、8机的全部通信算子示例:
1aick_test nccl -c all -n 2 4 8
DeePEP通信库:
分别进行 1机、 2 机、4 机、8 机测试:
1#normal测试
2aick_test deepep -c normal -n 1 2 4 8
3
4#low-latency测试
5aick_test deepep -c ll -n 1 2 4 8
RDMA环境检测
登陆任意一台需要执行检测的实例,
1rdma环境检测需要在主机环境执行。在容器环境执行可能导致部分检测项检测失败。
执行检测:
1# 检测所有机器的RDMA环境
2aick_precheck --hostfile hostfile --password 123456
3
4# 检测所有机器到自身网关的连通性,本机到其它所有机器网关的连通性,本机到其它所有机器到连通性,进行本机到其它所有机器的 perftest 性能测试
5aick_nic_check --connect --hostfile hostfile --password 123456 --to-all
命令行参数解释如下:
参数 | 含义 |
---|---|
connect | 检测rdma网卡网关联通性 |
hostfile | 检测的主机 |
password | 主机登陆密码 |
to-all | 本机到其它所有机器网卡,网关的连通性测试以及到其它所有机器的perftest性能测试 |
故障节点定位
登陆任意一台需要定位的实例,登陆容器:
1docker exec -it bash easy_aixl
执行亲和性排序:
1aick_topo_check --hostfile hostfile --sort
使用N分检查
N分检查,通过将集群分成N个组,每个组内执行通信测试,一般建议每个组指定2台实例。
1aick_partition -c all_reduce --partition-size 2
支持设置命令行参数:
参数 | 含义 |
---|---|
-c | 通信算子 |
--partition-size | 每个组的实例数量 |
--timeout | 测试超时时长 |
--low-thresh | 通信判定SLOW的阈值 |
使用2分检查
如果使用N分检查后仍没发现故障节点,可使用2分检查,2分检查会对集群执行多次通信测试,每次测试收敛通信范围,例如对8机执行2分检查会执行3次测试,第一次测试8机性能,第二次测试2组4机性能,第三次测试4组2机性能。
1aick_partition -c all_reduce
测试结果示例如下:
结果解读:
- OK:性能符合要求。
- ERROR:执行报错。
- SLOW:需指定--low-thresh,测试低于该阈值。
- TIMEOUT:需指定--timeout,执行时间超过该值。
- MIXED:有2种以上错误