DeepFreeze是用于建模PPA并为FIXYNN项目生成RTL的工具。包括脚本以从TensorFlow图生成RTL,并合成/模拟该设计。要使用非tensorflow图,必须编写自己的图层数据结构以馈送到Veriloggenerator对象(请参阅gen_verliog.py
的末尾)。
有关FIXYNN的更多信息,包括在上下文中对DeepFreeze的描述,请参见以下论文:Fixynn:通过转移学习的移动计算机视觉有效的硬件。
该工具是使用Python 2.7.15和Tensorflow 1.10.1构建和测试的。
所需的Python软件包是numpy和TensorFlow。安装:
pip install numpy tensorflow
cd deep_freeze/
bash run.sh
要添加用于RTL生成或建模的模型,您需要提供:
mobilenet_base
返回https://github.com/tensorflow/tensorflow/models/blob/master/master/research/slim/nets/nets/nets/mobilenet/mobilenet/mobilenet.py)固定网络中的每个层都是由生成的Verilog模块或手写模块的参数实例化定义的。生成具有训练变量的任何层,所有其他层都是实例化的。可训练的变量用可变精度将可训练的变量对RTL进行了硬编码,并以合成设计作为固定标量进行实现。传统上将在可编程加速器中的MAC单元中实现的内容由固定标量组成,然后是固定重量设计中的随身携带加法树。这在能量方面非常有效,但需要一个较大的硅面积。硅区域随固定变量的nuber大致生长。
为了高利用固定数据,我们将管道层完全完整地使用。这需要在层之间进行缓冲激活。我们可以通过使用线缓冲区来避免缓冲一层的整个激活。本文提供了一个基本的解释,哪种线缓冲区以及如何使用它们。
我们的线缓冲区实现由两个部分组成:SRAM缓冲区和寄存器缓冲区。 SRAM将激活的行动存储在一次需要时(等于以下内核的高度)。寄存器缓冲区遵循SRAM缓冲液,并存储以下MXN内核的MXN激活。这消除了SRAM缓冲区的不必要读取。
一层所需的SRAM尺寸为IM_HEIGHT * IM_WIDTH * NCHANNELS * NBITS
。将其分解为IM_HEIGHT * IM_WIDTH
size NCHANNELS * NBITS
的单词。寄存器缓冲区大小为K_HEIGHT * K_WIDTH * NCHANNELS * NBITS
。
硬件中的固定层为各种积极的优化提供了机会(硬件优化和模型设计中的优化)。
网络体系结构的改进可能会导致硬件PPA改进。例如,深度可分离的层能够达到与传统卷积层相似的精度,重量减少了8-9倍。由于面积成本降低,这些层在FIXYNN中表现良好。降低模型大小或提高准确性的任何其他技术都可以使FIXYNN受益。
将重量固定到硅中,使我们能够从某些值的复杂性降低中受益。零值权重是一个示例:可以从没有开销的情况下明确将其从硬件中删除。这使得修剪特别有力和吸引人。
同样,锤子权重较低的值,即其二进制表示中的非零位数量,在固定硬件中实现很便宜。这是因为固定标量是作为一系列班次和添加实现的。固定乘数的非零位越少,所需的偏移和添加越少。综合工具还能够利用相对于表示数字所需的位数的高锤子重量的值。例如,标量x * 239
(锤量= 7,nbits = 8)可以用x << 8 - x << 5
在硬件中实现。
对于高分辨率图像,线缓冲区的每一行都需要大量的SRAM区域。我们可以一次仅对一条线的分数进行缓冲,然后对图像进行多次传递来消除一些SRAM。这是以增加控制硬件的成本和对线缓冲区范围边界上激活的一些冗余计算的代价。由于固定重量硬件非常有效,因此这种冗余的计算会导致能源和延迟的最低成本。
任何1x1内核不需要缓冲液先生,因为它可以直接消耗上一层生成的激活。这会导致深度可分离的层不需要在深度方向和方向卷积之间进行任何缓冲。因此,我们可以将这两个操作融合到一个cambinational块中。
Conv2D层在此设计中很有效,因为它们具有较高的重量重复使用,从而导致面积相对较低。致密层没有重复使用。因此,致密层导致面积的使用效率非常低。此外,密集的层不允许线缓冲,这导致了很大的寄存器区域。
我们针对SYSML 2019的工作(请参阅sysml_2019/
)探讨了完全固定的CNN功能提取器。该特征提取器的PPA很棒,因为它仅包含Conv2D层。固定硬件实施的整个网络必须支付密集层需求的面积成本。对于小物联网模型来说,这可能是可以接受的。
CNN通常表现出前端层具有许多输入像素和少量内核的行为,而后端层的输入像素和大量内核的行为。这导致SRAM区域集中在网络管道的前部,而组合区域则集中在网络管道的背面。
大步大于1x1的任何层产生的激活像素都比每个图像所消耗的较少。例如,在100x100图像上步行2x2的池2D层产生50x50图像,这是像素的4倍降低。这会导致以下层具有1/4倍的活动循环数(每个层的每个输出像素都需要1个周期)。这意味着,前端层的非常深的网络管道将大大瓶颈,导致后端层的利用率较低。
这种见解有助于我们选择可以很好地转化为硬件的模型。某些体系结构通过减少MAC总数(以模型尺寸为代价)来提早进行激活的降采样,以减少CPU的潜伏期(请参阅FD-MobileNet)。 FIXYNN实施的模型希望取得相反的权衡:以计算成本减少参数数量(由于面积是现实世界中性能的主要限制)。
修复硬件中CNN的一部分,因此很难为其他目的重用该硬件。我们在SYSML 2019的工作探讨了这一权衡,并证明了一些固定硬件能够推广到许多不同的模型。未来的工作将着重于通过添加一些可编程性来进一步改善固定硬件的概括(同时仍然从固定重量硬件的效率中受益)。
sram_controller.sv
添加对SAME
填充的支持flatten.sv
来启用完整的图像分类网络,通过将图像从2D层变为密集层。ker_size
写入SRAM,它就会开始消耗激活。使用该工具的已发表作品已在SYSML 2019和Neurips 2018 On Device ML研讨会上介绍。完整的论文可以在Fixynn的Arxiv上找到:通过转移学习,用于移动计算机视觉的高效硬件。
如果您发现这对您的研究有用,请使用以下Bibtex引用我们,
@article{fixynn,
title={FixyNN: Efficient Hardware for Mobile Computer Vision via Transfer Learning},
author={Whatmough, Paul and Zhou, Chuteng and Hansen, Patrick and Venkataramanaiah, Shreyas Kolala and Seo, Jae-Sun and Mattina, Matthew},
journal={SysML},
year={2019}
}
帕特里克·汉森(Patrick Hansen),马萨诸塞州波士顿的ARM ML研究实验室
亚利桑那州立大学Shreyas Kolala Venkataramanaiah
Paul Whatmough,ARM ML研究实验室,马萨诸塞州波士顿
该项目是根据MIT许可证获得许可的 - 有关详细信息,请参见许可证文件。