DeepFreeze ist das Tool, das zum Modellieren von PPA und zur Generierung von RTL für das Fixynn -Projekt verwendet wird. Skripte sind enthalten, um RTL aus einem Tensorflow -Diagramm zu generieren und dieses Design zu synthetisieren/zu simulieren. Um mit einem Nicht-Tensorflow-Diagramm zu arbeiten, müssen Sie Ihre eigene Schichtdatenstruktur schreiben, um ein Veriloggenerator-Objekt zu füttern (siehe das Ende von gen_verliog.py
zum Beispiel Verwendung).
Weitere Informationen zu Fixynn , einschließlich einer Beschreibung von Deepfreeze im Kontext, finden Sie im folgenden Artikel: Fixynn: Effiziente Hardware für mobiles Computervision durch Transferlernen.
Dieses Tool wurde mit Python 2.7.15 und TensorFlow 1.10.1 erstellt und getestet.
Erforderliche Python -Pakete sind Numpy und Tensorflow. Zu installieren:
pip install numpy tensorflow
cd deep_freeze/
bash run.sh
Um ein Modell für die RTL -Erzeugung oder -modellierung hinzuzufügen, müssen Sie:
mobilenet_base
in https://github.com/tensorflow/models/blob/master/research/slim/netets/mobilenet/mobilenet.py) zurückgibtJede Schicht in einem festen Netzwerk wird entweder durch ein generiertes Verilog -Modul oder eine parametrisierte Instanziierung eines handgeschriebenen Moduls definiert. Jede Schicht mit trainierbaren Variablen wird erzeugt und alle anderen werden instanziiert. Trainingbare Variablen werden mit variabler Genauigkeit in der RTL fest codiert und in einem synthetisierten Design als feste Skalare implementiert. Was traditionell in einer Mac-Einheit in einem programmierbaren Beschleuniger implementiert werden würde, besteht stattdessen aus festen Skalaren, gefolgt von einem Carry-Save-Addiererbaum in einem festen Gewichtsdesign. Dies ist sehr effizient in der Energie, erfordert jedoch einen großen Siliziumbereich. Der Siliziumbereich wächst ungefähr linear mit dem Nuber von festen Variablen.
Um feste Datenapathen eine hohe Nutzung zu erzielen, pipeline schichten zusammen. Dies erfordert pufferende Aktivierungen zwischen Schichten. Wir können vermeiden, die gesamte Aktivierung einer Schicht durch die Verwendung eines Linienpuffers zu puffern. Dieser Artikel enthält eine grundlegende Erklärung, welche Linienpuffer und wie sie verwendet werden.
Unsere Implementierung eines Linienpuffers besteht aus zwei Teilen: einem SRAM -Puffer und einem Registerpuffer. Das SRAM speichert Aktivierungen für so viele Zeilen, wie sie gleichzeitig zusammengefasst werden müssen (gleich der Höhe des folgenden Kernels). Der Registerpuffer folgt dem SRAM -Puffer und speichert MXN -Aktivierungen für die folgenden MXN -Kerne. Dies beseitigt unnötige Lesungen aus dem SRAM -Puffer.
Die für eine Ebene erforderliche SRAM -Größe ist IM_HEIGHT * IM_WIDTH * NCHANNELS * NBITS
. Dies ist in IM_HEIGHT * IM_WIDTH
-Wörter der Größe NCHANNELS * NBITS
aufgeteilt. Die Registerpuffergröße ist K_HEIGHT * K_WIDTH * NCHANNELS * NBITS
.
Die Behebung von Hardware -Schichten bietet Möglichkeiten für eine Vielzahl aggressiver Optimierungen (sowohl Hardware -Optimierungen als auch Optimierungen im Modelldesign).
Verbesserungen in der Netzwerkarchitektur können zu Hardware -PPA -Verbesserungen führen. Beispielsweise können tiefe trennbare Schichten eine ähnliche Genauigkeit wie herkömmliche Faltungsschichten mit 8-9x weniger Gewichten erreichen. Diese Schichten funktionieren in Fixynn aufgrund reduzierter Flächenkosten sehr gut. Alle anderen Techniken, die die Modellgröße reduzieren oder die Genauigkeit verbessern, können Fixynn zugute kommen.
Durch das Fixieren von Gewichten in Silizium können wir von einer verringerten Komplexität bestimmter Werte profitieren. Null -Wert -Gewichte sind ein Beispiel: Sie können explizit aus Hardware ohne Overhead entfernt werden. Dies macht das Beschneiden besonders mächtig und attraktiv.
Außerdem sind Werte mit niedrigen Hamming-Gewichten, dh die Anzahl der Bits ungleich Null in ihrer binären Darstellung, in fester Hardware billig zu implementieren. Dies liegt daran, dass feste Skalare als eine Reihe von Verschiebungen implementiert und hinzugefügt werden. Je weniger unzusammenliegende Bits des festen Multiplikands, desto weniger Verschiebungen und erforderlich sind erforderlich. Das Synthese -Tool kann auch Werte mit hohem Hamming -Gewicht relativ zu der Gesamtzahl der zur Darstellung der Anzahl erforderlichen Bits nutzen. Beispielsweise kann ein Skalar x * 239
(Hamming -Gewicht = 7, NBits = 8) als x << 8 - x << 5
in Hardware implementiert werden.
Für hochauflösende Bilder erfordert jede Zeile eines Linienpuffers einen erheblichen Bereich von SRAM. Wir können einen Teil dieses SRAM beseitigen, indem wir jeweils nur Brüche einer Linie puffern und das Bild verabschiedet. Dies gilt zu Kosten einer erhöhten Steuerhardware und einer redundanten Berechnung von Aktivierungen auf der Grenze des Linienpufferbereichs. Diese redundante Berechnung verursacht minimale Energie- und Latenzkosten, da die Hardware mit festem Gewicht sehr effizient ist.
Jeder 1x1 -Kernel erfordert keinen Puffer, der ihn vorausgeht, da er die von der vorherigen Schicht erzeugten Aktivierungen direkt konsumieren kann. Dies führt zu tiefen trennbaren Schichten, die keine Pufferung zwischen den Tiefen- und punktuellen Konvolutionen erfordern. Daher können wir diese beiden Operationen zu einem kambinationalen Block verschmelzen.
Conv2d -Schichten sind in diesem Design wirksam, da sie eine hohe Wiederverwendung aufweisen, was zu relativ geringen Flächenkosten führt. Dichte Schichten zeigen keine Gewichtsrückverwendung. Daher führen dichte Schichten zu einer sehr ineffizienten Nutzung des Flächens. Darüber hinaus ermöglichen dichte Schichten keine Leitungspufferung, was zu ziemlich großen Registerflächen führt.
Unsere Arbeit für SYSML 2019 (siehe sysml_2019/
) untersucht mit vollständigen CNN-Feature-Extraktoren von CNN. Der PPA für diesen Feature -Extraktor ist großartig, da er nur Conv2d -Schichten enthält. Ganze in festgelegte Hardware implementierte Netzwerke müssen die Gebietskosten zahlen, die die Nachfrage der Schichten haben. Dies kann für kleine IoT -Modelle akzeptabel sein.
CNNs weisen typischerweise das Verhalten auf, in dem Front-End-Schichten viele Eingangspixel und eine kleine Anzahl von Körnern aufweisen, während Back-End-Schichten weniger Eingangspixel und eine große Anzahl von Körnern aufweisen. Dies führt dazu, dass der SRAM -Bereich in die Vorderseite der Netzwerkpipeline konzentriert ist, während sich der Kombinationsbereich auf die Rückseite der Netzwerkpipeline konzentriert.
Jede Schicht mit einem Schritt von mehr als 1x1 erzeugt weniger Aktivierungspixel als sie pro Bild verbraucht. Beispielsweise erzeugt eine Pool2D -Schicht, die 2x2 über ein 100x100 -Bild steigt, ein 50x50 -Bild, das eine 4 -fache Reduzierung der Pixel darstellt. Dies führt dazu, dass Schichten mit 1/4x die Anzahl der aktiven Zyklen folgen (jedes Ausgangspixel pro Schicht erfordert 1 Zyklus). Dies bedeutet, dass sehr tiefe Netzwerkpipelines mit viel Abtastung durch die Front-End-Schichten stark Engpässe werden, was zu einer geringen Nutzung von Backend-Schichten führt.
Diese Einsicht hilft uns, Modelle auszuwählen, die sich gut in Hardware übersetzen. Bestimmte Architekturen führen eine frühzeitige Down-Sampling von Aktivierungen durch, um die Latenz auf einer CPU zu reduzieren, indem die Gesamtzahl der MACs (auf Kosten der Modellgröße) reduziert wird (siehe FD-Mobilenet). Modelle, die in Fixynn implementiert sind, möchten den entgegengesetzten Kompromiss einführen: Reduzieren Sie die Anzahl der Parameter auf Kosten der Berechnung (da die Fläche die Haupteinschränkung der Leistung in einem realen System ist).
Durch die Behebung eines Teils eines CNN in Hardware ist es schwierig, diese Hardware für einen anderen Zweck wiederzuverwenden. Unsere Arbeit für SYSML 2019 untersucht diesen Kompromiss und zeigt, dass ein gewisses Maß an fester Hardware auf viele verschiedene Modelle verallgemeinern kann. Zukünftige Arbeiten werden sich darauf konzentrieren, die Verallgemeinerung fester Hardware weiter zu verbessern, indem einige Programmierbarkeit hinzugefügt werden (und gleichzeitig von der Effizienz von Hardware mit festem Gewicht profitiert).
SAME
Polsterung hinzu, indem Sie sram_controller.sv
ändernflatten.sv
um vollfeindliche Bildklassifizierungsnetzwerke zu ermöglichen, indem ein Bild von 2D-Ebenen bis zu dichten Ebenen abgeflacht wird.ker_size
von Daten in das SRAM geschrieben wurde.Veröffentlichte Werke, die dieses Tool genutzt haben, wurden auf der SYSML 2019 und im Neurips 2018 On-Device ML Workshop vorgestellt. Das vollständige Papier finden Sie in ARXIV unter Fixynn: Effiziente Hardware für mobiles Computervision durch Übertragungslernen.
Wenn Sie dieses tieffreezige für Ihre Forschung nützlich finden, verwenden Sie bitte die folgenden Bibtex, um uns zu zitieren.
@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 Research Lab, Boston, MA
Shreyas Kolala Venkataramanaiah, Arizona State University
Paul Whatwoug, Arm ML Research Lab, Boston, MA
Dieses Projekt ist unter der MIT -Lizenz lizenziert - Einzelheiten finden Sie in der Lizenzdatei.