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許可證獲得許可的 - 有關詳細信息,請參見許可證文件。