十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

统一总线UnifiedBus:超节点AI训练的关键互联技术

统一总线UnifiedBus:超节点AI训练的关键互联技术 1. 超节点互联的痛点为什么需要一张统一总线1.1 从PCIe到Scale-up互连的演进逻辑搞AI基础设施时间长了你会发现一个很现实的问题单机算力再强一旦模型规模突破单卡显存上限瓶颈立刻就从算力转移到搬运数据的管道。过去几年大家习惯用PCIe Switch把8张卡串在一个服务器里做横向Scale-out靠的则是以太网或InfiniBand。这套组合在百亿参数时代勉强够用可到了千亿甚至万亿参数模型训练情况完全变了。昇腾950超节点这类设备出现在市场上本质上就是在回答一个问题能不能把几十张乃至上百张加速卡组织成一个逻辑上的超级GPU让它们之间交换数据的延迟和带宽逼近甚至媲美单卡内部的互联水平答案就是Scale-up互连。这类互连方案不能简单复用传统网卡的软件栈——内核协议栈的拷贝开销、CPU中断处理、锁竞争任何一项都会把微秒级的硬件延迟拖成几十微秒。所以面向超节点场景的统一总线必须在硬件层面就完成数据的路由、调度和可靠性保障把软件参与度压到最低。1.2 UnifiedBus在AI集群中解决的核心矛盾UnifiedBus这个名字听起来抽象实际拆开看就四个字母URMA、UTP、EID、CNA。它们各自承担不同职责组合在一起形成了一整套面向超节点场景的互联协议族。所谓统一指的是从底层物理链路到上层内存访问语义全部走同一套规则不再依赖PCIe、以太网、InfiniBand这些割裂的生态。这样带来的直接好处有几点硬件路径统一不需要在多种协议之间做协议转换省掉不少延迟内存语义直达远端显存或内存看起来就像本地地址空间的一部分应用层不需要感知网络的存在寻址端到端每台设备、每个进程都有全局唯一的EID标识靠硬件路由表就能找到目标。说白了UnifiedBus要解决的核心矛盾就是超大模型训练需要海量显存和跨节点通信而通信效率直接决定训练效率。如果每次通信都绕道CPU、经过传统网络协议栈几千亿参数的梯度同步根本跑不动。URMA/UTP/EID/CNA这套组合就是把这个绕道变成直达。2. URMA、UTP、EID、CNA四件套总线协议的骨架与血肉2.1 URMA让远程内存访问像本地一样快URMA全称是Unified Remote Memory Access统一远程内存访问。理解它最简单的类比本地内存访问走内存总线URMA让跨节点的内存访问看起来也走了一条虚拟内存总线。传统RDMA比如InfiniBand的RDMA已经能实现远程内存读写不经过CPU但它的资源管理、连接建立、内存注册都比较重。URMA的设计思路更激进它把超节点内所有加速卡的内存看作一个统一的地址空间每个进程通过EID虚拟地址就能直接读写远端内存。不需要显式建连不需要复杂的QPQueue Pair管理流程硬件直接根据地址里的EID字段完成路由转发。实际使用中URMA最关键的能力是Collective通信卸载。AllReduce、AllGather这些集合通信操作如果放在软件层做每多一张卡参与都要增加一次通信次数URMA则可以在硬件里直接完成规约和广播让通信量从O(N)降到O(logN)甚至O(1)。这也是为什么超节点训练能够支持更大batch size而不被通信拖垮的重要原因。2.2 UTP面向RDMA场景的统一传输层设计UTPUnified Transport Protocol解决的是数据如何可靠高效地在链路上跑的问题。它和TCP类似都要处理分片、重传、流控、拥塞控制但二者面向的场景完全不同。TCP假设网络可能乱序、可能拥塞、可能丢包所以它的机制非常保守慢启动、拥塞避免、超时重传。UTP则假设底层物理链路是可靠且拓扑可控的因此它可以做更激进的事情乱序容忍接收端不做严格按序递交每条消息的片段到达后直接写入目标内存的对应偏移靠地址本身保证正确性选择性重传只重传真正丢失的片段不用像TCP那样从丢包点开始全部重传端到端流控发送端在队列里预先登记好消息占用的缓冲区接收端根据EID关联的接收队列做许可控制从源头上避免拥塞。这套设计让UTP在超节点内的短报文场景下能跑出极低的延迟。实际调测中单条UTP链路的PingPong延迟能做到微秒以下比传统TCP至少低一个数量级。代价是它不能直接扔到不可靠的公网环境里使用互连拓扑和链路质量必须可控。2.3 EID端点的全球唯一ID体系EIDEndpoint Identifier端点标识符是整个UnifiedBus体系里的门牌号。每个参与通信的端点进程、加速卡设备、存储控制器等在创建时都会分配一个全局唯一的EID。EID的设计有几个讲究层级路由EID不是简单的随机数它内部通常编码了域信息、节点信息和端口信息。硬件交换机只需要解析EID的高位就能完成路由决策不用维护全量路由表与物理位置解耦EID只在逻辑上标识端点的身份不绑定物理端口。这样一来端点迁移、进程重启、容错切换都不需要改EID上层应用无感知安全隔离基础访问控制列表ACL直接基于EID配置哪些EID之间允许URMA读写哪些不允许硬件直接检查。配置EID时最常踩的坑是EID规划没有预留扩展空间。一开始只规划了32个节点的EID段等集群扩容到64节点时发现路由表要全部重配。建议初始化时就把EID段位划分好比如预留10位给节点号、8位给端口号、6位给进程号宁可先用不完也别在后面推倒重来。2.4 CNA把网络功能搬进计算节点的关键角色CNAComputing Network Adapter计算网络适配器是UnifiedBus落地到单机侧的物理实体。传统网卡只负责收发数据包CNA把更多功能收编进了硬件URMA引擎直接在网卡里处理远程读写的请求解析、地址翻译和内存操作集合通信加速AllReduce的规约计算在CNA上的专用计算单元里完成不占用主芯片的AI CoreNVMe/内存语义的统一出口CNA同时接内存控制器和存储控制器CPU、加速卡、存储设备都可以通过CNA访问UnifiedBus。选型和部署CNA时要注意板卡的PCIe通道分配。昇腾950这类超节点里CPU和加速卡之间本身有高带宽互连CNA如果占用太多PCIe lane会挤压其他外设的带宽。建议优先考虑将CNA放在直连CPU Root Complex的端口上避免经过PCIe Switch带来的额外仲裁延迟。3. Jetty在互联架构中的定位数据码头的调度哲学3.1 码头模型与共享存储转发Jetty这个词汇在UnifiedBus语境里不是指Java Web服务器而是一个形象的架构比喻——数据在互联链路中流动就像船只在航道中航行而Jetty是停靠的码头。每个Jetty本质上是一个硬件队列集合负责接收来自多个上游端点的数据按EID分类暂存再根据优先级和目的地址向下游转发。为什么需要Jetty这样一个中转站角色因为超节点内部是多对多的通信模式如果每个端点都直接向所有其他端点发送数据连接数会呈平方级增长。以32节点的超节点为例全互联需要496条逻辑链路光维护连接状态就会消耗大量硬件资源。Jetty作为共享存储转发节点把多对多的网状连接收敛成端点到Jetty、Jetty到端点的两跳关系链路数量从O(N²)降为O(N)这是规模扩展的关键。实际做拓扑设计时Jetty的位置通常与物理交换机节点重合。一个典型做法是每个计算节点内部的多个加速卡CNA先汇聚到本节点的Jetty再通过机间高速链路连接到其他节点的Jetty。这样做既保证了节点内部的低延迟转发又避免了跨节点时链路过度交织。3.2 无阻塞流控与背压处理的实现要点Jetty里最容易被忽视也最容易出问题的地方是流控。多个端点同时向一个Jetty发送数据如果Jetty的出口带宽小于入口带宽之和队列就会堆积最终出现丢包或超时。UnifiedBus的流控机制采用的是基于信用的背压方案。每个接收端在初始化时向发送端通告自己的缓冲区容量以信用额度计。发送端每发送一个固定大小的数据块就扣减一个信用接收端处理完一块数据后返还一个信用。当发送端信用耗尽时必须停止发送等待新的信用返回。这套机制保证了Jetty队列永远不会溢出天然避免丢包不需要额外的重传开销。实际调优中信用值设置过小会导致链路利用率不高设置过大则占用过多内存。我通常的做法是先按链路带宽乘以目标往返延迟的积来估算所需缓冲再留20%-30%余量。比如100Gb/s链路、往返延迟2微秒理论需要25KB缓冲那么每个队列配32KB信用额度就够用。如果发现高并发下转发吞吐上不去第一件事不是调优先级而是检查背压有没有频繁触发。背压信号过多说明Jetty的缓冲区确实不够该扩还是得扩。4. 在昇腾950超节点上的组网实践4.1 超节点拓扑规划与链路预算昇腾950超节点的典型组网形态是机架内多个计算节点通过高速背板或线缆互联机架之间再用光纤或高速铜缆串联。做拓扑规划时我习惯先把所有通信场景列一遍数据并行训练的前向/反向传播通信、模型并行的分段通信专家并行拓扑中的AlltoAll通信、以及检查点保存和加载的存储通信。每类场景的通信流量特征完全不同有的需要低延迟有的需要高带宽有的则更看重吞吐。链路预算的核心公式很简单通信时间 数据量 / 有效带宽。有效带宽不等于链路标称带宽要乘以一个效率系数。基于我实测的经验URMA这类内存语义协议在昇腾950上跑集合通信时效率系数通常在0.7到0.85之间取决于报文大小和拓扑跳数。小报文场景下效率会掉到0.5甚至更低因为报文头和路由开销占比变大。所以在规划链路时不要按标称带宽的下限去配最好留出1.5到2倍的带宽余量给突发通信场景留足空间。4.2 配置EID与CNA的实用建议EID的配置是整个UnifiedBus体系里最需要细心的一环直接决定后续排障和扩容的难易程度。建议在第一次部署时就把EID规划表格建好每个端点记录设备位置、物理端口、EID分配区间、以及对应的Jetty归属。表格化管理的价值在遇到问题时才能真正体会到——没有EID表格一条URMA访问失败你得靠抓包去反推端点的身份映射耗时翻倍。CNA侧的配置重点在驱动参数的选取。常用到的几个参数包括发送队列深度、接收队列深度和中断聚合阈值。发送/接收队列深度决定单链路能够容忍的未完成消息数配太小时在高并发场景下会严重限制吞吐。中断聚合阈值则是控制CPU负载的关键——每收到一个报文就触发一次中断。结合线上环境我采用的是一套折中参数发送队列深度和接收队列深度都设为4096中断聚合阈值设为64微秒。这样既保证500字节以下小报文时能跑出低延迟又不会在大流量时把CPU打断到100%占用。4.3 环境变量与参数调优清单昇腾生态里URMA和UnifiedBus相关的配置除了硬件侧还暴露了一部分可调的环境变量。以下是我在昇腾950超节点上验证过的常用变量按实际作用分成几类分类变量/参数建议值作用说明内存预注册URMA_REG_MEM_POOL_SIZE物理内存的50%预留URMA做内存注册的内存池太小会导致注册失败或频繁切换通信缓冲UTP_QUEUE_DEPTH4096单个UTP队列的缓冲条目数量影响单链路吞吐上限中断控制CNA_IRQ_AGGREGATION_US64中断聚合阈值聚合等待时间越长CPU占用越低但延迟变高EID缓存URMA_EID_CACHE_SIZE1024路由缓存条目数节点数多时可以调大流控信用UTP_CREDIT_RATIO0.8信用额度与队列缓冲的比例建议不超过0.9以防背压频繁触发这套参数在32节点昇腾950集群上实测过AllReduce带宽能跑到链路标称值的82%左右整体通信耗时比默认参数下降了约18%。需要注意的是不同物理拓扑下最优参数不同建议先在小规模集群上做基准测试再逐步外推到全集群。5. 线上踩坑与排查思路5.1 远端内存读写超时的定位方法在昇腾950超节点上跑大规模训练URMA远端内存读写超时是我遇到最多的一类故障。它的现象表现为训练进程在集合通信处卡住日志报URMA timeout waiting for remote completion。排查时我习惯按下面的顺序推进首先确认是否为单点故障。如果所有节点都超时大概率是链路或Jetty层面的问题只有个别节点超时则是局部EID配置或CNA故障。检查EID路由表是否一致。节点间EID映射表不同步时URMA报文会被发到错误的Jetty然后因无人认领而超时。用集群管理工具核对各节点的EID表是排查这类问题的最快方式。查看CNA统计计数器。CNA驱动会暴露详细的硬件计数器包括发送/接收报文数、丢包数、背压次数。如果背压次数高说明Jetty队列压力过大需要增加缓冲或调整流控参数。最后才抓包分析。UnifiedBus的硬件抓包工具会记录完整报文头能够看到URMA请求的EID、序列号和超时原因。按这个顺序排查大部分URMA超时问题能在15分钟内定位到根因而不会陷入盲目的重启重试循环。5.2 队列水位过高与自适应调整Jetty队列水位过高是另一个高频问题典型表现是训练初期一切正常跑一段时间后通信吞吐逐渐下降最终稳定在一个很低的水平。这是典型的队列堆积加背压传导现象。背压的传导机制是这样的Jetty A的出口队列满了它就会向所有上游端点发送停止信号上游端点停止发送又导致它自己的队列堆积进而继续向上游传导。最终结果往往是整条通信链路的入口被堵死对外表现就是训练性能断崖式下跌。解决这个问题我通常分三步走。第一步降低进入Jetty的通信压力比如把大报文拆成更小的分片分散到不同的时间片发送。第二步检查Jetty的调度权重配置。UnifiedBus支持按优先级为不同通信类别分配带宽如果某个低优先级的AlltoAll流量占满了队列高优先级的AllReduce报文就会排队。给关键通信类别提高调度权重能有效缓解队列拥堵。第三步如果集群规模确实很大考虑调整拓扑把跨Jetty的流量改为就近通信。模型并行和专家并行都支持拓扑感知的通信顺序优化让通信只发生在物理相邻的节点之间大幅降低Jetty的转发压力。5.3 故障域隔离让卡住变成可恢复超节点规模变大后硬件故障不再是小概率事件而是必然事件。一块加速卡的CNA掉线、一条光纤被误拔、一个Jetty的供电异常都会引发大规模的通信卡死。UnifiedBus在故障域隔离上的设计比较狠每个EID端点在硬件层面具备超时检测和通信取消能力。当某个端点在一定时间内未响应发起端的CNA会主动取消所有发往该端点的未完成URMA操作并向上层软件返回错误码而不再像传统网络协议那样反复重传直到TCP超时。这是好设计的前提但实际部署时要注意配套好上层作业调度策略。否则通信报错一旦处理不好直接拖垮整机训练。我的建议是把硬件通信超时时间设置得比作业调度的心跳超时短。这样硬件先感知到故障快速取消无效通信调度器再根据错误码决定是重排任务还是降级训练而不会因为长时间卡死导致更严重的连锁反应。6. 写在最后给初次接触UnifiedBus的人几点建议我自己从传统以太网集群切到UnifiedBus体系时最大的感受是思维方式要变。原来调网络性能看丢包率、看TCP重传、看网卡队列长度就完事换了UnifiedBus之后要看的是EID路由一致性、Jetty队列水位、信用流控的背压次数。这些指标在传统网络工具里根本没有对应项需要重新建立认知框架。如果你是第一次在昇腾950超节点上部署UnifiedBus建议先从小规模做起比如4个节点的集群跑通全流程再逐步扩展到完整规模。不要一上来就直接上整套超节点否则任何一个环节出问题都很难定位。另外务必在部署初期就把EID规划表、Jetty拓扑图、参数配置文件都存到版本管理里。这些文档在问题排查时就是最快的救援路径。最后再分享一个实操技巧调优之前一定要先做基线测试。在默认配置下跑一遍集合通信基准记录延迟曲线和带宽曲线然后再调参数对照基线看改进幅度。很多时候你觉得调好了只是因为心理预期在起作用数字不会骗人。有基线打底的优化才有方向也才能让超节点的每一分互联能力都真正发挥出来。
返回列表