近年来,FPGA的概念越来越多地出现。例如,比特币挖矿使用基于FPGA 的矿机。另外,微软此前还表示将使用FPGA来“替代”数据中心的CPU等。
事实上,FPGA对于专业人士来说并不陌生。它一直被广泛使用。然而,大多数人仍然对其了解不多,并存在很多疑问。 ——FPGA到底是什么?为什么要使用它?与CPU、GPU、ASIC(专用芯片)相比,FPGA有哪些特点?
今天,带着这一系列问题,让——来揭秘FPGA的秘密。
为什么使用FPGA?
众所周知,通用处理器(CPU) 的摩尔定律已到了暮年,而机器学习和Web 服务却呈指数级增长。
人们使用定制硬件来加速常见的计算任务,但快速变化的行业要求这些定制硬件可以重新编程以执行新型计算任务。
FPGA 是一种硬件可重构架构。其英文全称是Field Programmable Gate Array,中文名称是Field Programmable Gate Array。
多年来,FPGA 一直被用作专用芯片(ASIC) 的小批量替代品。但近年来,它已在微软、百度等公司的数据中心大规模部署,既提供强大的计算能力,又提供足够的灵活性。
为什么FPGA 速度快? “他们都被同龄人衬托得很好。”
CPU和GPU都属于冯诺依曼结构,具有指令解码和执行以及共享内存。 FPGA之所以比CPU甚至GPU更节能,本质上是得益于无指令和共享内存架构带来的好处。
在Feng结构中,由于执行单元(如CPU核)可以执行任意指令,因此需要指令存储器、译码器、各种指令的运算单元以及分支跳转处理逻辑。由于指令流的控制逻辑复杂,不可能有太多独立的指令流。因此,GPU使用SIMD(单指令流多数据流)来允许多个执行单元以相同的速度处理不同的数据。 CPU还支持SIMD。操作说明。
FPGA中各个逻辑单元的功能在重新编程(烧录)时就已经确定,不需要指令。
冯的结构中对记忆的使用有两个目的。一是保存状态,二是执行单元之间进行通信。
由于内存是共享的,所以需要访问仲裁;为了利用访问局部性,每个执行单元都有一个私有缓存,这需要维护执行组件之间的缓存一致性。
出于保存状态的需要,FPGA中的寄存器和片上存储器(BRAM)属于自己的控制逻辑,不需要不必要的仲裁和缓存。
关于通信需求,FPGA的各个逻辑单元与周围逻辑单元之间的连接在重编程(烧录)时已经确定,不需要通过共享内存进行通信。
说了三千尺,那么FPGA实际表现如何呢?让我们分别看看计算密集型任务和通信密集型任务。
计算密集型任务的示例包括矩阵运算、图像处理、机器学习、压缩、非对称加密、Bing 搜索排序等。此类任务通常涉及CPU 将任务卸载到FPGA 来执行。对于这类任务,我们目前使用的Altera(好像叫Intel,我还是习惯叫Altera)的Stratix V FPGA的整数乘法性能基本相当于20核CPU,而浮点乘法性能相当于8核CPU。基本相当,但比GPU 低一个数量级。我们即将使用的下一代FPGA Stratix 10 将配备更多乘法器和硬件浮点单元,理论上可以提供与当今顶级GPU 计算卡相当的计算能力。
在数据中心,FPGA相对于GPU的核心优势是延迟。对于Bing 搜索排名等任务,尽快返回搜索结果需要最大限度地减少每个步骤的延迟。
如果使用GPU进行加速,为了充分利用GPU的计算能力,batch size不能太小,延迟会高达毫秒级。
使用FPGA进行加速只需要微秒级的PCIe延迟(我们现在的FPGA用作PCIe加速卡)。
未来,Intel推出通过QPI连接的Xeon+FPGA后,CPU和FPGA之间的延迟可以降低到100纳秒以内,这与访问主存没有什么区别。
为什么FPGA 的延迟比GPU 低得多?
这本质上是架构上的差异。 FPGA同时具有流水线并行性和数据并行性,而GPU几乎只有数据并行性(流水线深度有限)。
例如,处理一个数据包有10个步骤。 FPGA可以构建10级流水线。管道的不同阶段处理不同的数据包。每个数据包经过10个阶段后进行处理。每处理完一个数据包,就可以立即输出。
GPU的数据并行方式是创建10个计算单元。每个计算单元也处理不同的数据包。然而,所有计算单元必须以统一的速度执行相同的操作(SIMD,单指令多数据)。这就要求10个数据包必须一起输入输出,输入输出延迟增加。
当任务一个接一个而不是批量到达时,管道并行可以实现比数据并行更低的延迟。因此,对于流式计算任务,FPGA相对于GPU具有先天的延迟优势。
计算密集型任务,CPU、GPU、FPGA、ASIC的数量级对比(以16位整数乘法为例,数字只是数量级的估计。
ASIC专用芯片在吞吐量、延迟和功耗方面都无可挑剔,但微软并未采用它们,原因有二:
数据中心的计算任务灵活多变,ASIC研发成本高、周期长。好不容易为某个神经网络大规模部署了一批加速卡后,另一个神经网络变得更加流行,钱就被浪费了。 FPGA 只需几百毫秒即可更新逻辑功能。 FPGA 的灵活性可以保护投资,事实上,微软当前的FPGA 方法与最初设想的有很大不同。
数据中心租给不同的租户。如果有的机器有神经网络加速卡,有的机器有Bing搜索加速卡,有的机器有网络虚拟化加速卡,任务调度和服务器运行维护都会很麻烦。使用FPGA 可以保持数据中心的同质性。
接下来让我们看看沟通密集型任务。
与计算密集型任务相比,通信密集型任务在处理每个输入数据方面不太复杂,基本上通过简单的计算将其输出。这个时候,沟通往往成为瓶颈。对称加密、防火墙和网络虚拟化都是通信密集型的例子。
通信密集型任务,CPU、GPU、FPGA、ASIC的数量级对比(以64字节网络数据包处理为例,数字只是数量级的估计)
对于通信密集型任务,FPGA比CPU和GPU具有更大的优势。
在吞吐量方面,FPGA上的收发器可以直接连接40 Gbps甚至100 Gbps的网线,以线速处理任意大小的数据包;而CPU需要从网卡接收数据包来处理,而很多网卡无法线速处理64字节的小数据包。虽然通过插拔多个网卡可以实现高性能,但CPU和主板支持的PCIe插槽数量往往有限,而且网卡和交换机本身也很昂贵。
从延迟方面来说,网卡从CPU接收数据包,CPU发送给网卡。即使使用DPDK这样的高性能数据包处理框架,延迟也在4~5微秒。更严重的问题是通用CPU的延迟不够稳定。例如,当负载较高时,转发延迟可能会上升到几十微秒甚至更高(如下图所示);现代操作系统中的时钟中断和任务调度也增加了延迟的不确定性。
ClickNP(FPGA)与Dell S6000交换机(商用交换机芯片)、Click+DPDK(CPU)和Linux(CPU)的转发延迟比较,误差线分别为5%和95%。来源:[5]
虽然GPU也能高性能处理数据包,但是GPU没有网口,这意味着数据包需要先由网卡采集,然后让GPU来做处理。因此,吞吐量受到CPU 和/或网卡的限制。更不用说GPU本身的延迟了。
那么为什么不将这些网络功能内置到网卡中,或者使用可编程交换机呢? ASIC 的灵活性仍然是一个缺陷。
尽管可编程交换芯片的功能越来越强大,例如支持P4语言的Tofino,但ASIC仍然无法进行复杂的状态处理,例如某种自定义加密算法。
综上所述,FPGA在数据中心的主要优势是稳定和极低的延迟,适合流式计算密集型任务和通信密集型任务。
微软部署FPGA的实践
2016年9月,《连线》杂志发表了一篇报道《微软将未来押注于FPGA》[3],讲述了Catapult项目的前世今生。
紧接着,Catapult项目的老大Doug Burger在Ignite 2016大会上与微软CEO Satya Nadella一起演示了FPGA加速的机器翻译。
展示的总计算能力为103万T ops,即1.03 Exa-ops,相当于10万张顶级GPU计算卡。一块FPGA(加上板载内存和网络接口等)的功耗约为30W,仅使整个服务器的功耗增加十分之一。
微软对FPGA的部署并非一帆风顺。关于FPGA部署在哪里的问题,大致经历了三个阶段:
专用的FPGA 集群中充满了FPGA。每台机器有一个FPGA。使用专用网络将每台机器连接到一个FPGA。它放置在网卡和交换机之间。这种共享服务器网络的方法有几个问题:
不同机器的FPGA不能互相通信。 FPGA 能够处理的问题规模受到单个服务器上FPGA 数量的限制。数据中心的其他机器必须向这个机柜发送任务,这就构成了in-cast和网络延迟。想要稳定很难。 FPGA 专用机柜构成单点故障。一旦坏掉,谁都无法停止加速。搭载FPGA的服务器是定制的,增加了散热和运维的麻烦。 FPGA 使用带有172K ALM、2014 M20K 片上存储器和1590 个DSP 的Stratix V D5。板载8GB DDR3-1333 内存、一个PCIe Gen3 x8 接口和两个10 Gbps 网络接口。机柜之间的FPGA通过专用网络连接。一组10G网口以8个为一组连接成环,另一组10G网口以6个为一组连接成环,无需使用交换机。
这样一个由1632台服务器和1632颗FPGA组成的集群,将Bing搜索结果排序的整体性能提升到了2倍(换句话说,节省了一半的服务器)。
Bing 的FPGA 部署取得了成功,Catapult 项目继续在公司内部扩展。
微软内部拥有最多服务器的部门是云计算Azure部门。
Azure 部门面临的一个紧迫问题是与网络和存储虚拟化相关的开销。 Azure向客户销售虚拟机,需要为虚拟机的网络提供防火墙、负载均衡、隧道、NAT等网络功能。由于云存储的物理存储与计算节点分离,数据需要通过网络从存储节点传输并进行压缩和加密。
在1 Gbps网络和机械硬盘时代,网络和存储虚拟化的CPU开销可以忽略不计。随着网络和存储速度越来越快,网络达到40Gbps,SSD吞吐量达到1GB/s,CPU逐渐无法满足要求。
例如,Hyper-V虚拟交换机只能处理约25 Gbps的流量,无法达到40 Gbps的线速。当数据包较小时,性能更差;对于AES-256 加密和SHA-1 签名,每个CPU 核心只能处理100 MB。 /s 仅为SSD 吞吐量的十分之一。
为了加速网络功能和存储虚拟化,微软在网卡和交换机之间部署了FPGA。
如下图所示,每个FPGA都有一个4GB DDR3-1333 DRAM,通过两个PCIe Gen3 x8接口(物理上是PCIe Gen3 x16接口,因为FPGA没有x16硬核,与CPU插槽连接,并且在逻辑上被视为两个x8)。物理网卡(NIC)是普通的40Gbps网卡,仅用于主机与网络之间的通信。
Azure服务器部署FPGA架构。
FPGA(SmartNIC)为每个虚拟机虚拟出一张网卡,虚拟机通过SR-IOV直接访问这张虚拟网卡。原来在虚拟交换机中的数据平面功能已移至FPGA中。虚拟机不需要CPU参与发送和接收网络数据包,也不需要经过物理网卡(NIC)。这不仅节省了可用于出售的CPU资源,还提高了虚拟机的网络性能(25 Gbps),将同一数据中心内虚拟机之间的网络延迟降低了10倍。
网络虚拟化加速架构。来源:[6]
这是微软部署FPGA的第三代架构,也是目前大规模部署“一服务器一FPGA”的架构。
用FPGA复用主机网络的初衷是为了加速网络和存储。更深远的影响是将FPGA之间的网络连接扩展到整个数据中心的规模,打造真正的云规模“超级计算机”。
在第二代架构中,FPGA之间的网络连接仅限于同一机架。 FPGA之间的专网互连规模难以扩展,通过CPU转发成本太高。
在第三代架构中,FPGA之间通过LTL(轻量级传输层)进行通信。同机架内时延在3微秒以内; 8微秒内可达到1000个FPGA; 20微秒即可到达同一数据中心内的所有FPGA。虽然第二代架构在8台机器内延迟较低,但只能通过网络访问48个FPGA。为了支持广泛的FPGA间通信,第三代架构中的LTL还支持PFC流控制协议和DCQCN拥塞控制协议。
纵轴:LTL延迟,横轴:可达的FPGA数量。资料来源:[4]
FPGA内部逻辑模块之间的关系,其中每个Role是用户逻辑(如DNN加速、网络功能加速、加密),外部部分负责每个Role之间的通信以及Role与外设之间的通信。资料来源:[4]
由FPGA组成的数据中心加速平面位于网络交换层(TOR、L1、L2)和传统服务器软件(运行在CPU上的软件)之间。资料来源:[4]
通过高带宽、低延迟网络互连的FPGA 构成了网络交换层和传统服务器软件之间的数据中心加速平面。
除了每台提供云服务的服务器所需的网络和存储虚拟化加速外,FPGA上的剩余资源还可以用于加速Bing搜索和深度神经网络(DNN)等计算任务。
对于许多类型的应用程序,分布式FPGA 加速器的性能随着扩展而提高是超线性的。
例如,在CNN推理中,当仅使用一颗FPGA时,由于片上存储器不足以存储整个模型,因此需要不断访问DRAM中的模型权重。性能瓶颈在DRAM;如果FPGA的数量足够多,则每个FPGA负责模型的一部分。一层或一层中的几个特征可以让模型权重完全加载到片上存储器中,从而消除DRAM的性能瓶颈,充分利用FPGA计算单元的性能。
当然,太多细节也会导致沟通开销增加。将任务拆分为分布式FPGA 集群的关键是平衡计算和通信。
HaaS 上从神经网络模型到FPGA。利用模型内的并行性,模型的不同层和特征被映射到不同的FPGA。资料来源:[4]
在MICRO'16大会上,微软提出了硬件即服务(HaaS)的概念,利用硬件作为可调度的云服务,使FPGA服务的集中调度、管理和大规模部署成为可能。
硬件即服务(HaaS)。资料来源:[4]
从第一代充满FPGA的专用服务器集群,到第二代通过专用网络连接的FPGA加速卡集群,再到目前复用数据中心网络的大规模FPGA云,三个思路指导着我们的路线:
硬件和软件不是相互替代,而是相互配合;
必须具有灵活性,即使用软件定义的能力;它必须具有可扩展性。 FPGA在云计算中的作用
最后说一下我个人对于FPGA在云计算中的作用的看法。作为一名三年级博士生,我在微软亚洲研究院的研究试图回答两个问题:
FPGA 在云规模网络互连系统中应发挥什么作用?如何高效、可扩展地对FPGA+CPU异构系统进行编程?
我对FPGA行业最大的遗憾是,数据中心中FPGA的主流使用,从微软以外的互联网巨头,到两大FPGA厂商,再到学术界,大多都把FPGA当作像GPU一样的计算密集型任务。加速卡。但FPGA 真的适合做GPU 所做的事情吗?
如前所述,FPGA和GPU最大的区别在于架构。 FPGA更适合需要低延迟的流处理,GPU更适合处理大批量的同质数据。
由于很多人计划使用FPGA作为计算加速卡,因此两大FPGA厂商推出的高级编程模型也是基于OpenCL,模仿GPU基于共享内存的批处理模式。要让FPGA做某事,CPU需要先将其放入FPGA板上的DRAM中,然后告诉FPGA开始执行。 FPGA将执行结果放回到DRAM中,然后通知CPU取回。
当CPU 和FPGA 可以通过PCIe 高效通信时,为什么还要一直到板上的DRAM?也许是工程实现的问题。我们发现写入DRAM、启动内核以及通过OpenCL 读取DRAM 需要1.8 毫秒。通过PCIe DMA通信仅需1~2微秒。
OpenCL中多个内核之间的通信就更夸张了,默认的方式也是通过共享内存。
正如本文开头提到的,FPGA 比CPU 和GPU 更节能。其架构的根本优势在于它没有指令,也不需要共享内存。在顺序通信(FIFO)的情况下,不需要使用共享内存在多个内核之间进行通信。此外,FPGA 上的DRAM 通常比GPU 上的DRAM 慢得多。
因此,我们提出了ClickNP网络编程框架[5],它使用通道而不是共享内存在执行单元(元素/内核)、执行单元和主机软件之间进行通信。
需要共享内存的应用也可以基于管道来实现。毕竟,CSP(通信顺序进程)和共享内存在理论上是等价的。 ClickNP目前还是一个基于OpenCL的框架,受到C语言描述硬件的限制(当然HLS确实比Verilog开发效率高很多)。理想的硬件描述语言很可能不是C语言。
ClickNP 使用通道在元素之间进行通信,来源:[5]
ClickNP 使用通道在FPGA 和CPU 之间进行通信,来源:[5]
低延迟流媒体需要最多的通信。但由于并行性和操作系统调度的限制,CPU的通信效率不高,时延不稳定。
另外,通信不可避免地涉及调度和仲裁。由于单核性能的限制以及核间通信的低效率,CPU的调度和仲裁性能受到限制,硬件非常适合这种重复性的工作。因此,我的博士研究将FPGA定义为通信的“大管家”,无论是服务器之间的通信、虚拟机之间的通信、进程之间的通信,还是CPU与存储设备之间的通信。所有通信均可使用FPGA 加速。
输赢并不重要。缺少指令既是FPGA 的优点,也是其缺点。
每次做不同的事情,都会占用一定量的FPGA逻辑资源。如果你要做的事情很复杂,重复性不是很高,就会占用大量的逻辑资源,大部分都会闲置。这时候最好采用冯诺依曼结构处理器。
数据中心的很多任务都是高度本地化、重复性的:有的是虚拟化平台需要做的网络、存储,都是通信;有的是虚拟化平台需要做的网络、存储,这些都是通信;另一部分是客户计算任务,例如机器学习、加密和解密。
首先,使用FPGA进行通信,这是它最擅长的。未来你也可以像AWS那样将FPGA作为计算加速卡租给客户。
无论通信、机器学习、加密解密,算法都非常复杂。如果试图用FPGA完全替代CPU,势必会导致FPGA逻辑资源的巨大浪费,增加FPGA程序的开发成本。更实用的做法是FPGA和CPU协同工作。局部性和重复性强的属于FPGA,复杂的属于CPU。
当我们使用FPGA来加速越来越多的服务,例如Bing搜索和深度学习时;当网络虚拟化、存储虚拟化等基础组件的数据平面由FPGA控制时;当FPGA组成的“数据中心加速平面”成为网络与服务器之间的鸿沟……似乎有一种FPGA将掌控全局的感觉,CPU上的计算任务将变得碎片化,由FPGA驱动。过去我们主要是基于CPU,将重复的计算任务卸载到FPGA;未来我们会变得基于FPGA,将复杂的计算任务转移给CPU吗?随着Xeon + FPGA 的出现,古老的SoC 会在数据中心找到新的生命吗?