将FPGA连接到伺服器主机之间的网路的具体做法是:将FPGA部署在计算机网卡(NIC)和外部乙太网交换机之间,这一方案称作(bump-in-the-wire)。如上图所示[1],FPGA绕过伺服器主机的CPU和网卡,直接处理从网路上到来的数据,并将处理好的数据传输到网路上。这样就实现了一个由FPGA组成的区域网,FPGA内部集成了MAC与PHY层的协议栈(称为Lightweight Transport Layer, LTL),以及转发的路由器(Eleastic Router, ER),其他网路的设备如交换机等,以及其他上层协议功能则直接利用现有的伺服器主机网路来实现,无需增加新的资源。FPGA结点在对网路数据包进行解析后,对数据进行相应的计算和处理,再将处理好的数据打包,通过乙太网口传输给下一个FPGA结点处理。
上图[1]以 CNN inference为例,每块 FPGA 负责模型中的一层或者一层中的若干个特征,计算完成后通过乙太网将结果传入下一块FPGA继续计算,直到计算出最终结果为止。这种方式的另一个好处是计算过程无需访问DRAM:模型权重完全载入片上内存,中间结果通过乙太网传输,因此,整个过程既不需要不断访问 DRAM 中获取模型权重,也不需要dram作为介质传递中间结果,这就消除了 DRAM 的性能瓶颈,完全发挥出 FPGA 计算单元的性能。
(关于微软的FPGA互连系统的更多细节,请参见文章:晶元架构换血!如何评价微软在数据中心使用FPGA?作者:李博杰
晶元架构换血!如何评价微软在数据中心使用FPGA? ?
www.msra.cn)
这样通过乙太网相连的FPGA集群,其传输带宽、延迟以及可扩放性,均与乙太网的性能相当。根据[1]中提供的结果,使用40G乙太网连接的FPGA之间的数据传输,在同一机架内延迟在 3 微秒以内;8 微秒以内可达 1000 块 FPGA;20 微秒可达同一数据中心的所有 FPGA。同一数据中心内部能够实现互连的FPGA数量,理论上高达25万块之多。
FPGA+乙太网的扩放方式,巧妙的利用了伺服器主机间现有的乙太网,实现了扩放性极大、延迟极小的大规模FPGA互联系统。且这种方式,所带来的额外硬体资源以及功耗很低,也无需引入额外的冷却系统。这是由于这种互连是基于已经存在的乙太网,而且FPGA本身功耗低、能效高
FPGA能够以这种方式进行互连,一方面得益于其自身对乙太网的良好支持的特性(收发机连接乙太网口,以及丰富的乙太网处理IP),另一方面,逻辑上FPGA本身可以作为一个「主机」独立工作,这也是其能够作为网路结点工作的必要条件。
而GPU,长期作为一个「加速」工具,是无法脱离CPU进行单独工作的。因此,下一小节将会看到,NVIDIA实现对GPU的大规模互连,是基于对高带宽汇流排的开发和支持的,而且CPU也是互连系统绕不开的障碍。
2. GPU的扩放性解决方案:GPU+NVLink+NVSwitch
NVIDIA为了实现GPU实现高速大规模互连,经历了两个阶段,首先是研发出高速的NVLink代替PCIe,实现了GPU之间的高速互连。接下来而为了突破PCB的物理瓶颈,研制了NVSwitch交换晶元,用于高速转发连接在该晶元的所有GPU之间的数据,实现这些GPU的两两连接。
NVIDIA推出了NVLink,接下来推出了升级版NVLink2.0,双向带宽高达50GBps,GV100 GPU拥有6个NVLink 2.0汇流排介面,这使得其带宽达到了300GB/s。相比之下,PCIe的双向带宽仅为32gbps,且绝大部分nv的GPU仅有一个PCIe介面,因此带宽与使用nvlink不可同日而语。
基于NVLink,NVIDIA在2017年推出了DGX-1及其升级版系统,它集成了8颗GP100 GPU。如图所示,这8颗GPU通过立方体样式的网状网路拓扑结构相连,其中一组4颗GPU可以实现两两连接,然后每颗GPU再和另一组相对应的GPU直连,最终实现了8颗GPU互联的设计。
而这种拓扑结构本质上并非8颗GPU两两相连,换言之,这8颗GPU在逻辑上并不是等价的,因此不能简单的视作一个大规模GPU。另一方面,这种汇流排直连方案很难进一步增加互联GPU的数量。其原因主要是 如此多的汇流排连接对PCB的布线和制造都是一个极大的难题,在DGX-1升级版的NVLink 2.0中已经达到了24条汇流排。况且如果要完成16颗GPU两两互联的话,其汇流排规模将急剧膨胀,甚至难以在PCB上完成
为了解决这个问题,英伟达设计了NVSwitch,其本质是一个专用的NVLink交换器,让所有的GPU都连接至交换晶元上,再由交换晶元实现数据的互联互通。现在发布的NVSwitch晶元拥有18个NVlink埠,在连接NVlink 2.0汇流排的时候,每个埠的双向带宽为50GB/s,整个NVSwitch的总带宽高达900GB/s。
基于NVSwitch,NVIDIA在2018年提出了DGX-2系统,如图所示,在DGX-2上,NVIDIA通过「8×GPU-6×NVSwitch-6×NVSwitch-8×GPU」的设计,实现了16颗gpu之间两两相连,每颗GPU都可以以相同的延迟和速度和其他GPU进行通讯 ,这样整个机器就可以被看做一个大型独立的GPU。
关于NVIDIA GPU互连方案的更多细节,请参见下文
NVIDIA造出16核心全球最大GPU,靠的就是它! ?
baijiahao.baidu.com值得注意的是,实现这样一个16个GPU两两互连的NVSwitch,其体积与功耗相当惊人,NVSwitch内部集成了20亿个晶体管,在采用了台积电12nm FFN工艺后功耗依然高达100W,需要采用主动散热方案才能正常运行。在封装方面,NVSwitch采用的是1940针的4平方厘米BGA封装方案, 规模巨大。
此外,从公布结构的介面数量上看,该连接系统最多支持18颗GPU, 要支持更多数量的GPU互连,需要进一步扩大NVSwitch规模和支持的连接数量。而从上文的NVSwitch的功耗数据来看,最大能支持的GPU互连数量应该不会有数量级级别的提升。
3 互连系统性能对比FPGA vs GPU
上表总结了上文讨论的可扩展FPGA系统和GPU系统的各方面性能的比较。对于FPGA,表1中给出了理论最大的规模及总算力;对于GPU,则列出了DGX-2的各项性能。
从表中可以看出,得益于乙太网的超高可扩展性,FPGA系统可达的理论最大总算力是DGX-2(深度学习)的5倍,但是乙太网的数据带宽却只有NVLink的十分之一。然而也正是因为GPU不得不使用板上点对点通信的汇流排相连,才限制了GPU的可扩展性,及其所能达到的理论最大算力。
当然,除了乙太网与板上连接的可扩展性差别所带来的理论最高算力与功耗的差别,两者的生态环境、开发特点等会带来各自不同的优势和缺陷,例如:
(1) 基于GPU的DGX-2,目前看来仅能作为云端伺服器集群中的单台伺服器使用,这意味著如果这台伺服器出现故障,则会很大程度上影响云端伺服器这部分任务的加速性能。而FPGA+乙太网结构中,每台伺服器上均有一块FPGA,单片FPGA故障对整个云端的性能影响可以很小。
(2) FPGA的开发周期与开发难度,相对于GPU仍然较长,生态环境也不如GPU完善。 因此这么大的理论算力最终有多少能真正发挥作用,还需要观望。Microsoft 在2017年发布了Project Brainwave,并在2018年Micro和ISCA上发表论文介绍了该工程的架构、指令集、并行设计等细节,笔者计划在后续的文章中对此进行详细的介绍并讨论
(3) 谈到生态环境,NVIDIA的NVLink并未得到Intel CPU的支持(NV的GPU支持6路NVLink而不是PCIe,人家Intel搭理你才怪…)。在伺服器生态环境上,Intel处理器相对于IBM,有著压倒性的优势。因此在DGX-2中,Intel-Xeon处理器与GPU之间仍使用低带宽的PCIe通信。
5 总结
本文从可扩放性的角度,分析并比较了基于FPGA和GPU的大规模互连方案。FPGA由于通过乙太网相连,因而具有极高的可扩放性,因此能达到的理论算力远高于GPU。而GPU的开发难度与生态环境都大大优于FPGA,但由于受制于物理连接的瓶颈,当前还无法进行超大规模互连,功耗问题也相当明显。无论是FPGA, GPU, 还是ASIC,在超高算力要求下的互连应用都存在著各自的问题,这些问题有些是器件本身的特性造成(FPGA的高开发周期,GPU需要板级互连),有些是推动不同方案的公司之间的相互竞争造成的技术无法融合(Intel的Xeon并不支持NVlink)。最后以萨缪尔森第18版经济学里的一句话结束本文,The essence of economic development is innovation and that monopolists in fact are the wellspring of innovation in a capitalism economy
[1] A Cloud-Scale Acceleration Architecture, MICRO16
https://www.microsoft.com/en-us/research/wp-content/uploads/2016/10/Cloud-Scale-Acceleration-Architecture.pdf ?
www.microsoft.com
[2] 你不知道的TPU 3.0,TPU Pod 以及Google A.I https:// cloud.tencent.com/devel oper/news/207700
推荐阅读: