网络能成为AI加速器吗
摘要
人工神经网络(NNs)在许多服务和应用中扮演越来越重要的角色,并对计算基础设施的工作负载做出了重要贡献。在用于延迟敏感的服务时,NNs通常由CPU处理,因为使用外部专用硬件加速器会效率低下。然而,随着工作负载规模和复杂性的增长,CPU已经达到了计算极限,需要引入新的专门针对该任务的专用硬件加速器。在本文中,我们分析利用可编程网络设备,如网络卡和交换机,作为NN加速器的选项,以取代专门构建的硬件。为此,在本初步工作中,我们深入分析了在CPU上进行NN处理的属性,推导出有效分割此类处理的选项,并显示可编程网络设备可能是实现CPU的NN协处理器的适当引擎。
CCS概念
• 网络→可编程网络;网络内处理;
• 计算方法学→机器学习;
• 计算机系统组织→神经网络;
关键词
计算卸载;可编程交换机;智能网卡
1 引言
NN是一种机器学习工具,在分类任务中最近表现出比其他方法更好的性能,例如在计算机视觉中。该技术在不同领域的广泛应用显着影响了数据中心的工作负载,这些数据中心现在将大量计算资源用于执行NN [5]。
NN工作负载有两个阶段。训练阶段用于学习NN的权重,使NN适应特定任务。训练完成后,NN用于推理阶段。通常,训练是纯离线任务,计算成本高,但频率相对较低。推理阶段轻得多,但可能需要执行许多次,并具有潜在的非常严格的延迟约束,因为NN的预测可能作为在线服务的一部分使用。
由于计算成本高,训练阶段通常由专用硬件加速器执行,例如通用GPU。这些设备可以对大量数据进行并行计算,使计算更快,更便宜,因此具有经济可行性。尽管如此,使用加速器会产生一些开销。首先,数据需要在计算节点内移动,即从通用CPU,其中对其进行预处理,到连接到机器PCIe总线的加速器。其次,当前的加速器在处理更大的批次时提供更高的效率。附加的数据移动和批处理的需求最终影响整个端到端延迟。因此,使用常规CPU处理NN推理阶段通常更有效,特别是在处理延迟敏感的工作负载时 [6]。
不幸的是,Dennard的比例缩小挑战着进一步扩展CPU的计算能力的能力[4]。事实上,Facebook报告称,对于一些当前的机器学习工作负载,更高效的单个CPU机器被不那么高效但更强大的多CPU机器替换以匹配所需的性能水平[6]。同样,谷歌已经设计并部署了TPU,这是专门用于NN推理工作负载的自定义ASIC [9]。
鉴于这种前提,随着在线和时间敏感的推理工作负载增长,似乎我们只有两个选项来处理它们:i)使用今天的加速器进行在线NN处理,接受相关的低效率;ii)或经过努力和复杂性设计和部署新的专用加速器专门用于NN推理。
相反,我们寻求第三种替代方案,利用网络设备协助在计算机的CPU上执行的计算。换句话说:网络可以成为加速器吗?
我们的工作得出两个观察结果。首先,网络接口卡(NIC)和交换机越来越多地包括可编程功能。这种可编程性肯定有助于解决典型的网络数据包处理功能的实现,但它也为以有利于终端主机应用程序的方式执行数据包处理提供了巨大的机会[3,8,13]。也就是说,编程网络设备操作的能力突然将一个仅移动数据的愚笨管道变成了一个在数据流动时转换数据的处理管道。其次,这些设备已经坐落在数据路径上,这最小化了执行额外昂贵的数据移动的需求,并减少了端到端处理延迟。
为了实现这一愿景,我们提供了三个贡献:
i)我们详细分析了使用深度卷积NN执行推理所需的计算,并在不同的机器配置上对其进行了分析。我们的分析表明,在处理完全连接的层时,CPU不能以全速发挥作用,主要是因为需要由于内存缓存未命中而暂停CPU的流水线。
ii)建立在这一观察基础上,利用NN的分层结构,我们分析了分割NN处理的选项,以便将(一部分)NN的层从CPU卸载到不同的处理器。我们发现可以定义一个NN执行拆分,以最小化将计算从一个处理器移动到另一个处理器的开销。
iii)我们最后的贡献是评估NIC和交换机在哪些条件下适合作为CPU的协处理器处理NN。我们通过设计BaNaNa Split来实现这一点,该解决方案利用最近的技术来执行NN模型量化,并在基于网络处理器的SmartNIC和可编程交换芯片上执行这些量化模型。虽然仍处于早期阶段,但BaNaNa Split表明,已经可用的网络硬件可以帮助处理当前报告的数据中心NN推理工作负载的大部分。
我们相信我们的发现可能促进NN处理基础设施和网络设备研究的讨论。
2 背景
2.1 人工神经网络
NN是由互相连接的神经元组成的层次结构。神经元从前一层的神经元获取输入(称为激活),并将其输出发送到下一层的神经元。一般来说,可以将一层视为一个黑盒子,它接受一个激活向量并将其转换为输出向量。层数,它们的类型以及每层神经元的数量是NN的超参数,最终影响网络执行任务的能力。例如,完全连接层(fc)有神经元,它们将前一层神经元的所有输出作为激活,并将它们的输出提供给下一层的所有神经元。仅具有fc层的网络称为多层感知器(MLP)。深度NN具有超过三层,其中卷积NN(CNN)最近在某些分类任务中取得了出色的表现,特别是在计算机视觉中。图1显示了AlexNet [12] CNN的层次序列。卷积(conv)和fc层具有权重,称为NN的参数,与层神经元的每个输入相关联。其余层仅执行某些固定的激活变换,因此没有权重。
值得注意的是AlexNet模型末尾的三个fc,因为单独看它们与MLP模型非常相似。这是所有CNN的共同特征。其他类型的NN,例如循环NN,具有不同的结构,本文不涉及。
在推理工作负载组成方面,MLP远远是最常见的NN,其次是RNN和CNN,分别占工作负载的61%,29%和5%[9]。由于MLP可以视为CNN的特例,在本文的其余部分中,我们将重点关注CNN,特别是AlexNet。实际上,最近的NN可能具有更多的层,然而,由于额外的层只是在图1中呈现的层的重复,因此由于其相对简单性,AlexNet模型仍然是一个有效的示例,可以简化表述。
图1:AlexNet[12]的层序列
2.2 神经网络加速器
NN加速器,如通用GPU(GPGPU),通常作为附加硬件板连接到机器的PCIe总线上。这些设备通常使用单指令多数据(SIMD)范例执行大规模并行计算。因此,当执行给定任务时,它们在大量数据上有效使用,通常使用批处理。因此,从系统角度来看,使用加速器执行NN推理的过程如下。首先,通过机器的NIC接收包含推理任务的请求,并将其发送到RAM上的PCIe总线。其次,CPU执行请求的预处理以提取NN输入,并将其添加到当前批次中。第三,一旦批次组成,就将其传输到加速器中执行推理。第四,结果被复制回主存储器,通过PCIe总线传输。最后,CPU准备将结果传输到网络,即将其放置在网络数据包中,并再次通过PCIe总线将其传输到NIC。我们期望前端服务器将接收到这样的结果,并将其包含在面向用户的服务中。
批处理的需求和PCIe总线上的数据移动会显著增加NN推理的端到端处理延迟。例如,[9]报告,在他们特定的设置中,GPGPU的批处理大小必须从64减少到16以满足处理延迟限制。这迫使GPGPU以37%的峰值性能工作(在这种情况下使用64个批次时实现的)。此外,即使Google专门针对推理工作量设计和部署了加速器(即TPU),在某些情况下,将数据传输到/从TPU的时间也可能占据处理时间的71%。
3 工作负载分析
为了理解NN加速器的问题,在本节中,我们分析了AlexNet在推理期间所需的处理。我们进行了从模型结构派生的静态分析和在CPU上处理期间使用的系统资源的运行时分析。
3.1 结构分析
图2:每层的输出大小和参数
对于给定的网络模型,NN层的参数数量以及激活和输出向量的大小是固定的。图2a显示了每个AlexNet层的输出向量大小(请注意,初始输入大小由直方图最左侧的条形表示)。有趣的是,一些层的输出向量比它们的激活向量更大(例如,conv2具有69K元素的输入和产生186K元素的输出),而对于其他层,情况相反(例如,pool1层从290K到69K显着减少了输出元素的数量)。此外,值得注意的是,fc层的激活和输出向量远小于其他层,从不超过9K。
有趣的是,图2b显示参数数量遵循不同的分布:conv层最多具有885K个参数(conv3),而fc具有更多的参数,最多可达37M(fc6)。
3.2 运行时分析
图3:每层的推理延迟
图4:IPC和L3高速缓存丢失
我们在一个由双套接字(NUMA)机器组成的测试平台上运行AlexNet,运行Linux内核4.10,使用两个Intel Xeon E5-2650 CPU(每个CPU具有8个核心@2.4GHz),禁用超线程,并且每个套接字具有16GB的RAM。每个CPU具有32KB的L1数据和指令缓存,并且每个核心具有256KB的L2缓存。20MB的L3缓存由所有CPU的核心共享。我们使用perf收集性能计数器,采用10ms轮询间隔并避免硬件计数器多路复用。AlexNet使用针对Intel处理器优化的Caffe框架实现[10],以利用CPU的矢量处理功能等。
我们对系统进行仪器化,以收集总体和每层的推理延迟。此外,我们收集硬件计数器,以测量执行期间的每周期指令数(IPC),停滞周期数以及L1(数据),L2和L3缓存未命中数。所有测量都使用专用CPU上的单个独立核心执行(即,同一CPU的所有其他核心都处于空闲状态,因此L3缓存完全专用于运行AlexNet的核心)。
图3显示了处理单个激活向量时执行AlexNet的每个层所需的时间。在这些层中,conv2,conv3和conv1的执行时间最长,然后是fc6和其他层。
查看硬件计数器,我们得出NN执行期间实现的IPC(图4的实线)。我们发现,执行pool5层及以下的层可实现IPC 3.2,这意味着CPU的流水线已满,并且处理是计算密集型的。相反,执行fc层的IPC低于1。这个较低的值是由于大量停滞周期引起的,这些停滞周期是由所有缓存级别的缓存未命中引起的。即,系统必须等待从RAM读取数据。图4的虚线显示fc层的L3缓存未命中率增加。
这种性能可以快速解释为fc层执行的计算类型,它对权重值的重用很少。这与这些层参数的大量数量一起导致CPU缓存的低效使用。作为参考,仅fc6的参数需要151MB的内存,考虑到每个参数在32b上表示,即CPU缓存中可用空间的7倍。
3.3 批处理效应
表1:批处理与顺序推理处理时间比较
图5:归一化的每层推理延迟
我们重新运行了之前的测试,对16、32、64个激活向量的批处理进行推理。在表1中,我们比较了执行批处理和顺序执行批中包含的激活所需的时间。我们可以看到,与顺序执行相比,批处理减少了总体处理时间,减少范围从16个向量批处理的13%到64个向量批处理的9%。这确实证实了批处理提高了处理效率。
为了了解提高效率的原因,表1的最后一行报告了批处理的效果,如果我们关注fc层的处理时间配额。此外,在图5中,我们比较了每个层的处理延迟对总体推理处理延迟的相对贡献,考虑到非批处理执行和使用64个向量批处理的执行。很明显,批处理对fc层的效益最大,从处理延迟的总体贡献20%到仅4%。换句话说,批处理提高处理效率的大部分原因是由于处理fc层的效率提高。这得到了硬件计数器的分析证实,它显示IPC的增加和缓存未命中的减少。这种行为很容易解释,因为与非批处理情况相反,现在在缓存中加载的参数在批处理中的每个向量中都被重复使用,然后被丢弃。
不幸的是,批处理显着提高了NN的平均响应时间,因为只有在整个批处理完成处理后,才能提供NN推理的结果。
4 神经网络分割
对AlexNet的运行时分析显示,CPU对于conv、pool和norm层是高效的执行器,但在处理fc层时效率要低得多。也就是说,在处理fc层期间,CPU的流水线会在很大一部分时间内停滞,这实际上浪费了其他有用的计算能力。批处理改善了这种情况,但对于延迟敏感的在线工作负载而言,这是一种不可行的方法。
考虑到仅由fc层组成的NN在NN工作负载中占据了绝大部分(参见第2节),因此开发解决方案以改进这些层的执行显然可以提供重要的好处。也就是说,合适的fc层执行器一方面可以降低推理处理延迟,另一方面可以释放CPU资源,这些资源可以更好地用于其他工作负载。
在试图确定可编程网络设备是否可以成为高效的fc层执行器之前,值得评估和量化可能由两个不同执行器之间的NN处理分割引入的附加开销。这将有助于确定使用当前加速器的问题。
特别地,我们首先验证将执行分割在两个执行器之间是否会对处理效率产生影响,例如由于潜在的冷缓存效应或无法利用某些数据预取。然后,我们量化由执行器之间的额外数据移动引入的成本。
4.1 分割处理开销
为了评估对处理效率的影响,我们选择两个同质的执行器,但具有独立的内存和缓存,即我们NUMA机器的两个CPU。使用CPU可以通过它们的插座之间的快速QPI互连交换数据,从而最小化数据移动的开销。此外,由于我们使用同质的执行器,因此我们可以直接将分割执行的测量结果与非分割执行的测量结果进行比较。
为了测试我们的测试平台,我们修改了我们的NN实现,以生成两个进程,每个进程执行NN的一部分。第一个进程执行其层处理直到分割点,然后将中间结果传输给第二个进程,后者继续处理直到NN的末端。两个进程都将网络模型加载到其各自的NUMA节点的本地RAM中。
图6a的QPI图表显示,在分割NN执行时存在开销,与非分割执行情况相比,推理时间可能高出8%,在某些情况下几乎没有增加。当分割发生在具有大输出向量的层之后时,开销会更高。
测试结果表明,开销主要是由于需要等待将输入向量加载到第二个CPU的缓存中。这个解释可以很容易地验证,因为在较小的输入层之前分割执行的开销总是在1.3%以内。
4.2 通信开销
图6:不同分割点的标准化推理延迟和通信开销故障
在这第二个测试中,我们再次将处理的执行分割在我们NUMA机器的两个CPU之间,但是这一次,我们强制它们之间的通信通过NIC进行。也就是说,我们用一根电缆将NIC的端口连接在一起形成一个循环,并修改我们的NN实现以使用TCP连接传输中间数据(在分割点)。为了避免连接建立和TCP慢启动的开销,连接被预先打开并配置了非常大的初始拥塞窗口。
如预期的那样,端到端处理延迟增加。图6a的NIC条形图显示,延迟增加范围在2-12%之间,并且遵循与QPI条形图类似的模式。
图6b显示了由于通信引入的开销的三个部分的细分:(i)数据序列化时间,需要准备中间结果进行传输;(ii)传输时间,需要通过TCP套接字发送数据并在另一端接收数据,例如它包括通过PCIe总线和NIC端口传输数据的时间;(iii)数据反序列化时间,需要准备接收到的数据以供喂给NN的第二部分。在这三个组成部分中,仅当分割发生在具有大输出向量的层之后时,传输时间才显著大,否则只会贡献数十到数百微秒。相反,序列化和反序列化时间的组合始终提供约300微秒的额外延迟,在较小的网络上可能是显著的。例如,网络末尾的三个fc层总共需要约19ms进行处理,因此额外的1ms将对应约1.5%的延迟增加。
4.3 总结
本节中提供的测试确认并澄清了使用当前加速器执行NN推理时存在的问题。一方面,如果仔细选择分割点,则可以限制分割NN执行的开销。这表明使用加速器执行部分NN处理是可能的。另一方面,将数据移动到加速器的成本可能是显着的,特别是对于较小的网络,这证实了[9]中报告的数字。
5 BaNaNa SPLIT
前面几节中呈现的结果强调了在使用离线加速器(如GPGPUs或TPUs)时,数据移动的开销是一个重大问题。然而,如果加速器实现在已经在路径上的网络设备中,那么这种额外的数据移动是不需要的。
也就是说,为了将NN处理结果发送回请求者(例如服务前端),必须从CPU/内存向NIC(然后是交换机)传输数据。因此,如果在路径上的网络设备可以执行NN处理,它们将主要引入由于处理分割而产生的开销。正如我们所看到的,如果仔细选择分割点(即考虑层输入大小),这种开销可能非常小。但是,SmartNIC和可编程交换机能否执行NN处理呢?
这些设备的硬件架构确实包括大量的快速SRAM,可以容纳NN的参数(或其中一部分)。但是,它们通常只设计用于执行简单操作,不包括NN所需的相对复杂的算术运算。
为了解决这个问题,我们引入了BaNaNa Split。我们的方法利用了最近在NN研究中的进展,显示在许多情况下,通过称为量化的过程可以简化NN的fc层,而不会牺牲太多模型准确性[7、11、18]。量化模型减少了用于表示NN激活和参数的位数,因此比其原始版本更小。这有助于将模型参数适当地放入大型SRAM中。此外,一些量化技术使得可以使用更简单的算术运算,这些运算可以由当前的网络设备支持[17]。
因此,给定一个NN模型,BaNaNa Split的工作方式如下。在配置时间,它将模型分割到fc层之前。第一组层将在CPU上执行。其余的层经历了一个量化过程,实际上将原始的NN模型转化为可以适当地编程执行的形式。在运行时,NN推理请求首先由机器的CPU处理,然后,中间结果被封装在网络数据包中(例如在头部),并发送到机器的(Smart)NIC。在这里,中间结果由NIC处理以执行量化层。最后,量化层输出再次封装在网络数据包中,然后发送到其最终目的地。
由于中间结果封装在数据包中,BaNaNa Split可能会将计算分配给路径上的不同设备,包括SmartNIC和可编程交换机。
5.1 实现
我们的概念验证原型设计用于与现有的商用网络设备配合使用。它使用二值化作为量化技术,即激活和参数都使用1b表示。得到的NN称为二值神经网络(BNN)[2],只需要实现位逻辑操作和人口计数计算[7、11、18]。因此,BNN处理的实现可以由当前的SmartNIC和可编程交换机支持。特别是,我们使用N2Net [21]在可编程交换机上实现BNN,并进一步扩展它以添加基于网络处理器的SmartNIC支持。N2Net是一个编译器,给定一个BNN模型描述,生成用于配置类似于RMT的交换机管道的P4 [1]程序。我们的SmartNIC扩展替换了N2Net的人口计数实现,以利用内置的支持此类操作的功能,如果可用的话[3]。
早期测试。在撰写本文时,我们仍在构建一个完整的端到端原型。因此,在这里我们仅提供一个微基准测试的结果,该测试评估使用基于网络处理器的SmartNIC执行单个(二值化的)fc层,其中包含4096个神经元。
这样的层的激活向量包含4096b,即512B,因此编码在单个网络数据包中。该层的参数大小为2MB,并且在运行执行之前预配置。在这里,需要注意的是,高性能网络设备通常不使用缓存层次结构来为内存服务数据包处理,以提供快速且保证的内存访问时间。在这些条件下,我们的SmartNIC实现需要1毫秒来处理该层。
对于交换芯片评估,我们仅基于RMT架构提供了一个估计,基于[21]中报告的数字。在这种情况下,我们假设交换机在处理单个数据包时最多可以并行执行96个神经元。实际上,这将需要将数据包循环43次,以执行该层的4096个神经元。不幸的是,我们无法将这些数字直接链接到处理延迟,因为我们尚未在可编程硬件交换机上测试我们的原型。
6 讨论
图7: BNN fc执行延迟
许多研究正在探索可编程网络设备在协助处理不同类型工作负载方面的适用性[3、8、13-15、19、20]。BaNaNa Split加入了这个列表,探索了当前可编程网络设备作为神经网络加速器的适用性。
然而,我们的工作必然建立在重要的假设基础之上。首先,我们严重依赖量化的神经网络模型。虽然很有前途,但这些模型仍然非常研究导向,它们的广泛应用尚未得到证明。因此,这些方法的成功可能会对使用(当前的)网络硬件作为神经网络加速器的可能性产生重大影响。
其次,我们目前假设我们可以将整个层的参数适配到网络设备的快速内存中。即使使用量化模型,我们也没有考虑到利用相同内存的传统网络功能。为了缓解这个问题,可以在NIC和多个正常路径交换机之间分配NN计算。
另一个重要的观察是,在使用量化模型时存在微妙的副作用。也就是说,它们更小,可以在CPU上提高执行效率,减少加速的需求。图7展示了这种效应,当AlexNet的fc层的大小缩小到二值化层的大小时,处理时间缩短到原始处理时间的21%,从而减少了像BaNaNa Split这样的解决方案可能带来的潜在好处。尽管如此,考虑到工作负载的大小(参见第2节),即使在缩小后,仍然可以从CPU中卸载出相当大的工作量。
在相关工作方面,应该指出微软的BrainWave [16]使用网络附加的FPGA加速神经网络。BaNaNa Split的方法不同之处在于它使用进行数据包处理的网络设备硬件来执行NN处理,而在我们的理解中,BrainWave可以被认为是部署在“靠近”网络的专用加速器。
7 结论
虽然远未完成系统实现,但我们的研究和早期原型表明,确实可以将某些工作负载潜在地卸载到网络设备上,并且有理由这样做,特别是当端到端处理延迟成为问题时。特别是,当处理神经网络的全连接层时,CPU速度受到内存访问时间的限制。因此,大量的CPU计算能力会浪费在停滞的周期上。将这些层的执行卸载到网络设备上可以提高整个基础设施的效率,为更计算密集的工作负载释放CPU。尽管如此,BaNaNa Split方法的适用性仍需要解决优化神经网络模型和网络设备架构的开放性挑战。