Abstract
我们建议训练一个once-for-all网络,通过解耦训练和搜索来支持多种架构设置,减少成本。无需附加训练,我们可以通过从OFA网络里选择来快速地得到一个专门的子网络。为了对OFA网络进行有效的训练,我们还提出了一种新颖的渐进式收缩算法、一种广义的修剪方法。这一切使得我们能够得到惊人庞大的可选子网络群以适应不同硬件平台和延迟限制。
Introduction
深度神经网络在许多任务中效果拔群,然而,模型规模和计算消耗的增长同样带来了许多问题,如何有效地将模型部署到适合的硬件平台上成为我们需要考虑的问题。EX,一个app store里的应用能够广泛的支持从N年前的手机到现在的手机等一系列设备,它们的运算能力有天壤之别。在不同的硬件资源限制下,神经网络表现也不尽相同。即使运行在相同的设备上,在不同的电量、不同的性能释放策略影响下,我们对于“最佳模型”的理解也相差很大。
给定不同的硬件平台和效率的限制,研究者们设计紧凑的模型或者把现有的模型进行压缩是目前比较流行的方法,然而, 设计特定结构的DNN模型并非易事,需要有经验的工程师灵光一现,而使用NAS搜索对于计算资源的消耗又让人无法忽视。我们观察到,这些工作在相当程度上是在做重复劳动:我们总是在重复着网络设计和重训练的任务,这也许就是毅种循环吧。因此,我们想一劳永逸地解决这一问题。
这篇paper提出了一种新的思路,设计一个once-for-all的网络,引入一些配置文件吗,它可以直接生成一个自网络实现面向不同平台的部署。它能够灵活地支持不同的深度、宽度、核大小、分辨率,而且,不需要重新训练。特别的,我们把模型训练和NAS这两个步骤做了解耦,在模型训练这一步中,专注于提升每一个子网络的ACC,在模型采样(选择一个子模型)时,从所有子网络中得到若干个子网络的集合来训练ACC的性能算子和延迟算子。给定目标硬件和约束,通过算子的引导进行NAS。这么一来,整个工作的复杂度就从O(N)骤降到O(1)——即,不随着问题复杂度增长而增长。
Method
Problem Formalization
我们把OFA网络的权重称为,架构配置信息叫做,然后,问题就成了这样:
这里,代表一种选择方案,它从OFA的权重里选出一个子网络的配置。训练目标时最小化,让每一个子网络都能保持大差不差的性能,就像它们在独立地训练一样。
Architecture Space
我们的OFA网络提供了一个模型,但它支持生成很多子网络,这些子网络的规模并不相同,覆盖了四个重要的维度,即:深度、宽度、核尺寸和分辨率。像是前辈们所作的一样,我们将CNN网络划分成一系列的单元,它们有着递减的特征图尺寸和递增的通道数(在编码过程中越来越小但越来越“厚”的feature map似乎是一种惯例),每个单元都有一组网络层,这些网络层中,只有第一个跨步(stride)为2,其他的为1。
我们允许每一个单元包含多种层数(弹性深度),每一层都允许多种多的通道数(弹性宽度)和多种尺寸的核(弹性核尺寸),而且,我们还允许CNN模型接受多种尺寸的输入(弹性分辨率)。例如,在我们的实验中,输入图像尺寸范围从124-224(跨步为4),可以任选,每一个单元的网络层数量可以时2/3/4,每一层的膨胀率可以是3/4/6,核尺寸可以是3/5/7,因此,在5个单元的网络中,多样性达到了2*10。如果再考虑到我们可以接收25中不同分辨率的图像,那可用性就更是无敌。既然所有的子网络分享相同的权重,我们的参数量只有7.7M。如果不进行权重分享,那指定没有你好果汁吃。
Training the Once-For-All Network
低情商
训练,OFA网络可以被理解为一种多目标任务,每一个可用的子网络都是一个优化目标,从这一角度出发,我们直接像优化其他多任务网络一样优化OFA网络(只不过优化任务是从网络中实例化出来的子网络决定的),所有的子网络进行同步的更新,但这一方法效率之低下令人发指,它的消耗与子网络数量关系密切,因此,只适用于子网络数量很少的情况。
另一种傻逼方案是从一堆子网络中抽出一部分在每一步中进行更新,这样的方法计算资源的消耗是确实降低了,但数量如此之多的子网络在进行权重共享,它们之间会相互干扰,我们观察到,性能迅速下降。
因此,我们有一个高情商的idea。
高情商
我们的方案是“渐进收缩”,OFA网络既然是由若干个子网络组成,而子网络之间又有许多嵌套关系(小网络是大网络的一部分,这种情况并不少见),为了防止它们相互干扰,我们认为在逐步训练的过程中同时进行从大网络到小网络的收缩是可行的。这种方案被叫做“渐进收缩”。一个典型的例子是始于最大的网络(它有最大的核尺寸,最深的深度,它还最宽),最后,通过一步一步地将小一些的网络添加到采样空间中,我们逐渐对网络进行了调整,最终,得到的网络就小了。具体而言,训练了最大网络之后,我们首先提供了对弹性内核的支持,此时深度、宽度都保持最大,然后是弹性地选择深度,最后才是宽度。整个训练过程中,分辨率都是弹性变化的,这一点通过每批训练的图像都有不同的图像尺寸来保证。在训练最大网络之后,我们也使用了知识蒸馏方法。使用最大的网络提供的软标签和真实标签组合进行优化。
相比于前两种方案,渐进收缩的效果更好。既然最大的网络已经得到了训练,把它微调一下(权重分享)得到一个小网络就不难了。渐进收缩也开始于训练全模型,但这时收缩的内容不仅包括深宽大,也包括分辨率(?)。额外说一点,渐进收缩对于大网络和小网络都进行了微调。结果就是,可以提供更有力的OFA网络,适合多种硬件平台,比起剪枝,更灵活。
Specialized Model Deployment with Once-For-All Network
拥有了一个OFA网络后,我们下一步的任务就是在给定部署环境的情况下抽出一个子网络来,这一目标的作用是搜索一个满足效率要求,精度也说得过去的子网络。既然OFA已经把模型训练和搜索解耦了,我们在这一步所做的一切都不会造成训练消耗。更进一步,我们构建了neural-network-twins来预测神经网络的大致性能和延迟情况,给模型质量一个快速的反馈。通过将测得的精度和延迟替换为预测精度和延迟,降低成本。
要说明一点,我们随机采样了16k个架构和输入尺寸不同的子网络,然后在10k张图像中计量它们的性能,这种[架构,性能]的组合被用来训练性能预测算子,算子来预测给定模型的大致性能,我们还做了一个延迟表,用来比照预测大致的延迟。给定平台和延迟需求,我们基于这种组合算子的搜索就能选出一个特定的子网络。既然。(我的理解,这里的算子其实就是以待查表,因此)搜索的消耗几乎可以忽略不计。
实验
实验细节略
提供两个原则:
- 内存(显存)是一种昂贵的资源,而计算本身是廉价的。一个有效的CNN应该是较少占用内存,较多进行计算。这一比例被定义为arithmetic(OPs/Byte)。越高的arithmetic,内存占用越少,越容易并行计算。多亏了OFA的子网络多样性,OFA的算子可以提供一个性能与延迟之比例的快速反馈,进化搜索可以自动找到一个有着较高arithmetic的CNN网络.
- CNN模型的设计应该充分考虑到硬件的需求,FPGA设备有特定的工具包,可能更适合3*3卷积,这么一来,就应该只选择3*3卷积,即使5*5或7*7卷积也在搜索空间中。而且,大核可能带来爆内存的问题,我们无法接受——而在Intel Xeon CPU的实验中,超过一般的操作都选择了大核。FPGA和GPU都有比CPU更好地并行性,因此模型更宽一点。
Conclusion
我们推出了OFA模型,一种新颖的方法,把训练和搜索相解耦。比起面向平台进行手工编程,它可以支持不同的架构配置,有着可以灵活调配的深度、宽度、核尺寸核分辨率。有效降低了训练消耗。
与之配套,我们还提出了一种渐进收缩的算法来确保大量子网络的性能都能得到同步提升,比起逐个训练(以及逐个训练带来的问题),效果更佳。
OFA提供了一个自动化的完备的系统,高人竟在我身边!