在聊聊GPU通信那些事儿中,我们谈到了支持GPU通信的一些关键技术要点。
接下来,我们就来谈谈GPU集群网络的优化方法。
通过网络将更多GPU连接起来,构成一个GPU资源池,可以满足大规模、分布式AI训练任务的需要。因此,我们就针对高性能、大规模、高可用这3个目标分别展开讨论。
、高性能
我们现在的AI训练任务绝大多数属于同步训练,即每个batch结束之后,所有GPU之间需要等待数据同步完成后,才能开始下一个batch。
从这个图可以看到,通信时长很大程度上取决于在整个通信过程中,最慢的那个环节。与单机不同,多机之间的网络带宽是比单机内部的带宽要低很多的。比如单机内部最新的NVLink3.0带宽高达GB/s;而多机之间的网络最新的InfiniBandNDR是Gb/s,HDR是Gb/s。注意单位,一个是GB,一个是Gb,几乎差了一个数量级。
其次是复杂程度,单机内部的GPU互联,相对来说还是比较简单的,通过NVLink可以实现全连接结构。跨服务器走网络,特别是规模大了之后,网络结构就会变复杂,对硬件要求也更高。
所以,在性能方面的优化手段:
①提升单机网络接入带宽
优化方法一:速率提升。网卡速率的提升对AI来说是一大利好,从40G到最新的G,逐级跃升,数据传输的带宽瓶颈逐步被打开。需要注意的是,网卡并不是孤立的存在,需要服务器和网络架构上的配合。比如PCIe总线的支持,网络交换机Serdes支持。具体见下表。
优化方法二:数量提升。前期的GPU服务器通常都是少数几张网卡,CPU和GPU共用。现阶段,由于通信需求的提升,我们可以给CPU准备单独的1-2张网卡,给GPU准备额外的4-8张网卡。这样就可以成倍数提升单机接入带宽。同样的,增加网卡数量,也需要PCIe的支持和网络交换机支持。
②应用RDMA网络
在带宽得到保障之后,接下来就是考虑如何充分利用带宽。传统的TCP网络高度依赖CPU对报文的处理,这种方式几乎很难把所有带宽全部用满。因此,在AI环境中,要使用大规模集群训练,RDMA几乎是必须要采用的网络传输技术。
RDMA支持的大规模GPU训练场景主要有2个:多机之间GPU通信、GPU与存储系统的通信。
与之相对应的优化算法有:GPUDirectRDMA、GPUDirectStorage。
关于RDMA的优势及这2个场景的介绍,可以参考《聊聊GPU通信那些事儿》。
③减少网络拥塞
集群大了之后,网络结构会变复杂,拥塞问题不可避免。报文从源到目的之间可能存在多条等价路径,交换机上需要采用哈希算法把不同的连接映射到不同的路径上,这样一旦存在哈希冲突,就会导致实际的数据吞吐受到影响。比如两个G的连接被映射到同一条链路上,那么每个连接最多只能获得50G带宽,通信效果减半。
优化方法一:保证1:1的收敛比。就是交换机的上行链路数量要等于下行链路数量,这样可以最大程度减少冲突概率。
优化方法二:双网分离。CPU的流量与GPU流量彻底分离开,各行其道,减少相互之间的影响。而且,分离之后也更方便各自进行流量优化。
④通信算法优化
目前比较常用的GPU通信算法就是Ring-Allreduce。其基本思想就是让GPU形成一个环,让数据在环内流动。环中的GPU都被安排在一个逻辑中,每个GPU有一个左邻和一个右邻;它只会向它的右邻居发送数据,并从它的左邻居接收数据。
该算法分两个步骤进行:首先是scatter-reduce,然后是allgather。在scatter-reduce步骤中,GPU将交换数据,使每个GPU可得到最终结果的一个块。在allgather步骤中,GPU将交换这些块,以便所有GPU得到完整的最终结果。
那么,当GPU服务器从单机扩展到多机之后,这个环会是这样:
在早期,单机内部没有NVLink,网络上没有RDMA,带宽相对较低,单机分布式和多机分布式在带宽上没太大差别,所以建一个大环即可。
但是现在我们单机内部有了NVLink,在使用同样的方法就不合适了。因为网络的带宽是远低于NVLink,如果再用一个大环,那会导致NVLink的高带宽被严重拉低到网络的水平。其次,现在是具备多网卡的环境,如果只用一个环也无法充分利用多网卡优势。
因此,在这样的场景下建议采用两级环:首先利用NVLink高带宽优势在单机内部的GPU之间完成数据同步;然后多机之间的GPU利用多网卡建立多个环,对不同分段数据进行同步;最后单机内部的GPU再同步一次,最终完成全部GPU的数据同步。
、大规模
算力昂贵是大家普遍的共识。由于GPU资源本身就比较稀缺的特性,尽可能多的把GPU资源集中在一个统一的资源池里面,将有利于任务的灵活调度,减少AI任务的排队、减少资源碎片的产生、提升GPU的利用率。
要组成大规模GPU集群,网络的组网方式也需要进行优化:
①可伸缩网络架构
传统的三层网络架构“接入-汇聚-核心”,是一种聚合访问模型,对于进出数据中心南北向流量的业务形态非常有效,但也存在一些问题,比如:生成树导致的带宽浪费、数据链路过长导致的高延时、核心设备集中导致的扩展难问题。
因此,更适合数据中心东西向流量的“Spine-Leaf”网络架构应运而生。SpineLeaf设备的扁平化网络架构来源于CLOS网络,交换机按层次结构组网来实现高性能、无阻塞的大规模网络。
在大规模GPU集群中,通常会使用如下架构:
ToR交换机用于和GPUserver直接连接,向上一层是Leaf交换机,用来实现ToR之间的互联。一组ToR交换机和一组Leaf交换机之间可以实现无阻塞全连接架构,这样就共同组成网络上一个pod。
不同pod之间使用Spine交换机连接。Spine类似三层架构中的核心交换机,但形态有所变化:高端口密度高吞吐量的三层交换机替代了大型机箱式交换机,网络的压力从集中式负载于核心交换机,变成给许多的spine交换机来均衡分担。
通过这样的网络架构,集群的规模可以横向扩展到上万个网络接口。
保证ToR交换机的1:1收敛比,pod内部的连接与交换机的数目是无法调节的。能调节的就是Leaf交换机的收敛比与Spine交换机的数目。Leaf交换机的收敛比决定了多个pod之间的通信带宽,如果调度系统能感知拓扑,做到智能调度,相关联的任务正好放在一个pod内部,那么Leaf的收敛比无需做到1:1。
②计算与存储分离
在前面,我们也有稍微提到过的计算与存储双网分离。存储通信的性能对GPU集群整体的性能也是非常重要的,因此双网分离之后,存储节点也会参照上述的网络架构,会形成自己的存储pod。对调度系统而言,接受任务的GPUserver和所需数据集的存储节点也许要跨越不同的pod。因此,我们在考虑网络的时候,需要考虑到存储跨pod拉取数据,这样就能有效增加资源池的调度弹性,真正做到大规模集群。
、高可用
可用性问题在GPU集群中,通常会被弱化,因为大规模分布式的AI任务基本都是离线的训练任务,网络中断不会对主业务造成直接影响。虽说是离线业务,但是我们仍然需要