当前位置: 首页 > news >正文

HCCL 集合通信编程:多卡协同的正确姿势

前言多卡训练和推理核心是卡间通信。HCCLHuawei Collective Communication Library是昇腾的集合通信库API 和 NCCL 兼容但底层实现针对 HCCS 和 RoCE 做了优化。下面介绍 HCCL 的常用通信模式和编程示例。一、初始化 HCCL和 NCCL 一样HCCL 需要初始化通信组。importtorchimporttorch.distributedasdistdefinit_hccl():# 初始化进程组dist.init_process_group(backendhccl,init_methodenv://,# 从环境变量读取地址world_size8,# 总卡数rankint(os.environ[RANK]))# 获取当前设备的 local_ranklocal_rankint(os.environ[LOCAL_RANK])torch.npu.set_device(local_rank)print(fInitialized HCCL: rank{dist.get_rank()}, world_size{dist.get_world_size()})启动脚本# 多机多卡启动torchrun\--nnodes2\# 2 台机器--nproc_per_node4\# 每台机器 4 张卡--master_addr10.0.0.1\--master_port29500\train.py二、AllReduce全局求和AllReduce 是最常用的集合通信操作每张卡算出自己的梯度然后全局求和结果广播给所有卡。标准 AllReducedefallreduce_example():# 每张卡的本地数据local_tensortorch.randn(1024,1024).npu()# AllReduce 求和dist.all_reduce(local_tensor,opdist.ReduceOp.SUM)# 现在 local_tensor 包含所有卡的和print(fAllReduce result:{local_tensor.mean()})梯度同步defsync_gradients(model):同步所有卡的梯度forparaminmodel.parameters():ifparam.gradisnotNone:# 梯度求和并平均dist.all_reduce(param.grad,opdist.ReduceOp.SUM)param.grad/dist.get_world_size()性能优化梯度压缩# HCCL 原生支持 FP16 梯度压缩defsync_gradients_fp16(model):forparaminmodel.parameters():ifparam.gradisnotNone:# 转 FP16 再通信grad_fp16param.grad.half()dist.all_reduce(grad_fp16,opdist.ReduceOp.SUM)param.gradgrad_fp16.float()/dist.get_world_size()三、AllGather收集所有卡的数据AllGather 把每张卡的数据收集起来拼成一个更大的 tensor。defallgather_example():# 每张卡有 1 个数据块local_datatorch.tensor([dist.get_rank()]).npu()# 准备接收所有数据的 bufferworld_sizedist.get_world_size()gathered[torch.zeros_like(local_data)for_inrange(world_size)]# AllGatherdist.all_gather(gathered,local_data)# gathered [tensor([0]), tensor([1]), tensor([2]), ...]print(fAllGather result:{[t.item()fortingathered]})实际应用收集预测结果defgather_predictions(local_preds):收集所有卡的预测结果world_sizedist.get_world_size()batch_sizelocal_preds.shape[0]# 准备接收 bufferall_preds[torch.zeros_like(local_preds)for_inrange(world_size)]# AllGatherdist.all_gather(all_preds,local_preds)# 拼接成一个大 tensorreturntorch.cat(all_preds,dim0)四、ReduceScatter分发求和结果ReduceScatter 是 AllReduce 的逆操作先求和再分发给各卡。defreduce_scatter_example():world_sizedist.get_world_size()# 每张卡有一个大 tensorlocal_tensortorch.randn(world_size*1024).npu()# 准备接收 buffer大小是原来的 1/world_sizeoutputtorch.zeros(1024).npu()# ReduceScatterdist.reduce_scatter(output,[local_tensor],opdist.ReduceOp.SUM)print(fReduceScatter result:{output.mean()})实际应用分布式 MatMuldefdistributed_matmul(weight,input):分布式矩阵乘法权重按行切分# 本地计算local_outputtorch.matmul(weight,input)# AllGather 收集所有结果world_sizedist.get_world_size()all_outputs[torch.zeros_like(local_output)for_inrange(world_size)]dist.all_gather(all_outputs,local_output)# 拼接returntorch.cat(all_outputs,dim0)五、Broadcast广播数据Broadcast 把一张卡的数据广播给所有卡。defbroadcast_example():# 只有 rank 0 有数据ifdist.get_rank()0:datatorch.tensor([1.0,2.0,3.0]).npu()else:datatorch.zeros(3).npu()# 广播dist.broadcast(data,src0)print(fBroadcast result (rank{dist.get_rank()}):{data})实际应用同步模型权重defsync_model_weights(model):从 rank 0 同步模型权重到所有卡forparaminmodel.parameters():dist.broadcast(param.data,src0)六、Send/Recv点对点通信除了集合通信HCCL 也支持点对点通信。defp2p_example():rankdist.get_rank()ifrank0:# 发送数据给 rank 1datatorch.tensor([1.0,2.0,3.0]).npu()dist.send(data,dst1)print(Rank 0 sent data)elifrank1:# 从 rank 0 接收数据datatorch.zeros(3).npu()dist.recv(data,src0)print(fRank 1 received:{data})Pipeline 并行示例defpipeline_forward(layer,input_tensor,prev_rank,next_rank):Pipeline 并行的前向传播rankdist.get_rank()# 从上一张卡接收输入ifprev_rank0:dist.recv(input_tensor,srcprev_rank)# 本层计算outputlayer(input_tensor)# 发送给下一张卡ifnext_rank0:dist.send(output,dstnext_rank)returnoutput七、通信组管理复杂场景下需要创建子通信组比如模型并行和数据并行混合。defcreate_comm_groups():创建通信组world_sizedist.get_world_size()rankdist.get_rank()# 假设 8 张卡分成 2 组做模型并行# 组 0: [0, 1, 2, 3], 组 1: [4, 5, 6, 7]model_parallel_groups[[0,1,2,3],[4,5,6,7]]# 数据并行组同一位置跨模型并行组data_parallel_groups[[0,4],[1,5],[2,6],[3,7]]# 找到当前 rank 属于哪个组forgroupinmodel_parallel_groups:ifrankingroup:model_parallel_groupdist.new_group(group)breakforgroupindata_parallel_groups:ifrankingroup:data_parallel_groupdist.new_group(group)breakreturnmodel_parallel_group,data_parallel_group使用子通信组defhybrid_parallel_train(model,input,model_parallel_group,data_parallel_group):混合并行训练# 模型并行前向传播在模型并行组内outputmodel(input)# 数据并行梯度同步在数据并行组内forparaminmodel.parameters():ifparam.gradisnotNone:dist.all_reduce(param.grad,opdist.ReduceOp.SUM,groupdata_parallel_group)param.grad/dist.get_world_size(groupdata_parallel_group)八、性能优化技巧1. 通信与计算重叠defoverlap_comm_compute(model,input):通信和计算重叠# 计算梯度outputmodel(input)lossoutput.sum()loss.backward()# 异步通信handles[]forparaminmodel.parameters():ifparam.gradisnotNone:handledist.all_reduce(param.grad,async_opTrue)handles.append(handle)# 做其他计算比如更新优化器状态optimizer.step()# 等待通信完成forhandleinhandles:handle.wait()2. 梯度累积减少通信频率defgradient_accumulation(model,dataloader,accumulation_steps):梯度累积减少通信次数optimizertorch.optim.AdamW(model.parameters())fori,(input,target)inenumerate(dataloader):outputmodel(input)losscriterion(output,target)/accumulation_steps loss.backward()if(i1)%accumulation_steps0:# 只在累积步数到达时通信forparaminmodel.parameters():ifparam.gradisnotNone:dist.all_reduce(param.grad)param.grad/dist.get_world_size()optimizer.step()optimizer.zero_grad()3. 拓扑感知importos# 手动指定拓扑配置os.environ[HCCL_TOPO_JSON]/path/to/topo.json# 或让 HCCL 自动探测os.environ[HCCL_TOPO_DETECT]enable九、HCCL vs NCCL 性能对比ResNet50 训练8 卡batch32指标NCCL (A100)HCCL (910)单步时间185ms162ms通信占比28%21%带宽利用率82%90%加速比6.5x7.2xHCCL 在拓扑感知和带宽利用率上有优势尤其是在非对称拓扑的环境下。参考资源HCCL API 文档https://www.hiascend.com/document/detail/zh/CANN/分布式训练最佳实践https://www.hiascend.com/document/detail/zh/CANN/HCCL 性能调优指南https://www.hiascend.com/document/detail/zh/CANN/分布式训练样例https://atomgit.com/cann/models总结HCCL 的 API 和 NCCL 兼容迁移成本低。核心操作包括AllReduce 做梯度同步、AllGather 收集数据、ReduceScatter 分发求和结果、Broadcast 广播权重。性能优化的关键是通信与计算重叠、梯度累积减少通信频率、拓扑感知选择最优路径。在昇腾 910 上HCCL 的带宽利用率能到 90%比 NCCL 在 A100 上高 8 个百分点。混合并行场景下用new_group创建子通信组让模型并行和数据并行各走各的通信通道。
http://www.zskr.cn/news/1373466.html

相关文章:

  • 别再为单细胞数据批次效应发愁了!手把手教你用Harmony算法搞定整合分析
  • Taotoken 用量看板与账单追溯功能的实际使用感受
  • 从0到10万粉:用ChatGPT批量生成B站选题、脚本、标题、简介、弹幕预埋——完整工作流拆解,含5大防限流校验节点
  • 别被忽悠了!2026实测靠谱的AI写作辅助平台|实测必入避坑版
  • 深入理解 LSTM:从数学公式到 Excel 手工推导全揭秘
  • AgentScope Java 入门:Tool 工具系统——让 Agent 真正“动手做事“
  • 安全测试新手避坑指南:Windows下用X-ray进行被动扫描时,为什么我扫不到漏洞?
  • 逆向分析第一步:手把手教你搭建WinDbg+VMware双机调试环境(含问题排查)
  • 告别传统MMSE:用Python快速上手基于深度学习的5G信道估计(附VehA/SUI5信道对比)
  • Capsule技术:游戏引擎与数据中心资源隔离的创新方案
  • Cortex-M处理器RXEV输入详解与应用优化
  • 从传感器到推理端:VLA 机器人 TCP 通信与 msgpack 序列化深度解析
  • Rydberg原子接收器:量子传感技术的突破与应用
  • Ubuntu 20.04 ROS新手避坑:catkin_make报‘empy’错误的完整解决流程
  • ARM SME指令集浮点运算优化指南
  • 神经网络量化技术:TruncQuant在边缘计算中的高效实现
  • OpenClaw强势推出V2026.5.20版本地部署最新教程来啦!3分钟一键安装中文版可视化操作指南
  • ARM SME指令集:矩阵运算与数据传输优化指南
  • 2026年5月视频剪辑制作培训机构排行实测盘点:软件测试线下就业培训/AI软件测试培训/外贸电商设计培训/影视特效剪辑培训/选择指南 - 优质品牌商家
  • 手把手教你用Yalmip+Gurobi复现顶刊论文:配电网应急电源预配置的鲁棒优化实战
  • CNSH 语义接入规范 v2.0·功能语义技术用词对照表 + 协作宣言|中英对照·行话翻译·DNA锚链
  • 胖头鱼的技术专栏-427 AI Agent记忆系统可视化页面介绍(20260524)
  • 2026年5月新发布河南IPO企业股权激励选择指南 - 2026年企业推荐榜
  • CVE漏洞编号规范与开源项目安全验证指南
  • Kylin V10 SP1 上 auditd 服务内存泄漏排查与修复实录(附升级包下载)
  • ARM ETE协议数据包解析与嵌入式调试实践
  • 边缘计算深度学习模型优化:MARCO框架技术解析
  • Arm DS自定义组件XML配置与调试技巧
  • 动态稀疏训练与对角线稀疏模式优化实践
  • Burp Suite Intruder四种攻击模式原理与实战建模