ACCL(Alibaba Collective Communication Library)是阿里云自研的,基于NCCL(Nvidia Collective Communication Library)开发的集合通信库。它结合阿里云自身网络特点以及丰富的大模型任务通信调优经验,可为客户任务提供更高的通信性能,并且具备一定的故障诊断和自愈能力。本文为您介绍ACCL的主要特性和安装方法。
ACCL支持的增强特性
ACCL目前支持的主要增强特性清单如下,所有的增强特性都支持通过环境变量来开启或关闭:
修复了对应NCCL社区开源版本的BUG;
对集合通信不同算子和不同消息区间进行了调优,使其相比开源NCCL拥有更好的性能;
支持训练过程中集合通信统计分析,可用于诊断训练过程中设备故障导致的计算/通信Slow(慢)和Hang(挂起)等问题,配合阿里云PAI的AIMaster:弹性自动容错引擎和C4D:模型训练任务问题诊断工具,可以快速的进行任务的异常检测和自动容错;
支持多路径传输和负载均衡功能,在训练集群中降低甚至消除哈希不均导致的拥塞问题,提升整体训练性能;
使用限制
仅在AI计算资源(灵骏智算资源)部署的地域,使用灵骏智算资源和自定义镜像提交DLC任务时,需要安装ACCL。
安装方法
PAI官方镜像默认已安装ACCL,当您使用官方镜像提交DLC任务时,无需执行以下操作。
步骤一:确认镜像中使用的Pytorch依赖的NCCL库是否为动态库
在自定义镜像容器中执行以下操作步骤:
确认PyTorch库所在位置。
如果已知PyTorch安装于特定目录,您可以直接在该目录下进行搜索。例如,在确认PyTorch位于
/usr/local/lib
的情况下,通过执行查询命令,成功定位到libtorch.so
文件的具体路径,如下所示:find /usr/local/lib -name "libtorch*" # 示例结果如下 /usr/local/lib/python3.10/dist-packages/torch/lib/libtorchcuda.so /usr/local/lib/pvthon3.10/dist-packages/torch/lib/libtorch.so /usr/local/lib/python3.10/dist-packages/torch/lib/libtorchbindtest.so
使用
ldd
命令查看PyTorch库依赖NCCL库的方式。ldd libtorch.so | grep nccl
如果命令返回结果为如下形式,则说明PyTorch是以动态库的方式依赖NCCL,可以继续根据后续步骤进行ACCL的下载与安装。
libnccl.so.2=>/usr/lib/x86_64-linux-gnu/libnccl.so.2(0x00007feab3b27000)
如果命令返回结果为空,说明PyTorch是以非动态库的方式依赖NCCL,则无法安装ACCL。您需要基于NVIDIA官方提供的NGC镜像制作您自己的镜像,或者将使用的PyTorch库改为依赖NCCL动态库的版本,之后才能继续下载安装ACCL。
步骤二:确认镜像中使用的CUDA版本
您可以在自定义镜像容器中,使用如下命令确认当前环境依赖的CUDA版本。
nvidia-smi
返回结果示例如下图所示,表明使用的CUDA版本为12.2。您的CUDA版本以实际返回结果为准。
步骤三:下载CUDA版本对应的ACCL
CUDA版本对应的ACCL下载链接如下:
CUDA版本 | ACCL库下载链接 |
12.3 | https://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.3/lib/libnccl.so.2 |
12.2 | https://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.2/lib/libnccl.so.2 |
12.1 | https://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.1/lib/libnccl.so.2 |
11.7 | https://accl-n.oss-cn-beijing.aliyuncs.com/cuda11.7/lib/libnccl.so.2 |
11.4 | https://accl-n.oss-cn-beijing.aliyuncs.com/cuda11.4/lib/libnccl.so.2 |
您可以在自定义镜像容器中,使用如下命令下载与CUDA版本相对应的ACCL,以CUDA 12.3版本为例:
wget http://accl-n.oss-cn-beijing.aliyuncs.com/cuda12.3/lib/libnccl.so.2
步骤四:安装ACCL库
在安装ACCL库之前,您需要先确认系统是否已经安装NCCL。您可以使用如下命令确认libnccl.so.2
库文件是否已存在:
sudo find / -name "libnccl.so.2"
在查询结果中,可能会出现以下两种情况,并针对每种情况给出相应的处理措施:
未发现
libnccl.so.2
文件,或者该文件存在于/usr/lib64
或/lib64
系统目录中。针对该情况,您可以直接使用cp
命令,将新下载的libnccl.so.2
文件复制到上述任一缺失的系统目录中,以确保其可用性。sudo cp -f ./libnccl.so.2 /usr/lib64
如果搜到
libnccl.so.2
文件位于其它目录,比如/opt/xxx/
,这种情况可能是因为NCCL的安装目录未使用默认路径导致的。您同样可以使用cp命令直接将新下载的libnccl.so.2文件复制到该目录,以覆盖现有文件。sudo cp -f libnccl.so.2 /opt/xxx/
步骤五:刷新动态库
在自定义镜像容器中,使用如下命令刷新动态库缓存。
sudo ldconfig
步骤六:确认是否成功加载ACCL库
使用自定义镜像提交DLC任务,详情请参见创建训练任务。
查看任务日志,如果在任务启动日志中显示了如下ACCL版本信息,则表明该任务已成功应用了ACCL库。如何查看任务日志,请参见查看训练详情。
说明日志中务必出现
accl-n
标识,缺失则表明ACCL库未成功加载。NCCL version 2.20.5.7-accl-n+cuda12.4, COMMIT_ID Zeaa6674c2f1f896e3a6bbd77e85231e0700****, BUILD_TIME 2024-05-10 15:40:56
推荐的环境变量配置
基于日常使用ACCL的经验,PAI团队整理了一系列能够在不同环境中提升通信吞吐率的环境变量,供您参考使用:
export NCCL_IB_TC=136
export NCCL_IB_SL=5
export NCCL_IB_GID_INDEX=3
export NCCL_SOCKET_IFNAME=eth
export NCCL_DEBUG=INFO
export NCCL_IB_HCA=mlx5
export NCCL_IB_TIMEOUT=22
export NCCL_IB_QPS_PER_CONNECTION=8
export NCCL_MIN_NCHANNELS=4
export NCCL_NET_PLUGIN=none
export ACCL_C4_STATS_MODE=CONN
export ACCL_IB_SPLIT_DATA_NUM=4
export ACCL_IB_QPS_LOAD_BALANCE=1
export ACCL_IB_GID_INDEX_FIX=1
export ACCL_LOG_TIME=1
关键环境变量说明如下:
环境变量 | 描述 |
NCCL_IB_TC | 该变量匹配了阿里云网络映射规则,若未配置或配置错误可能会导致性能受损。 |
NCCL_IB_GID_INDEX | 设置RDMA协议使用的GID,若未配置或配置错误会导致NCCL报错。 |
NCCL_SOCKET_IFNAME | NCCL需要选择正确的端口以建立连接,不同的规格对端口的要求不同。若未配置或配置错误可能会导致NCCL建连失败。 |
NCCL_DEBUG | 通常将日志级别设置为INFO,这样可以获得更多NCCL相关的日志输出,有助于定位和解决潜在问题。 |
NCCL_IB_HCA | 指定RDMA通信使用的网卡,若未配置或配置错误可能会导致性能受损。 |
NCCL_IB_TIMEOUT | 设置RDMA连接超时时间,可以提升训练任务时的容错性能。若未配置或配置错误,可能会导致训练任务出现中断。 |
NCCL_IB_QPS_PER_CONNECTION | 适当增加NCCL中每个连接的QP(Queue Pair)数量,可以有效提高网络吞吐率。 |
NCCL_NET_PLUGIN | 配置NCCL网络插件,建议配置为none,以防止误加载其他插件,从而影响系统性能。 |
ACCL_C4_STATS_MODE | 控制ACCL统计信息的维度,目前建议配置为CONN,代表按照连接维度进行统计。 |
ACCL_IB_SPLIT_DATA_NUM | 将数据拆分到多个QP(Queue Pair)中进行发送。 |
ACCL_IB_QPS_LOAD_BALANCE | 是否开启Load Balance功能。 |
ACCL_IB_GID_INDEX_FIX | 配置为1后,在任务启动前会自动检查GID是否异常,并且可以自动绕过这类异常。 |
ACCL_LOG_TIME | 配置为1后,在打印的日志前会加上具体的时间,方便定位问题。 |