文档

ACCL:阿里云自研高性能集合通信库

更新时间:

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库是否为动态库

在自定义镜像容器中执行以下操作步骤:

  1. 确认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
  2. 使用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版本以实际返回结果为准。image

步骤三:下载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库

  1. 使用自定义镜像提交DLC任务,详情请参见创建训练任务

  2. 查看任务日志,如果在任务启动日志中显示了如下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后,在打印的日志前会加上具体的时间,方便定位问题。