HCCL——昇腾高性能集合通信库
发表于 2024/08/09
01 前言
集合通信定义了一系列标准信息交换接口,解决并行计算时不同进程之间的通信问题。集合通信广泛用于AI、HPC等大规模计算通信场景。以深度学习数据并行训练场景为例,训练任务将不同训练样本分配给多个加速节点并行训练,在每一个训练迭代(或若干迭代)之后,模型梯度数据需要在所有节点间进行同步(如求和操作)。在大规模集群中进行数据同步是非常耗时的,集合通信技术有效解决了这个问题,比如采用Allreduce操作,让所有计算节点并行、高效、有序地执行信息交换,可大幅提升数据同步效率,减少时间开销。
02 什么是HCCL
HCCL(Huawei Collective Communication Library)是基于昇腾AI处理器的高性能集合通信库,提供单机多卡以及多机多卡间的集合通信能力,支持大模型的数据并行、模型并行、专家并行、pipeline并行、序列并行等多种加速方案。
HCCL支持AllReduce、Broadcast、Allgather、ReduceScatter、AlltoAll等通信原语,支持Ring、Mesh、Halving-Doubling(HD)等通信算法,支持基于HCCS、RoCE和PCIe等链路/协议实现集合通信,未来还将支持更多链路/协议。
HCCL集合通信库作为昇腾AI异构计算架构CANN的重要组成部分,为昇腾超大集群训练/推理提供了基础通信能力。
来源:https://www.hiascend.com/software/cann
03 HCCL的主要特点
HCCL主要用于需要多个NPU协同工作的高性能计算任务,例如深度学习训练、大规模数据分析和科学计算等。通过使用HCCL,这些应用可以更有效地利用NPU资源,缩短计算时间,提高工作效率。
1. 高性能集合通信算法,提升大规模并行计算通信效率
HCCL会根据服务器内、服务器间的基础拓扑,自动选择合适的通信算法,包括常见的标准算法以及多种自研算法,也支持接入用户开发实现的通信算法。
2. 计算通信统一硬化调度,降低调度开销,优化硬件资源利用率
专用硬件调度引擎和硬件通信原语,实现计算任务与通信任务全硬化调度,降低调度开销,精准控制系统抖动。
3. 计算通信高性能并发,计算与通信并发流水执行,系统性能进一步提升
“归约”类集合通信操作( AllReduce 、ReduceScatter 、Reduce)通过随路方式实现,不占用计算资源。计算通信任务并发执行,总执行时长大幅降低。04 HCCL的安装
1. 下载HCCL
HCCL集合通信库集成在昇腾CANN开发套件包Ascend-cann-toolkit_{version}_linux-{arch}.run中,下载地址:LINK
2. 安装HCCL
HCCL的使用依赖昇腾软硬件环境的搭建,包括驱动、固件、CANN开发套件包以及AI框架等,开发者可参考上述链接中的配套文档安装和使用。
05 HCCL通信原语及API调用
在分布式系统中,各个节点间往往存在大量的集合通信需求,比如Allreduce、Broadcast、Allgather、ReduceScatter等则是分布式系统中比较底层的消息通信行为。
AllReduce是将所有节点的input相加(或其他操作)后,再把结果发送到所有节点的output。
Broadcast用于实现一对多的传输,将root节点的数据广播到其他节点。
AllGather将group内所有节点的输入按照rank id重新排序,然后拼接起来,再将结果发送到所有节点的输出。
ReduceScatter操作是将所有节点的input相加(或其他操作),再把结果按照rank编号均匀分散到各个rank的输出buffer,每个进程拿到其他进程1/ranksize份的数据进行归约操作。
HCCL支持AllReduce、Broadcast、AllGather、Scatter、ReduceScatter、Reduce、AlltoAll和AlltoAllV等通信原语,并通过C++或Python形式为上述消息通信行为提供了操作接口,用于快速实现分布式能力。
· C++语言接口用于实现单算子模式下的框架适配,实现分布式计算能力。对于PyTorch框架,HCCL单算子API已嵌入到Ascend Extension for PyTorch后端代码中,PyTorch用户直接使用PyTorch原生集合通信API,即可实现分布式能力。
· Python语言接口用于实现TensorFlow网络基于NPU实现执行分布式优化。
以HCCL C++接口为例,开发者实现集合通信功能的典型开发流程为:
1. 首先进行集群信息配置,创建并初始化集合通信域,通信域是包含一组参与通信的NPU设备以及设备对应的通信进程。
2. 然后调用集合通信算子实现集合通信操作(比如AllReduce、Broadcast、Allgather等)。
3. 最后释放相关资源、销毁集合通信域。
//设备资源初始化
ACLCHECK(aclInit(NULL));
//指定集合通信操作使用的设备
ACLCHECK(aclrtSetDevice(dev_id));
//创建任务stream
aclrtStream stream;
ACLCHECK(aclrtCreateStream(&stream));
//获取集群配置文件
char* rank_table_file = getenv("RANK_TABLE_FILE");
//根据集群配置文件初始化集合通信域
HcclComm hccl_comm;
HCCLCHECK(HcclCommInitClusterInfo(rank_table_file, rank_id, &hccl_comm));
//申请请集合通信操作的内存
ACLCHECK(aclrtMalloc((void**)&sendbuff, malloc_kSize, ACL_MEM_MALLOC_HUGE_FIRST));
ACLCHECK(aclrtMalloc((void**)&recvbuff, malloc_kSize, ACL_MEM_MALLOC_HUGE_FIRST));
//执行集合通信操作
HCCLCHECK(HcclAllReduce((void *)sendbuff, (void*)recvbuff, count, (HcclDataType)dtype, (HcclReduce0p)op_type,hccl_comm, stream));
//等待stream中集合通信任务执行完成
ACLCHECK(aclrtSynchronizeStream(stream));
//销毁集合通信内存资源
ACLCHECK(aclrtFree(sendbuff));
ACLCHECK(aclrtFree(recvbuff));
//销毁集合通信域
HCCLCHECK(HcclCommDestroy(hccl_comm));
//销毁任务流
ACLCHECK(aclrtDestroyStream(stream));
//重置设备
ACLCHECK(aclrtResetDevice(dev_id));
//设备去初始化
ACLCHECK(aclFinalize());
06 HCCL算法简介
从上面的介绍,我们知道,HCCL提供了各类集合通信原语/接口,比如AllReduce、Broadcast、Allgather等。每个集合通信原语,都有多套算法实现。例如Broadcast,由于应用场景的不同,参与通信的通信实体数量、每次发送的数据量各不相同等,导致难以有一种集合通信算法在各种条件下都是最优的,因此通常一个集合通信原语会有多套集合通信算法实现。
HCCL提供了Mesh、Ring、Recursive Halving-Doubling(RHD)、NHR(Nonuniform Hierarchical Ring)、NB(Nonuniform Bruck)、Pipeline和Pairwise几种拓扑算法用于Server内和Server间的集合通信。
Mesh算法是Server内通信算法,为FullMesh互联拓扑内的基础算法,任意两个NPU之间可以直接进行数据收发。每个NPU并发的使用多路HCCS链路从对端读取或者写入数据,使双工互联链路的双向带宽同时得到利用。
Ring算法是Server内和Server间通信算法,为基于环结构的并行调度算法。所有的NPU以环形相连,每张卡都有左手卡与右手卡,一个负责数据接收,一个负责数据发送,循环完成梯度累加,再循环做参数同步。Ring算法适用于“星型”或“胖树”拓扑互联,其特点是通过Ring环将所有NPU设备的单端口双工链路串联起来。
HCCL会根据服务器内、服务器间的基础拓扑,自动选择合适的通信算法,各类算法的详细介绍可参考《集合通信用户指南》。
目前,昇腾已开放部分HCCL通信算法代码样例,并支持定制开发,开发者可以访问Gitee-cann-hccl获取。
07 更多介绍
关于HCCL集合通信库的相关介绍就到这里,欢迎大家关注后续技术分享。如需获取更多学习资源请登录昇腾社区。
更多CANN开放能力介绍:
《Ascend C 2.0全新升级,支撑大模型融合算子高效开发》
本页内容