尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

HCCL HcclAlltoAll 接口详解:全到全集合通信的原理、参数约束与实战示例

HCCL HcclAlltoAll 接口详解:全到全集合通信的原理、参数约束与实战示例 HCCL HcclAlltoAll 接口详解全到全集合通信的原理、参数约束与实战示例【免费下载链接】hccl集合通信库Huawei Collective Communication Library简称HCCL是基于昇腾AI处理器的高性能集合通信库为计算集群提供高性能、高可靠的通信方案项目地址: https://gitcode.com/cann/hccl本文围绕 HCCLHuawei Collective Communication Library提供的HcclAlltoAll接口展开完整覆盖其功能语义、函数原型、参数约束、支持的数据类型与产品范围、返回值以及可直接运行的调用示例并结合仓库中的开源实现参数校验逻辑、底层 AlltoAllV 转换与官方示例工程帮助开发者快速掌握在昇腾 AI 处理器集群上执行“全到全AlltoAll”集合通信的完整方法。功能说明HcclAlltoAll是 HCCL 集合通信算子中的 AlltoAll 操作接口向通信域内所有 rank 发送相同数据量的数据并从所有 rank 接收相同数据量的数据。AlltoAll 操作将输入数据在特定的维度切分成特定的块数块数等于通信域内 rank 数量按顺序发送给其他 rank同时从其他 rank 接收输入数据并按顺序在特定维度上拼接。可以这样理解其数据语义假设通信域内共有 N 个 rank每个 rank 的sendBuf中按元素存放 N 个连续块第 j 块恰好是要发给 rank j 的数据执行完成后每个 rank 的recvBuf中第 j 块位置存放的是来自 rank j 的数据块该操作是典型的“一对一全互联”通信模式常用于 MoEMixture of Experts的专家路由、分布式 attention、张量并行/专家并行中的通信调度等场景。产品支持情况HcclAlltoAll在以下产品上均支持产品支持情况Ascend 950PR / Ascend 950DT支持Atlas A3 训练系列产品 / Atlas A3 推理系列产品支持Atlas A2 训练系列产品 / Atlas A2 推理系列产品支持Atlas 推理系列产品Atlas 300I Duo 推理卡支持但有拓扑约束见约束说明Atlas 训练系列产品支持通信域需满足 cluster 相关约束见约束说明函数原型接口原型在头文件 include/hccl.h 中声明HcclResult HcclAlltoAll(const void *sendBuf, uint64_t sendCount, HcclDataType sendType, const void *recvBuf, uint64_t recvCount, HcclDataType recvType, HcclComm comm, aclrtStream stream);各参数语义与 头文件注释 一致sendCount是“发送给每个rank 的元素个数”recvCount是“从任意rank 接收的元素个数”。参数说明参数名输入/输出描述sendBuf输入源数据 buffer 地址。sendCount输入表示向每个 rank 发送的数据量元素个数按sendType计算字节数。sendType输入发送数据的数据类型HcclDataType类型。不同型号支持的数据类型不同详见下文数据类型说明。recvBuf输出目的数据 buffer 地址集合通信结果输出至此 buffer 中。recvBuf 与 sendBuf 配置的地址不能相同且两者的内存范围不能重叠不支持 in-place 操作。recvCount输入表示从每个 rank 接收的数据量需要与sendCount取值相同。recvType输入接收数据的数据类型HcclDataType类型需要与sendType取值相同。comm输入集合通信操作所在的通信域。stream输入本 rank 所使用的aclrtStream任务流。数据类型说明不同硬件型号支持的HcclDataType存在差异产品支持的数据类型Ascend 950PR / Ascend 950DTint8、uint8、int16、uint16、int32、uint32、int64、uint64、float8-e5m2、float8-e4m3、float8-e8m0、hifloat8、float16、float32、float64、bfp16Atlas A3 训练/推理系列产品int8、uint8、int16、uint16、int32、uint32、int64、uint64、float16、float32、float64、bfp16Atlas A2 训练/推理系列产品int8、uint8、int16、uint16、int32、uint32、int64、uint64、float16、float32、float64、bfp16Atlas 训练系列产品int8、uint8、int16、uint16、int32、uint32、int64、uint64、float16、float32、float64Atlas 300I Duo 推理卡int8、uint8、int16、uint16、int32、uint32、int64、uint64、float16、float32、float64说明示例中常用的HCCL_DATA_TYPE_FP32对应 float32是各平台共用的基础类型。数据类型枚举的完整定义可参考 data_type_def.md。返回值接口返回HcclResult返回值说明HCCL_SUCCESS接口调用成功。HCCL_E_PTR传入的指针参数为空如 comm、sendBuf、recvBuf、stream 等为 nullptr。HCCL_E_PARA传入的参数无效如 sendCount 与 recvCount 不一致、sendType 与 recvType 不一致、sendBuf 与 recvBuf 地址相同等。HCCL_E_NOT_SUPPORT操作不被支持如 dataType 非法或当前型号不支持。HCCL_E_INTERNAL内部错误。约束说明参数一致性所有 rank 的sendCount、sendType、recvCount、recvType均应相同缓存区大小影响性能AlltoAll 操作的性能与 NPU 之间共享数据的缓存区大小有关当通信数据量超过缓存区大小时性能将出现明显下降。若业务中 AlltoAll 通信数据量较大建议通过配置环境变量 HCCL_BUFFSIZE 适当增大缓存区大小以提升通信性能Atlas 训练系列产品cluster 约束AlltoAll 的通信域需要满足如下约束——单 Server 1p、2p 通信域要在同一个 cluster 内Server 内 0-3 卡和 4-7 卡各为一个 cluster单 Server 4p、8p 和多 Server 通信域中 rank 要以 cluster 为基本单位并且 Server 间 cluster 选取要一致。此外如果是单 Server 场景要求网卡的状态是 “up”否则此接口会执行失败Atlas 300I Duo 推理卡仅支持单 Server 场景单 Server 中最大支持部署 2 张 Atlas 300I Duo 推理卡即 4 个 NPU算子下发顺序多个通信域下的所有通信算子在每个 Device 上需要保证串行下发不允许乱序、多线程并发下发也不支持线程重入Context 一致性在同一 Device 上同一通信域内的所有通信算子的下发线程需要使用相同的 Context。关于 HCCL_BUFFSIZE 缓存区的补充从 HCCL_BUFFSIZE 的说明可以看到该环境变量的关键细节取值为大于等于 1 的整数单位 MB默认值为 200每个通信域独占2 × HCCL_BUFFSIZE大小的内存分别用于收发该资源按通信域粒度管理保证多通信域并发算子互不影响申请的内存在 HCCL 独占不可与其他业务内存复用。若集群中存在较多通信域整体缓存占用会增加可通过调小该值降低占用对集合通信算子而言当数据量超过HCCL_BUFFSIZE取值时可能出现性能下降建议其取值大于通信数据量。配置示例export HCCL_BUFFSIZE200调用示例以下示例完整演示了从申请 Device 内存、初始化通信域到执行 AlltoAll 的资源生命周期与官方文档保持一致// 申请集合通信操作的Device内存 void *sendBuf nullptr; void *recvBuf nullptr; uint64_t count 8; size_t mallocSize count * sizeof(float); aclrtMalloc((void **)sendBuf, mallocSize, ACL_MEM_MALLOC_HUGE_ONLY); aclrtMalloc((void **)recvBuf, mallocSize, ACL_MEM_MALLOC_HUGE_ONLY); // 初始化通信域 uint32_t rankSize 8; HcclComm hcclComm; HcclCommInitRootInfo(rankSize, rootInfo, deviceId, hcclComm); // 创建任务流 aclrtStream stream; aclrtCreateStream(stream); // 执行AlltoAll向通信域内所有rank发送相同数据量的数据并从所有rank接收相同数据量的数据 size_t perCount count / rankSize; HcclAlltoAll(sendBuf, perCount, HCCL_DATA_TYPE_FP32, recvBuf, perCount, HCCL_DATA_TYPE_FP32, hcclComm, stream); // 阻塞等待任务流中的集合通信任务执行完成 aclrtSynchronizeStream(stream); // 释放资源 aclrtFree(sendBuf); // 释放Device侧内存 aclrtFree(recvBuf); // 释放Device侧内存 aclrtDestroyStream(stream); // 销毁任务流 HcclCommDestroy(hcclComm); // 销毁通信域示例中几个关键点perCount count / rankSize每个 rank 的发送 buffer 共count个元素均匀切成rankSize块sendCount传每块的元素数内存建议使用ACL_MEM_MALLOC_HUGE_ONLY方式申请 Device 侧内存以获得更好的通信性能HcclAlltoAll是异步下发接口需通过aclrtSynchronizeStream等待任务流中的通信任务完成后再使用结果资源释放顺序先释放内存、销毁任务流最后销毁通信域。完整可运行示例examples/02_collectives/06_alltoall仓库提供了完整的多设备示例工程 examples/02_collectives/06_alltoall其 main.cc 在文档示例基础上补齐了实际业务所需的步骤通过aclrtGetDeviceCount检测设备数量并以 rank0 为 root 节点用HcclGetRootInfo生成 rootInfo包含 Device IP、Device ID 等信息需广播至集群所有 rank 用于初始化通信域为每张 NPU 启动一个线程各自执行aclrtSetDevice、aclrtMalloc申请 Device 内存与 Host 内存将本 rank 的数据初始化为自己的 rank id 后拷贝到 Device 侧每个线程内基于同一份 rootInfo 调用HcclCommInitRootInfo初始化通信域随后调用核心通信代码节选自 main.cc// 执行 AlltoAll向通信域内所有 rank 发送相同数据量的数据并从所有 rank 接收相同数据量的数据 uint64_t perCount count / ctx-devCount; HCCLCHECK( HcclAlltoAll(sendBuf, perCount, HCCL_DATA_TYPE_FP32, recvBuf, perCount, HCCL_DATA_TYPE_FP32, hcclComm, stream)); // 阻塞等待任务流中的集合通信任务执行完成 ACLCHECK(aclrtSynchronizeStream(stream));最后将结果拷回 Host 打印并按HcclCommDestroy→aclrtFree→aclrtDestroyStream的顺序释放资源。编译与运行单机 N 卡N≥2支持 Ascend 950PR/950DT、Atlas A3、Atlas A2、Atlas 训练/推理系列# 设置 CANN 环境变量以 root 用户默认安装路径为例 source /usr/local/Ascend/cann/set_env.sh # 在样例目录下 make make test运行结果示例每个 rank 的数据初始化为对应 rank id经过 AlltoAll 后各 rank 收到的结果均为所有节点输入数据的拼接Found 8 NPU device(s) available rankId: 0, output: [ 0 1 2 3 4 5 6 7 ] rankId: 1, output: [ 0 1 2 3 4 5 6 7 ] ... rankId: 7, output: [ 0 1 2 3 4 5 6 7 ]另外可通过环境变量HCCL_OP_EXPANSION_MODE配置通信算子的展开模式例如export HCCL_OP_EXPANSION_MODEAI_CPU设置为 AI CPU 通信引擎不同产品型号支持的范围可参考 CANN 官方环境变量说明文档。源码剖析HcclAlltoAll 的实现路径从开源实现看HcclAlltoAll的定义位于 src/ops/all_to_all_v/all_to_all_v.cc其内部处理流程可以归纳为兼容分支若底层 hcomm 版本低于 9.0.0GetHcommVersion() CANN_VERSION(9, 0, 0)回退调用HcclAlltoAllInner老流程参数校验调用CheckAlltoAllInputPara对应文档中的返回值约束。从 校验代码 可以看到接口实际检查了comm、sendBuf、recvBuf、stream非空为空返回HCCL_E_PTR并上报 EI0003 诊断码sendCount ! recvCount或sendType ! recvType时返回HCCL_E_PARAsendBuf recvBuf时返回HCCL_E_PARA印证了“两者地址不能相同”的文档约束;sendCount * 类型字节数溢出UINT64_MAX时返回HCCL_E_PARA等量 AlltoAll 到 AlltoAllV 的矩阵转换实现中构造了sdispls/rdispls全 0 位移数组与sendCounts/recvCounts每个 rank 均为recvCount的计数数组通过ConvertAlltoAllParam生成后复用 AlltoAllV 的执行路径AlltoAllVOutPlace命令类型HCCL_CMD_ALLTOALL。也就是说等量的HcclAlltoAll在 HCCL 内部被规整为“均匀矩阵”形式的 AlltoAllV 来执行若底层选择useInnerOp也会回退到HcclAlltoAllInner日志与 tag接口生成ALLTOALL_ commName的 tag 进行通信域校验HcclCheckTag并打印入口/出口日志AlltoAllEntryLog/LogHcclExit配合HCCL_ENTRY_LOG_ENABLE等环境变量可用于排查通信问题。这一结构说明对于需要“不等量、非均匀”全互联通信的业务可以直接使用 HcclAlltoAllVsendCounts/recvCounts/sdispls/rdispls四个数组在 Device 内存中其参数校验逻辑同样可在 CheckAlltoAllVInputPara 中看到而HcclAlltoAll正是其等量特化形式。小结HcclAlltoAll提供了“每个 rank 向所有 rank 发送等量数据块并从所有 rank 接收等量数据块”的全互联通信能力。使用时的核心要点是参数侧保证所有 rank 的sendCount/sendType/recvCount/recvType一致sendBuf与recvBuf不重叠按目标硬件选择受支持的数据类型超出型号支持范围会得到HCCL_E_NOT_SUPPORT大数据量场景建议调大HCCL_BUFFSIZEAtlas 训练系列注意 cluster 组域约束与网卡 up 状态Atlas 300I Duo 仅支持单 Server 至多 2 卡4 NPU下发需串行、同通信域算子使用相同 Context通过aclrtSynchronizeStream同步后再使用结果。可直接参考 examples/02_collectives/06_alltoall 示例工程进行单机多卡验证结合 src/ops/all_to_all_v/all_to_all_v.cc 理解参数校验与 AlltoAllV 复用机制。【免费下载链接】hccl集合通信库Huawei Collective Communication Library简称HCCL是基于昇腾AI处理器的高性能集合通信库为计算集群提供高性能、高可靠的通信方案项目地址: https://gitcode.com/cann/hccl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表