我们帮客户组多节点训练集群,常被一个误解绊住。客户说,给我八张卡,我要八倍的算力。我们说,八张卡给你了,但你大概率拿不到八倍。
多卡不是简单的加法。卡与卡之间要通信,要同步梯度,要抢同一块内存和带宽。这些开销不处理,八张卡可能只给你四倍,甚至更糟,卡越多互相拖累越明显。我们见过一个客户,八卡训练速度只有单卡的三倍多,查了半天才发现是通信把算力全吃了,卡在空转等数据。
旋钮一:卡间互联
同一台机器内多张卡,用高带宽通道,梯度同步快,延迟可以忽略。跨机器就不一样了,要走网卡,带宽低一个量级,每同步一次都得等网络。所以能放一台机器的别拆开。一次有个客户坚持把训练拆到两台机器,说这样好管理,结果速度掉了一半,最后还是并回一台。
cluster: nodes: - id: node-0 gpus: [A100, A100, A100, A100] # 同机高带宽互联 topology: nvlink # 优先,跨机才走网络 cross_node_net: ib-200g # 跨节点用低延迟专用网络旋钮二:机器间网络
跨节点训练,节点之间要频繁交换数据。用低延迟专用网络,和用普通以太网,训练时间能差出一大截。我们见过客户自己组集群,卡是全旗舰,网络却是普通以太网,训练比单机还慢,查了一周才发现瓶颈在网线,换了专用网络后速度直接翻倍。
旋钮三:编排
多节点任务怎么起,节点挂了怎么重排,哪台慢了怎么绕开,得有一套编排系统,不能靠人手动敲命令。手动起八个节点,有一个没起来,整个训练就卡着。我们这边编排系统盯着每个节点的心跳,谁慢了就把它手上的活分流给快的,谁挂了就换一台顶上。有次一个节点磁盘坏了,系统五分钟内把任务迁到备用机,训练曲线连个坑都没出现。
旋钮四:通信策略
梯度不是非得每算一步就同步一次。累积几步再同步,能少很多通信次数,代价是精度上要调,有时候还要配合特定的优化器,否则模型可能训飘。视觉模型和大语言模型的通信节奏就不一样。我们给客户的默认是累积几步再同步,对精度极敏感的任务可以调到每步同步。
把旋钮产品化
我们把这些旋钮产品化,意思是客户不用自己逐个去配。他告诉我们任务类型和规模,平台把互联、网络、编排、通信这四项按经验设好,他拿到手就是一个能跑满的集群。一个新客户接入,从提需求到拿到跑满的集群,中间不该让他碰任何一个网络参数。
经验来自踩坑。除了网络坑,还见过编排没做好,一个慢节点把整体拖死;通信策略选错,精度掉得没法看,白烧一周电费。这些坑我们都替客户填过了,才敢把它产品化。
衡量标准:他实际拿到几倍
三十二卡那次,我们怎么配的
回到前面说的视觉大模型。三十二卡,我们没让它散在四台八卡机器上随便跑,而是先按通信密集度切分:梯度同步最频繁的步骤锁在同一台机器的 NVLink 内,只在必要时跨机走 200G 专用网络。通信策略设成累积四步同步一次,配合那个模型对应的优化器,精度没掉。最终实测二十六倍出头,客户自己跑基准验证了一遍才认。这个配置不是我们拍脑袋,是同类模型跑过几十次之后沉淀的默认值。不同模型吃不同的拓扑,视觉和语言训练的通信节奏不一样,我们不能用一套参数打天下。
多卡训练的功夫,一半在卡,一半在卡之外的连接和调度。我们做的事,就是把卡之外那一半替客户管起来。客户要的是八倍,我们负责让他真的拿到接近八倍。衡量我们做得好不好,不是给了他多少张卡,是他实际拿到几倍,这个数字我们盯得比他还紧。我们给一个做视觉大模型的客户组了三十二卡集群,实测拿到二十六倍出头,他一开始不信,自己跑基准验证了一遍才认。