
CANN ascend-transformer-boost AllGather 集合通信算子架构、参数与实战调用【免费下载链接】ascend-transformer-boost本项目是CANN提供的是一款高效、可靠的Transformer加速库基于华为Ascend AI处理器提供Transformer定制化场景的高性能融合算子。项目地址: https://gitcode.com/cann/ascend-transformer-boost导读AllGather 是分布式训练与推理中高频使用的集合通信原语其语义为将多张卡上的数据按 rank 顺序聚合后广播到所有卡。本文以 CANN ascend-transformer-boost 仓库中 all_gather 知识条目 为主线结合 all_gather 算子源码 与 官方 C Demo系统讲解该算子的双后端HCCL/LCCL实现架构、AllGatherParam全部参数字段、Shape 推导规则以及端到端调用流程。读完本文你将能独立完成 AllGather 算子的参数配置、多进程调用与结果 Shape 校验并理解其与all_gatherv、reduce_scatter的关系。1. 算子概述在 CANN ascend-transformer-boostATB中AllGatherOperation位于src/ops/ops_infer/all_gather/属于通信communication类别算子知识条目中标记为 tier S高优与类型 single单算子。其核心语义在 infer_op_params.h 中有明确说明将多个通信卡上的数据按所属 rank 号的顺序在第一维进行聚合然后发送到每张卡上。该算子无本地计算 Kernel数据搬运完全由底层集合通信库完成HCCL 或 LCCL因此不涉及 dtype 变换是典型的单阶段single_stage流水线算子。适用场景Transformer 分布式训练中的梯度/权重全量聚合、序列并行Sequence Parallel中 logits 或 hidden states 的同步、MoE 专家输出聚合等凡是需要每张卡拿到全部卡的数据的场景都适用。2. 源码结构双后端 Runner 架构知识条目中的 Source File Map 给出了 3 个核心文件与仓库实际目录src/ops/ops_infer/all_gather/完全对应文件角色all_gather_operation.h/cppOperation 定义 CreateRunner后端选择all_gather_hccl_runner.h/cppHCCL 后端 Runnerall_gather_lccl_runner.h/cppLCCL 后端 Runner其执行路径可用知识条目中的调用链概括AllGatherOperation::CreateRunner() ├── [HCCL] → AllGatherHcclRunner └── [LCCL] → AllGatherLcclRunnerCreateRunner在 all_gather_operation.cpp 中根据param_.backend分发backend hccl时再细分为两种构造方式若hcclComm nullptr则基于rankTableFile是否为空创建自管理通信域的 Runner否则使用用户传入的外部通信域。backend lccl时创建AllGatherLcclRunner并携带Context与commMode用于 LCCL 通信域初始化。两个 Runner 都通过REG_RUNNER_TYPE(...)宏注册见 all_gather_hccl_runner.cpp 与 all_gather_lccl_runner.cpp以便运行时按类型实例化。2.1 创建参数校验CreateOperation 入口算子创建入口 CreateOperation 模板特化 执行了多重前置校验这些约束在实际使用中必须遵守backend仅允许hccl或lccl否则返回ERROR_INVALID_PARAMAtlas 推理系列产品Is310P()不支持 LCCL 后端Atlas 950 平台ASCEND_950仅支持hccl后端通过OperationUtil::DistributedInitCheck完成分布式初始化一致性检查各进程的 rank/rankSize 需保持一致。3. 参数详解AllGatherParam 全字段说明AllGatherParam定义在 infer_op_params.h字段、默认值与约束如下字段类型默认值说明与约束rankint0当前卡所属通信编号需满足0 ≤ rank rankSizerankSizeint0通信的卡的数量rankRootint0主通信编号需满足0 ≤ rankRoot rankSizebackendstd::stringhccl通信后端仅支持hccl与lcclAtlas 推理产品仅支持 hcclhcclCommHcclCommnullptrHCCL 通信域指针。默认为空时加速库自建通信域用户自管通信域时可传入加速库直接复用执行commModeCommModeCOMM_MULTI_PROCESS通信模式枚举。hccl 多线程场景只支持外部传入通信域方式rankTableFilestd::string空集群信息配置文件路径支持单机与多机当前仅支持 hccl 后端单机配置了 rankTable 时以其初始化通信域commDomainstd::string空通信域标识多通信域并发时使用rsvuint8_t[64]0预留参数3.1 LCCL 后端的进阶约束来自头文件注释Atlas 800I A2 推理产品单机 16 卡拓扑下lccl只支持16 卡全量拓扑通信或单节点内任意卡通信lcclcommMode为多进程时commDomain需设置为0-65535的数字lccl多线程模式不支持确定性计算需将LCCL_DETERMINISTIC置为0或falseLCCL 多进程/多线程多通信域并发场景下需将LCCL_PARALLEL置为1或true并行功能使用结束后必须恢复为0或false否则会导致基础场景性能下降。3.2 环境变量与残留清理头文件注释中还给出了两条运维要点多用户共享内存隔离多用户同时使用时需通过ATB_SHARE_MEMORY_NAME_SUFFIX环境变量区分共享内存以保证初始化信息同步互不干扰异常退出后的残留清理通信算子异常退出时需清空残留信号量以避免影响后续使用rm -rf /dev/shm/sem.lccl* rm -rf /dev/shm/sem.hccl* ipcrm -a注ipcrm -a会清空系统中所有共享内存/信号量执行前请确认不影响其他进程。4. Shape 推导与合法性校验AllGatherOperation在 InferShape 阶段完成输出 Tensor 形状的推导规则为输出在第 0 维前插入一个大小为rankSize的新维度原维度依次后移。对应 InferShapeImpl 的实现outTensorDescs.at(0).shape.dimNum inTensorDescs.at(0).shape.dimNum 1; outTensorDescs.at(0).shape.dims[0] param_.rankSize; for (uint64_t i 0; i inTensorDescs.at(0).shape.dimNum; i) { outTensorDescs.at(0).shape.dims[i 1] inTensorDescs.at(0).shape.dims[i]; }以 Demo 中的 2 卡场景为例输入[3, 5]→ 输出[rankSize2, 3, 5]即每张卡各贡献一个[3, 5]块按 rank 顺序拼接。合法性校验包括两处InferShapeCheckImplall_gather_operation.cpp输入dimNum必须 MAX_DIM(8)保证插入新维度后不越界SetupCheckImplall_gather_operation.cpp执行前校验输出dimNum比输入大 1且输出第 0 维必须等于param_.rankSize不匹配即返回ERROR_INVALID_TENSOR_DIM。5. 后端执行细节HCCL 与 LCCL5.1 HCCL 后端AllGatherHcclRunner提供三种构造方式分别对应无 rankTableFile 的自建通信域通过 rank/rankSize/rankRoot 共享内存同步 root info、基于 rankTableFile 的自建通信域、以及用户传入hcclComm的外部通信域。基类 HcclRunner 持有通信域hcclComm_并通过CreateHcclCommInMulitProcess*系列方法完成多进程初始化与共享内存 Barrier 同步。实际执行在 ExecuteImpl 中直接封装HcclAllGatherHcclResult ret HcclAllGather( runnerVariantPack.inTensors[0].deviceData, runnerVariantPack.outTensors[0].deviceData, Utils::GetTensorNumel(runnerVariantPack.inTensors[0]), GetHcclDtype(runnerVariantPack.inTensors[0].desc.dtype), hcclComm_.get(), GetExecuteStream(runnerVariantPack.context));关键点数据量以输入 Tensor 的 numel元素个数为单位而非字节数dtype 通过GetHcclDtype由TensorDesc.dtype映射为 HCCL 数据类型通信在context绑定的执行流上异步执行返回值非HCCL_SUCCESS时通过ConvertHcclResultToStatus转为 ATB 状态码若hcclComm_为空如分布式初始化失败或 device 侧 Tensor 为空会分别返回ERROR_COMM_EMPTY与ERROR_INVALID_PARAM。5.2 LCCL 后端AllGatherLcclRunner基于 Lcal 库实现在 ExecuteImpl 中调用lccl_-AllGather(...)参数语义与 HCCL 版本一致numel、dtype、stream。特例处理当返回LCAL::LCAL_ERROR_PARA_CHECK_FAIL时日志会提示LCCL_PARALLEL 应置为 0 或 false这是 LCCL 并行通信域场景下常见的配置错误。6. 实战多进程 C Demo 完整拆解仓库提供了可直接编译运行的多进程示例 all_gather_demo.cpp其结构如下多进程拉起main中fork()出processCount2个子进程每个子进程调用AllGatherSample(i, 2)父进程wait等待全部子进程结束设备绑定aclrtSetDevice(deviceId)deviceId 取rank值实现 rank 与物理设备一一对应上下文与流atb::CreateContext创建 Context 并SetExecuteStream绑定 stream输入输出构造输入ACL_FLOAT16、ACL_FORMAT_NDShape[3, 5]aclrtMalloc申请 device 内存输出Shape[2, 3, 5]rankSize2符合第 4 节的推导规则参数配置param.rank rank; param.rankRoot 0; param.rankSize rankSize; param.backend hccl;执行atb::CreateOperation(param, op)创建算子 →op-Setup(...)计算 workspace →op-Execute(...)异步下发 → 释放 workspace资源回收依次DestroyOperation、DestroyStream、DestroyContext、aclFinalize。6.1 编译与运行示例 READMEexample/op_demo/all_gather/README.md给出环境准备步骤# 1. 加载 CANN 与 nnal 环境 source /usr/local/Ascend/ascend-toolkit/set_env.sh source /usr/local/Ascend/nnal/atb/set_env.sh # 源码编译的 ATB 则使用 source ./ascend-transformer-boost/output/atb/set_env.sh编译时注意 ABI 一致性cxx_abi0默认需加-D_GLIBCXX_USE_CXX11_ABI0cxx_abi1则改为1与 ATB 库的编译选项保持一致否则链接阶段会出现符号不匹配。6.2 运行结果2 个子进程均执行成功后输出rank: 0 executed END. rank: 1 executed END. The communication operator is successfully executed. Parent process exit提示Demo 中生成的数据为占位数据不代表实际业务数据如需参考真实数据生成与精度对比逻辑可查看 tests/apitest/opstest/python/operations/all_gather/ 下的 Python 用例。7. 关联算子与反向关系知识条目给出的 Related 信息补充了该算子在集合通信算子族中的位置all_gathervAllGather 的变长版本支持每张卡数据长度不等适用于 token 数不固定的动态 shape 场景reduce_scatterAllGather 的反向操作——先做规约reduce再按 rank 分发scatter数据量从全部卡收缩回每卡一份。三者配合all_reduce即可覆盖分布式训练中绝大多数集合通信需求在 ATB 中它们共享同一套 HcclRunner/LcclRunner 基类与参数风格rank/rankSize/rankRoot/backend掌握 AllGather 后可以快速迁移到其他通信算子。8. 关键源码索引内容路径知识条目本文主线.agent/knowledge/ops/communication/all_gather/index.mdOperation 实现src/ops/ops_infer/all_gather/all_gather_operation.cppHCCL Runnersrc/ops/ops_infer/all_gather/all_gather_hccl_runner.cppLCCL Runnersrc/ops/ops_infer/all_gather/all_gather_lccl_runner.cpp参数定义include/atb/infer_op_params.hHCCL Runner 基类src/atb/runner/hccl_runner.h多进程 Demoexample/op_demo/all_gather/all_gather_demo.cppDemo 使用说明example/op_demo/all_gather/README.mdPython 测试用例tests/apitest/opstest/python/operations/all_gather/【免费下载链接】ascend-transformer-boost本项目是CANN提供的是一款高效、可靠的Transformer加速库基于华为Ascend AI处理器提供Transformer定制化场景的高性能融合算子。项目地址: https://gitcode.com/cann/ascend-transformer-boost创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考