嵌入式端系统上往往设备受资源限制等因素,简单构建的网络模型难以有效运行起来,基于嵌入式设备端开发构建模型大都需要进行对应的优化以提高有限资源下的利用效率,今天晚上回来后有点时间就想着把昨天下载的一篇相关的论文看下,这篇文章的主要研究工作就是嵌入式端系统上如何高效的构建机器学习模型,本文是自己阅读论文的记录以备后续需要的时候查阅,感兴趣的话可以参看下,如果想要进一步了解研究工作详情,建议移步阅读原论文即可,如下所示:
摘要
深度神经网络(DNNs)在各种机器学习应用中取得了巨大成功,提供了高质量的推理解决方案,如计算机视觉、自然语言处理和虚拟现实等。然而,基于DNN的机器学习应用也带来了更高的计算和存储需求,这对于计算/存储资源有限、功耗预算紧张和小型化设计的嵌入式系统来说尤其具有挑战性。挑战还来自于多样化的应用特定需求,包括实时响应、高吞吐量性能和可靠的推理精度。为了应对这些挑战,我们引入了一系列有效的设计方法,包括高效的机器学习模型设计、定制硬件加速器设计和硬件/软件协同设计策略,以实现嵌入式系统上的高效机器学习应用。
关键词:深度神经网络,机器学习,嵌入式系统,高效机器学习模型,硬件加速器,编译,优化,硬件/软件协同设计
1 引言
深度神经网络(DNNs)的最新发展使得基于机器学习的智能解决方案对公众更加相关和可及。我们已经看到一些DNN技术被整合到我们的日常应用中,提供高质量的推理服务,如图像识别、自然语言处理、自动驾驶汽车以及增强现实和虚拟现实等,这些技术使我们的生活更加便利,工作更加高效。大量这些机器学习应用利用边缘设备,并需要部署到资源受限的嵌入式系统上,如手机、摄像头和无人机(UAVs)。它们不仅需要更高的推理精度以实现智能响应,还需要积极的推理速度、吞吐量和能效以满足实际需求。
随着DNN变得越来越复杂,开发和运行DNN支持的应用程序需要更多的计算和内存资源、更长的延迟和更高的能耗。例如,从AlexNet(2012年ImageNet竞赛的冠军模型)到AlphaGo Zero(2017年提出的具有超人技能的围棋AI玩家),DNN训练的计算需求增加了超过30万倍[7]。通过检查图像识别模型,从AlexNet(85%的top-5准确率)到ResNet-152(95%的top-5准确率),模型复杂度增加了16倍。
这种指数级增长的计算和内存需求为DNN在硬件上的部署带来了挑战和困难,尤其是在计算和内存资源有限、功耗预算紧张的边缘嵌入式设备上。尽管云计算可以通过接管计算密集型任务来减轻边缘计算的负担,但在处理各种实际场景时并不总是可行。坚持使用边缘嵌入式设备的主要原因来自边缘应用的独特需求,这些需求通常需要实时决策和减少对网络通信和可访问性的依赖。它们通常无法容忍由于实时响应要求而导致的网络数据传输带来的额外延迟。此外,个人和敏感数据未经许可不应上传到云端。这意味着边缘设备不仅需要从DNN中提供高推理精度,还需要积极的推理速度、吞吐量和能效以满足各种实际需求。总之,在边缘嵌入式设备上部署机器学习工作负载的挑战主要来自三个方面:1)DNN模型变得越来越复杂,可能无法高效运行,尤其是在计算和内存资源稀缺的低功耗边缘设备上;2)将DNN映射到现有硬件或构建特定领域的硬件既繁琐又耗时;3)额外的挑战来自于低效的优化策略,这些策略仅关注硬件或软件优化,而缺乏可能提供更好整体解决方案的软件/硬件协同设计或跨系统堆栈设计方法。
尽管存在上述挑战,但最近的研究一直在持续探索各种优化策略,以实现边缘机器学习解决方案。在本章中,我们提出了全面的设计方法,以应对和克服这些挑战,并在嵌入式系统上实现高效的DNN应用。这些方法包括第3节中的高效DNN模型设计、第4节中的加速器设计和负载映射技术,以及第5节中的跨堆栈优化策略。
2 背景与相关工作
现有的解决方案旨在在从DNN模型到整个硬件-软件系统的各个层面解决嵌入式系统上高效DNN的挑战。这些不同的方法涵盖了不同的开发周期,并具有不同的特点,如表1所示。在本节中,我们将介绍不同设计方法的现有工作及其不同属性。
高效DNN设计
DNN在输入和输出层之间包含多个中间层,每个中间层由人工神经元组成,用于根据预定义的网络连接转换输入信息(例如,输入特征图)。一般来说,DNN包含数百万个参数,并在推理过程中需要数十亿次操作。为了在硬件上成功部署DNN并实现所需的性能,开发者专注于网络压缩以减少网络复杂性和降低计算和内存需求。最近的研究表明,使用量化数据来表示原始浮点参数是可能的,例如使用8位量化甚至二进制和三进制数据表示[10, 11, 12, 13, 14, 15]。这些解决方案旨在用逻辑操作替换硬件密集型的浮点乘法,以便DNN在硬件平台上更加高效。
另一种压缩DNN的方法是网络剪枝,其目标是减少DNN结构的冗余[16, 17, 18]。根据已发布的剪枝策略,丢弃DNN层之间不太重要的连接,然后进行网络再训练以恢复精度。在经典的DNN(如AlexNet[5]和VGG-16[19])上可以实现显著的减少。由于网络压缩的主要好处来自全连接(FC)层,为了对后期DNN(如GoogleNet[20]和ResNet[2])继续获得有效的剪枝结果,需要更复杂的算法来实现有效的网络剪枝,例如使用进化算法[21]、交替方向乘子法[22]和迭代剪枝[23]。
由于大多数计算发生在卷积(Conv)层中,先前的工作还尝试通过使用深度可分离卷积层[24]来减少计算复杂性。深度可分离结构可以有效减少操作数量,并为资源受限的硬件提供更紧凑的DNN设计。为了进一步提高DNN在硬件上的部署,层融合在[25]中被提出,以最小化片上和片外内存之间的数据移动。
高效加速器设计和DNN映射方法
构建特定领域的硬件加速器是另一种流行的实现高效DNN部署的方法。这些加速器试图利用定制或专用硬件和软件设计,例如在CPU上采用加速库[26],在GPU上探索内核优化[27],以及在FPGA[28, 29, 30]和ASIC[31, 32, 10]上构建定制加速器,以提高DNN推理和训练过程的速度和效率。在这些加速器设计中,基于FPGA和ASIC的设计可以完全定制以实现神经网络功能,与基于CPU和GPU的设计相比,具有改进的延迟、吞吐量和能耗。
然而,开发定制加速器存在显著挑战,例如繁琐的硬件设计过程、复杂的硬件验证问题以及在DNN部署期间耗时的设计空间探索。为了缓解这些挑战,最近的调查开始关注包括高层次综合[33, 34, 35]和端到端设计框架在内的技术,以实现快速DNN加速器设计和高效负载部署[30, 36, 37, 38]。它们支持高抽象输入,例如流行的机器学习框架(如Caffe[39]、TensorFlow[40]、PyTorch[41])使用的基于Python的DNN描述,因此DNN可以直接导入而无需手动代码转换,并被解析然后映射到硬件上。这些框架,如DNNBuilder[30]和HybridDNN[37],还集成了设计空间探索(DSE)引擎,以执行有效和系统化的探索,并提供高度优化的加速器以满足用户特定需求。
高效协同设计优化
最近的研究还关注跨堆栈协同设计优化,以实现嵌入式系统上成功部署DNN[42]。与独立优化硬件和软件组件不同,研究人员提出了算法/加速器协同设计和协同搜索来解决边缘AI挑战:DNN被设计为满足精度需求,并且必须意识到硬件约束,具有合理的网络配置。同时,加速器需要为不同的DNN组件提供广泛的支持,而不会在网络设计上引入太多限制,并保证性能以满足规格。作者在[43]中首次提出了DNN/加速器协同设计的概念,旨在同时考虑软件和硬件指标,“自动生成DNN模型及其对应实现作为对”。这一概念随后在第56届IEEE/ACM设计自动化会议(DAC-SDC)的低功耗目标检测系统设计竞赛中获胜[44]。
许多后续工作继续研究不同AI算法和硬件设备之间的协同设计机会[45, 46, 47, 48, 49, 50, 51, 52]。这些协同设计方法通过结合硬件和软件之间的多种优化技术,取得了显著的成就。例如,尽管神经架构搜索(NAS)在设计高质量DNN模型方面取得了巨大成功[53, 54],但硬件感知的NAS正引起越来越多的关注,旨在同时提供高精度和硬件效率的模型(例如,FBNet[55]和MNasNet[56])。其他机器学习算法/硬件协同设计工作包括FNAS[57]、NAIS[48]、EDD[58]和NASAIC[59]。在协同设计策略的成功驱动下,最近还提出了其他类型的协同设计方法,包括软件/编译器协同设计[60, 61, 62]、编译器/硬件协同设计[63, 64, 65]等。
3 高效机器学习模型设计
机器学习应用不仅需要高推理精度,还需要积极的推理速度、吞吐量和能效以满足实际需求。它们依赖于硬件高效的DNN设计,尤其是在硬件资源有限的边缘场景中。在本节中,我们介绍ELB-NN[12]和VecQ[14],以提供嵌入式系统上硬件高效的DNN。
ELB-NN
ELB-NN(极低位宽神经网络)被提出以在嵌入式FPGA上运行图像分类时提高能效。它是首批支持任意DNN量化的混合低位宽设计之一。本小节介绍了ELB-NN的混合量化特性和其在嵌入式系统上的相应硬件加速器设计。
混合量化方案
混合量化意味着网络的参数和激活使用了不同的量化方案。量化方案可以一直降到二进制。为了更好地适应混合量化,我们首先研究了它们对网络推理精度的影响。我们按照公式1计算二进制权重。
在这个AlexNet分析中,我们关注1)卷积(CONV)和全连接(FC)层的量化参数,以及2)量化激活的影响。我们使用mid-CONV表示除第一个CONV层之外的所有CONV层,使用mid-FC表示除最后一个FC层之外的所有FC层。所提出的混合精度网络的命名规则可以参考图1。
在表2中,8位设计(Alexnet-8-8888)仅比原始float32版本降低了1.3%的准确率。在使用三元(Alexnet-8-8228)和二元(Alexnet-8-8218)参数进行mid-CONV和mid-FC层后,准确率仍然很有希望。这意味着网络对参数的精度相对稳健。相反,激活的精度显著影响分类准确率。与Alexnet-8-8218相比,当激活移动到4位(Alexnet-4-8218)和2位(Alexnet-2-8218)时,我们观察到3.3%和6.5%的准确率下降。为了进一步研究,我们禁用了最初提出的处理有限GPU内存问题的组函数。结果,我们在Alexnet-4-8218(w/o g.)中捕获了80%的计算增加和3.9%的准确率提升。我们进一步增加了Alexnet-4-8218(ext.)中五个CONV层的通道数,并通过额外增加61%的计算实现了1.3%的准确率提升。通过增加模型复杂性,我们可以恢复准确率。这些观察结果对混合DNN量化很有启发性,因为参数可以比激活更积极地量化。
ELB-NN的硬件加速器
为了处理ELB-NN,我们在[12]中提出了一个参数化的计算引擎(CE),在执行期间支持低位宽量化的灵活性和可配置的并行性。如图2所示,它包含一个四输入并行CE作为示例,其中四个输入可以同时处理(包括二进制/三元操作和累加),然后是批量归一化(BN)和激活函数。累加器的精度是可调的,旨在允许更灵活的量化设计并保持输出精度。对于更多输入,累加器之前将使用加法树以确保时序闭合。
为了展示ELB-NN的硬件效率,我们采用带有提议的CE的加速器,并在嵌入式平台ZC706(带有ARM CPU和Xilinx Kintex-7 FPGA)上加速不同量化版本的AlexNet和VGG16。结果如表3所示。ELB-NN可以实现高达10.3 TOPS的吞吐量性能,优于[68, 69, 70]中的先前设计。
VecQ
向量化量化(VecQ)是一种基于向量损失的新量化损失度量指标的训练量化框架。它旨在提供灵活的位宽支持,并在最小量化损失的情况下实现更高的模型精度。在本小节中,我们详细介绍了向量损失的定义和VecQ量化框架。
向量损失的量化
我们使用量化前后的数据之间的欧几里得距离的平方来表示量化损失。这也称为平方2-范数或L2距离。在模型训练期间最小化L2损失已被证明足以提供更高的模型精度[71, 72, 73, 67, 74]。然而,由于在受约束的位宽要求下L2损失优化的非凸特性,量化很容易陷入次优解空间。此外,采用L2距离收集每个量化数据的损失,忽略了内核或层中这些数据点之间的分布和相关性。
通过这些方法,方向损失JoJo表示优化的量化角度,模量损失JmJm表示在此角度下的优化比例。因此,我们的量化分为两个阶段来独立最小化这两个损失,分别定义为转向阶段和驱动阶段,如图4所示。在转向阶段,我们调整权重向量的方向以最小化方向损失。然后,我们固定方向,仅在驱动阶段缩放向量的模量以最小化模量损失。
框架集成
对于某一层的激活输出,在训练期间,我们计算激活输出p(t)p(t)的分布参数,并使用指数移动平均进行更新。在推理期间,分布参数作为激活函数的线性因子[75]。A(l)A(l)是层ll的激活输出,Activation(⋅)Activation(⋅)是卷积或全连接层之后的非线性激活函数,如Sigmoid、Tanh、ReLU。
我们在图像分类任务上评估VecQ,并将其结果与具有相同DNN模型和位宽配置的最先进量化解决方案进行比较。最先进的量化解决方案包括BWN[11]、TWN[66]、TTQ[76]、TSQ[77]、INQ[78]和ENN[79]。注意,并非所有这些量化解决方案都提供从1到8位的位宽支持。如图6所示,我们的VecQ量化在相同位宽配置下优于大多数解决方案,并且VecQ提供了更广泛的位宽覆盖范围。只有在与专门为二进制权重设计的解决方案相比时,VecQ才失去优势。
4 高效加速器设计和负载映射
如前所述,软件中快速DNN模型设计和硬件加速器实现之间存在不断扩大的障碍。为了弥合硬件-软件差距,在本节中,我们介绍DNNBuilder[30]和PyLog[38],以提供自动生成高性能硬件加速器的高效解决方案,用于DNN负载部署。
DNNBuilder
DNNBuilder是一个端到端的自动化框架,可以将流行的深度学习框架中的DNN设计转换为在FPGA上实现的定制加速器上的高度优化硬件部署。用户不再需要手动设计和优化加速器,而是可以享受为所需AI负载自动生成的硬件加速器。DNNBuilder引入了两个主要的架构创新:细粒度基于层的流水线架构和基于列的缓存方案,分别实现了7.7倍和43倍的延迟和片上内存使用减少。本小节介绍了DNNBuilder引入的新设计,并展示了其在边缘AI上的有前景的性能。
端到端自动化流程
DNNBuilder在三个步骤中生成定制DNN加速器:设计、生成和执行(图7)。在设计步骤中,使用深度学习框架设计并训练DNN,这些框架通常使用CPU和GPU。训练后,网络定义文件和训练参数传递到下一步。为了确保用户指定的设计自由度,提出的流程支持混合量化方案,其中不同的量化方案可以应用于不同网络层的参数和激活,以探索推理精度、资源利用率和性能之间的权衡。此步骤的一个重要特性是反馈功能,提供硬件指标估计。如果当前DNN运行速度较慢或消耗更多资源,用户可以更新其网络设计,例如调整量化方案或修改网络层以满足性能和资源要求。此功能还使硬件-软件协同设计成为可能。
在生成步骤中,启动网络解析以分解输入模型。不同的网络层,例如CONV、Pooling和FC层,被分解并映射到我们预构建的RTL IP,这些IP是生成加速器的基本构建块。计算密集型嵌套循环由参数化计算引擎捕获。然后,自动化优化探索硬件设计空间并提供配置指南,以便生成的加速器可以实现最大性能。根据这些指南,网络构建负责使用预构建的RTL IP、数据流控制器和内存实例构建DNN实现,这些实例高度可配置,以确保对各种DNN的适应性和可扩展性。之后,代码生成生成FPGA实例的加速器相关文件。
在执行步骤中,使用统一接口在FPGA中实例化DNN加速器,包括FIFO类数据输入/输出接口和连接片外内存控制器的权重访问接口。在这一最终步骤中,DNN加速器已准备好进行最终部署。
架构创新
我们提出了一种细粒度基于层的流水线,以提供高吞吐量性能和有前景的实时响应。目标DNN模型中的每个主要神经网络层,如CONV或FC层,由一个流水线阶段处理,因为主要层主导计算和内存消耗。其余层,如批量归一化(BN)、缩放和激活层,被聚合到其相邻的主要层,以便我们减少流水线阶段的数量以降低延迟。此外,DNNBuilder启用流水线阶段重叠以克服传统流水线中经常遇到的长初始延迟。我们通过加速称为YOLO[80]的对象检测DNN模型来展示提出的细粒度基于层的流水线,并在图8中显示结果。DNNBuilder可以有效隐藏数据传输延迟,并在加载第一帧时生成输出。它有助于实现比传统流水线设计(411.99ms)小7.7倍的启动延迟(9.92ms)。
另一个新颖的设计是基于列的缓存方案,它在DNN推理期间减少片上内存利用率,并支持资源受限嵌入式系统的高清图像输入。根据流水线架构,流水线阶段之间的中间结果存储在片上以保证无缝流水线操作。然而,当输入变大时,特征图可能变得巨大,无法完全保存在片上。基于列的缓存方案旨在解决这个问题,因为它仅在片上保留输入特征图的子集。图9显示了一个示例,当DNNBuilder处理卷积层(核大小=3,步幅=1)时。由于切片13对第一个滑动窗口操作(从上到下)有贡献,我们将前三个切片称为列1。类似地,列2表示第二个滑动窗口操作的数据量,因此切片24构成列2。DNNBuilder在开始计算前至少缓存两列,这允许内核在完成第一个滑动窗口操作后立即执行第二个垂直滑动窗口操作。由于缓存了多一列,数据短缺不会发生。同时,切片5将在释放切片1占用的空间后开始缓冲以形成下一列(切片3~5)。通过服务于相同的目标检测AI模型(YOLO,高清输入),提出的基于列的缓存可以显著减少43倍的片上内存使用,与没有此技术的加速器相比[30]。
最先进的性能
我们通过在嵌入式平台(ZC706)上加速流行的AI负载来展示我们的设计。如表4所示,我们生成的DNNBuilder设计在Fix8和Fix16量化方案中达到了最佳性能(524和262 GOPS)和能效(72.8 GOPS/Watt和36.4 GOPS/Watt)。我们还将比较扩展到嵌入式GPU(TX2),如表5所示。DNNBuilder生成的解决方案在未使用批处理(批量大小=1)时,其效率高于基于TX2的解决方案,并且可以实现高达47.2图像/秒/瓦特。
PyLog:基于Python的FPGA编程流程
新应用和新使用场景的快速增长复杂性对计算系统提出了严重挑战。嵌入式硬件加速器系统在许多不同应用和场景中展示了极大的灵活性、性能和效率。然而,随着系统复杂性和应用复杂性的快速增长,编程和优化嵌入式加速器系统需要大量手动努力并消耗大量时间。将用Python等高级程序指定的通用应用程序编译和优化为嵌入式加速器设计正成为创建嵌入式加速器设计的常见任务。高层次综合(HLS)将用高级语言(如C++、OpenCL、Python)编写的设计输入转换为RTL(寄存器传输级)语言(如Verilog)的硬件描述。HLS与手动RTL设计解决方案相比,提供了高达10倍的代码减少和1000倍的模拟时间减少。HLS在过去几十年中得到了深入研究[33, 34, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97],并且有许多流行的商业HLS工具被许多设计师使用[98, 99]。
PyLog流程概述
PyLog[38]是一个基于Python的FPGA高层次编程流程。它允许用户使用PyLog高层次操作符和Python语法用Python代码创建FPGA加速器。PyLog为主机和加速器逻辑提供了一个统一的编程模型,具有一致的基于Python的语法和语义。这种无缝的主机-加速器编程模型实现了敏捷系统设计、方便的功能模拟和灵活的设计空间探索。
图10显示了高层次的PyLog。PyLog流程允许用户用Python创建高效的FPGA加速器并编程主机系统。PyLog流程的输入是Python代码,其中FPGA内核函数用@pylog装饰器修饰。PyLog流程包含一个加速器综合流程和一个运行时流程。
在加速器综合流程中,@pylog装饰器调用PyLog编译器将内核函数编译为优化的HLS C代码,然后通过HLS流程编译为高效的FPGA IP,并由PyLog系统生成器集成到完整的加速器系统中。除了PyLog内核函数外,PyLog程序的其余部分由运行在主机CPU侧的标准Python解释器解释,支持所有Python库和语言特性。这部分PyLog程序自然成为整个加速器系统的主机程序。在加速器系统由综合流程生成后,可以使用生成的FPGA比特流配置文件在目标FPGA平台上部署系统,并在PyLog运行时流程的支持下运行。在运行时,PyLog运行时可以根据主机代码准备输入数据、启动加速器并收集结果。主机CPU和FPGA加速器之间的交互由PyLog运行时和底层的Xilinx PYNQ库[100]自动处理。
PyLog特性
PyLog有几个独特的特性,帮助用户更高效地创建FPGA加速器。
-
高层次操作符。除了常用的Python标准语言特性外,PyLog还支持几个内置的高层次操作符和NumPy操作符,允许用户在高层次表达计算模式并启用更好的编译器优化。表6总结了PyLog支持的语言特性,包括PyLog高层次操作符、NumPy操作符和标准Python特性。清单1展示了一些PyLog map和dot操作符的示例用法。
# 向量加法
out = map(lambda x, y: x + y, vec_a, vec_b)
# ID卷积
out = map(lambda x: w0 * x[-1] + w1 * x[0] + w2 * x[1], vec)
# 内积
out_vec[i] = dot(matrix[i, :], in_vec)
# 平方矩阵乘法
out = map(lambda x, y: dot(x[0, :], y[:, 0]), ma, mb)
这些操作符不仅简化了用户的编程,还向编译器传递了更多关于计算的信息(例如,计算模式、数据流信息、数据/任务并行性等),与用C/C++编程相比,从而允许编译器执行更多优化并选择最佳代码生成。
图11显示了从PyLog map操作生成多个硬件实现的示例。编译器生成不同风格的HLS C实现,对应不同的硬件结构,例如移位寄存器、脉动阵列等。根据上下文和约束,将选择最佳实现。
-
类型推断和类型检查。Python是一种动态类型语言,Python代码中没有显式类型声明。PyLog有一个内置的类型推断和类型检查引擎,可以推断PyLog内核函数中代码对象的类型和形状信息。这个类型推断引擎在PyLog中至关重要,因为相同的操作符在应用于不同类型或形状的操作数时可能具有完全不同的含义。通过这个类型推断引擎,PyLog用户不需要在PyLog程序中提供显式类型注释或提示。
-
编译器优化。PyLog提供了一组编译器优化,以提高生成的加速器的设计质量。PyLog使用自己的PyLog中间表示(PLIR)作为输入代码的内部表示。PyLog代码分析和转换通过在PLIR上工作来执行一系列优化,包括高层次操作符降低、循环变换、HLS编译指示插入等。内部PLIR能够表达不同的设计选项,因此可以形成一个设计空间,不仅涵盖低层次设计参数调整,还涵盖高层次设计模式选择,这在以前的工具中尚未探索。
PyLog评估结果
我们评估了PyLog在表达能力和加速器性能方面的性能,使用实际应用。
-
表达能力。我们通过比较使用PyLog和HLS C实现基准测试所需的代码行数来评估PyLog的表达能力。对于评估的基准测试,PyLog平均只需要HLS C代码长度的约30%。这表明PyLog与HLS C相比提供了良好的表达能力,允许用户用更少的代码描述其计算。
-
加速器性能。我们使用实际基准测试评估了PyLog生成的加速器的性能。评估在Amazon EC2 F1 f1.2xlarge实例上进行。评估的基准测试来自不同领域,具有各种计算模式。它们是具有代表性的FPGA工作负载,包括线性代数、数据分析、模板、稀疏操作等。Amazon EC2 F1 f1.2xlarge实例是一个云计算平台,具有8核Intel Xeon E5-2686 v4 CPU和Xilinx Virtex UltraScale+ XCVU9P FPGA。表7显示了评估结果。该表列出了FPGA资源利用率以及加速器执行时间。我们将PyLog加速器执行时间与优化后的CPU时间和[101]生成的加速器执行时间进行了比较。平均而言,PyLog加速器在CPU基线和手动优化加速器上分别实现了约3.17倍和1.24倍的加速[38]。
5 高效优化
在大量高效优化技术中,本节介绍了三种关键优化技术:硬件感知的NAS、FPGA/DNN协同设计、一种针对FPGA/DNN协同设计的专门方法[45],以及一种跨不同平台的统一可微分协同设计方法[58]。
硬件感知神经架构搜索(NAS)概述
神经架构搜索(NAS)是指神经架构设计的自动化过程[114]。它在产生许多最先进的网络方面取得了巨大成功。通常,NAS过程需要三个不同的组件,如表8所示:
-
搜索空间。搜索空间包括所有可能的网络架构,这些架构遵循预定义的模板。例如,网络可以是顺序层架构[115, 116]、基于单元架构[54]和分层架构[56]。此外,硬件参数应考虑进硬件感知的NAS搜索空间。
-
搜索算法。NAS的基本组件是搜索算法。给定巨大的搜索空间,搜索算法可以极大地影响搜索的效率和最终网络架构的有效性。通常,搜索算法可以分为两类:基于超网的搜索[104, 55]和基于采样的搜索[115, 115, 110, 113]。
-
网络评估。网络评估是高效NAS的关键,因为需要快速评估来估计个别网络的质量,以指导搜索算法从搜索空间中选择顶级架构。由于网络训练可能非常昂贵,因此提出了各种近似方法来加速评估,例如少样本和单样本训练[117, 118]和使用代理任务[112]。
硬件感知NAS公式
近年来,由于需要将高功耗的DNN部署到资源受限的设备中,硬件感知的NAS(HW-NAS)已成为最有前途的技术之一[119]。有大量的硬件感知工作,每项工作通常采用特定的硬件设备(CPU、GPU、嵌入式/移动设备)并需要不同的硬件成本指标(例如,优先考虑延迟或能耗)。例如,FBNet[55]开发了一个可微分的神经架构搜索(DNAS)框架,并通过结合交叉熵损失(导致更好的准确性)和延迟损失(惩罚目标设备上的网络延迟)来发现平衡准确性和硬件效率的最先进的DNN。为了提供更集成的协同优化解决方案,EDD[58]融合了DNN架构和硬件加速器的设计空间,并将DNN和硬件设计表述为一个协同搜索问题。EDD旨在在协同搜索空间中发现最适合的DNN和硬件组合,并在给定的边缘AI应用中最大化软件和硬件指标。Once for All(OFA)[109]是第一个提出超网弹性训练方案的工作。通过训练超网,可以直接从OFA网络中选择高精度架构,而无需额外训练。
硬件感知NAS的经典搜索方法之一是首先定义基于模板的搜索空间,然后将硬件性能纳入损失函数:
FPGA/DNN协同设计
Hao和Chen在题为“深度神经网络模型和FPGA加速器协同设计:机遇与挑战”的受邀论文中首次提出了加速器和DNN协同设计的概念[43],他们主张“自动生成DNN模型及其对应实现作为对”。随后,基于提出的协同设计方法,我们实现了第一个同时的FPGA/DNN协同设计框架[45]。它有两个主要组件,如图13所示:(1)面向硬件的DNN模型设计,称为_Auto-DNN_,这是一个在硬件资源和性能约束下探索DNN候选的高效搜索引擎;(2)DNN驱动的FPGA加速器设计,称为_Auto-HLS_,这是一个快速板级设计生成器,自动将DNN映射到FPGA。
协同设计的关键:捆绑
实现协同设计的关键,即同时执行_Auto-DNN_和_Auto-HLS_,是提出可以同时用于构建DNN及其加速器的基本构建块。我们称这些构建块为捆绑,它们是DNN架构及其硬件实现的共同基本构建块,如图14所示。捆绑的好处是双重的。首先,DNN可以通过复制捆绑一定数量的层并在其中插入池化层来构建,这是一种构建高质量DNN的常见且有效的方法,例如ResNet[2]中的残差块和GoogleNet[20]中的Inception块;同时,许多NAS方法遵循这种基于单元的策略[54, 56, 104]。其次,加速器可以通过为特定捆绑构建硬件模块并在不同DNN层中重复使用它来构建,前提是DNN是通过复制捆绑构建的;这可以通过资源共享显著减少加速器的资源使用并缩短硬件开发周期。作为一个例子,捆绑可以是一组DNN层,包括:一个3×3卷积、一个批量归一化、一个激活、一个1×1卷积和一个激活。同时,硬件加速器将需要一个3×3卷积实例、一个1×1卷积实例等。
逐步缩小搜索空间
在给定大量设计空间和耗时的DNN训练时间的情况下,选择最优捆绑并非易事。因此,尽早缩小搜索空间至关重要。我们的方法是分三步逐步进行,在早期阶段过滤掉不利的捆绑,并在后期阶段使用有前途的捆绑进行详细搜索。这三个步骤如下。
步骤2。捆绑评估和选择。在此步骤中,我们评估每个捆绑的延迟、资源和准确性指标,如步骤1中所定义。由于我们无法评估单个捆绑的准确性,我们将捆绑复制nn次以构建DNN并训练少量轮次(实验中为20轮)。我们在捆绑的帕累托曲线上绘制曲线,以检查DNN准确性和资源利用率之间的权衡,并选择帕累托曲线上的捆绑进行详细搜索的下一步。
步骤3。使用捆绑构建DNN并训练。在选择前NN个有前途的捆绑候选后,我们在资源和延迟约束下搜索DNN模型。对于每个捆绑,生成KK个初始DNN并逐步更新,通过调整通道数量、池化层位置等,直到满足延迟目标。然后,我们通过改变三个变量来扰动初始DNN:捆绑重复次数、捆绑间的下采样配置和通道扩展配置。我们采用随机坐标下降(SCD)算法进行扰动,而其他启发式或进化算法也可以应用。搜索算法的目标是找到在满足性能约束的情况下具有最高准确性的DNN架构。
评估结果
为了评估协同设计框架的有效性,我们将其应用于低功耗目标检测竞赛[120],并与FPGA和GPU类别的顶级前三名进行比较。结果如表9所示。我们在以下方面进行比较:(1)交并比(IoU);(2)处理一帧的延迟和总体帧率(FPS);(3)板载功耗;(4)所有测试数据的能耗;(5)每帧的能效(J/pic)。结果从Pynq-Z1上的板级实现中收集。延迟指的是单帧的执行时间(毫秒),而FPS是通过包括图像加载、预处理和DNN推理在内的50K图像的总运行时间来测量的。
与FPGA类别的第一名获胜者相比,我们实现了6.2%的更高IoU、40%的更低功耗和2.5倍的更好能效,这归因于自动化协同搜索而不是手动设计的有效性。与基于GPU的设计相比,我们的DNN1模型比第三名设计更准确,仅比第一名GPU设计低1.2%的IoU。在能效方面,我们的设计比第一名GPU设计好3.6倍,尽管延迟长40%,但时钟频率慢近6倍。
EDD:高效可微分DNN架构搜索
在第5.3节介绍的FPGA/DNN协同设计的基础上,我们进一步将协同设计发展为更通用和统一的方法,即完全同时的神经架构和实现协同搜索,针对任意硬件平台。神经架构和实现协同搜索(NAIS)[48]是第一个针对FPGA和GPU的风格化设计方法,而EDD[58]是一种完全同时的、高效可微分的DNN架构和实现协同搜索方法。EDD的总体架构如图15所示。
融合的协同设计空间
关键技术是将DNN架构搜索和硬件实现搜索的设计空间融合。我们共同表示DNN搜索和实现搜索中使用的
NAS设计空间。在搜索空间中,每个DNN由NN个基本构建块组成,采用单路径方式,没有分支[121]。在每个块中,有MM个候选操作。我们采用NAS方法中最常用的DNN块,称为MBConv[56],
实现搜索空间。我们让每个候选操作有自己的实现变量,形成实现搜索空间
。主要的实现变量是量化qq,即数据精度,因为它对DNN准确性、实现性能和硬件资源有较大影响。我们不使用训练和量化方法,而是将量化与DNN结构一起搜索,以提供实现性能反馈。除了量化,其他实现变量也可以集成到框架中,例如加速器并行性、循环平铺因子、批量大小等。
可微分的性能和资源公式
关键技术是如何将损失函数对搜索空间AA和II进行可微分公式化。由于NAS搜索空间AA是离散的,可微分公式化需要连续松弛。DARTS[104]是第一个使用softmax进行松弛的工作,而FBNet使用Gumbel-softmax[122]从离散空间采样。这种松弛已被证明在GPU小时内高效,并具有吸引人的模型准确性[104, 55, 113]。受FBNet启发,类似的Gumbel-softmax技术可以应用于可微分实现II,将离散实现搜索空间转换为连续的。因此,通过在验证集上下降损失函数,{A,I}{A,I}可以同时学习。
最先进的结果
我们在ImageNet数据集的随机采样子集上展示了结果,目标三种硬件架构,每种架构都有一个搜索到的DNN模型,称为EDD-Net:(1)面向低延迟的GPU(EDD-Net-1);(2)折叠的FPGA架构(EDD-Net-2),其中单个处理单元(PE)将被所有层重复使用;(3)流水线FPGA架构(EDD-Net-3),其中每层有自己的PE,所有PE同时工作。每个模型通过EDD在P100 GPU上12小时的搜索生成。
对于面向GPU的EDD-Net-1,结果如表10所示,其中GPU延迟在Titan RTX上测试。结果显示,EDD-Net-1在实现与最先进DNN模型和其他NAS方法相似或更好的准确性时,实现了最短的推理延迟。表11显示了EDD-Net-1在Nvidia 1080 Ti GPU上不同精度下的准确性和延迟权衡。对于面向FPGA的EDD-Net-2,延迟值通过在ZCU102 FPGA上运行DNN模型与CHaiDNN加速器收集,如表10所示。结果显示,EDD-Net-2在所有DNN中实现了最短的FPGA延迟。面向FPGA的EDD-Net-3针对流水线FPGA加速器进行搜索。如表12所示,EDD-Net-3实现了更高的吞吐量,与最先进的方法相比具有更高的准确性。
6 结论
新兴的基于DNN的AI应用对嵌入式系统提出了挑战,因为这些应用带来了高计算和内存需求以及多样化的应用特定需求,如实时响应、高吞吐量性能和可靠的推理精度。本章介绍了一系列有效的设计方法,以克服这些挑战,实现嵌入式AI解决方案。这些方法可以分为高效机器学习算法、加速器和编译器设计以及各种协同设计和优化策略。我们首先提出了ELB-NN和VecQ,通过在模型训练和推理期间启用极低位宽量化来加强AI模型的硬件效率。然后,我们提出了DNNBuilder和PyLog,用于定制硬件加速器设计和DNN负载映射到这些加速器。最后,我们介绍了高效的协同设计策略,包括FPGA/DNN协同设计和EDD,在嵌入式系统上部署AI负载。
我们相信,未来的嵌入式AI解决方案将涉及更多有效和全面的设计方法,涵盖AI算法、定制加速器以及算法和硬件之间的协同设计和协同优化策略。例如,我们的高效AI算法设计,如ELB-NN和VecQ,可以采用更先进的量化方案,以最小化网络压缩损失。未来的工作将考虑更多样化的网络架构和逐层数据分布特征。为了促进更顺畅的加速器设计过程,我们将扩展DNNBuilder和PyLog,以创建硬件设计、综合和负载编译的框架和工具。主要方向包括1)异构计算支持,旨在实现异构AI系统的系统级设计和优化;2)动态计算图调度,实现未来AI应用的运行时自适应加速器生成。我们的未来工作还将涵盖更多先进的软件/硬件协同设计,用于在异构系统上运行的新兴AI模型,这些系统包含更大的设计空间,因此更具挑战性。例如,多模态多任务(MMMT)模型[126]和用于自动驾驶的定制硬件设计[127]已经展示了AI模型和硬件设计中异构性的重要性。必须为这些异构场景开发协同设计和协同优化方法。