Automatic Generation of Multi-precision Multi-arithmetic CNN Accelerators for FPGAs
最近arXiv上掛出來一篇文章,採用FPGA實現MobileNet V1,並且完全是不借助片外資源,用的是on-chip memory,沒有利用off-chip RAM。整個模型在FPGA的內部有限資源上實現的。能夠使得幀率在3000 FPS,這個是最近我看到的一個很快的實現速度了。整個網絡採用了多精度實現,而且是軟硬件結合的方式。整個實現流程如圖所示。
文中也提到了常規算法,在FPGA上實現所採用的方式,即將計算展開,叫做roll-unroll, flatten。本文采用的flattened streaming cores來進行計算。整個卷積的計算採用的寄存器實現,能夠高效的進行操作。這個工程量還是非常大的。下圖展示了常規卷積的實現過程,一個週期cycle計算每一層output的c'個通道上的每一個點的值。採用移位或者乘法器的方式實現。第二個分圖展示的是depthwise convolution的計算過程,對每一層單獨使用一層filter。這個表示也是standard convolution和depthwise convolution的原理解釋。
對於多精度,多bit數的執行,將activation的值,設置爲8 bit 定點數,只是說定點量化的整數和小數,是可以varying from convolution layer。每一層各有不同,是 一個貪心搜索算法來搜索得到的。
同時,作者也單獨把BN層來進行量化,這裏是16位 定點數。
整體實現難度很大,需要仔細的去看實現細節。在真實實現過程中,問題還是很多。各種配置文件。c++寫一些比較上層難以優化和實現的算法和代碼。下端verilog寫卷積的模板文件,以及可分離卷積,這些規則極強,大量for循環計算的模塊,Verilog效率高。混合精度的實現,需要利用寄存器來發揮優勢,而浮點數據的操作,就要消耗更多資源,這時候需要用上層一點的類似於HLS來實現。整個流水的設計,需要緊密的在每一層上做好時鐘計算和設計,上一層的網絡輸出結果,以如何的方式,直接接入下一層的計算。整個流水排開之後,才能達到所敘述的3000fps。單獨處理一張圖片,應該是不能達到的。
具體實現過程還有很多細節,作者的最優權重搜索算法,如何對應不同的input size,模型大小,做擴展,而且是可配置的,這些在FPGA實現上,算是一個優點。因爲其他的FPGA實現的方法,都是寫完一個,就定死,不方便在重新改寫模型的大小,因爲裏面涉及時序,涉及流水的對齊。這個軟件定義模型,然後在硬件綜合生成電路,再轉換爲bit流的方式,可以加快各種模型原型實現的速度。總體不錯。如果想更仔細的看裏面的各種細節,查看原文吧。