summaryrefslogtreecommitdiff
path: root/Presentation
diff options
context:
space:
mode:
authorLeonard Kugis <leonard@kug.is>2023-01-08 04:14:09 +0100
committerLeonard Kugis <leonard@kug.is>2023-01-08 04:14:09 +0100
commit2f104b9618cf88c9694986da19c4dbb455b3baf2 (patch)
tree3cb045503aafc607fc142d1e94cc43225580a423 /Presentation
parente998d619580614ccfcde568985e54b20995943c9 (diff)
Added basics and compression to transcript
Diffstat (limited to 'Presentation')
-rw-r--r--Presentation/transcript.md180
1 files changed, 180 insertions, 0 deletions
diff --git a/Presentation/transcript.md b/Presentation/transcript.md
new file mode 100644
index 0000000..a6d87bf
--- /dev/null
+++ b/Presentation/transcript.md
@@ -0,0 +1,180 @@
+# EIE: Efficient Inference Engine on Compressed Deep Neural Network
+
+## Vorstellung
+
+- Titel
+- Vorstellung der Person
+
+*nächste Folie*
+
+## Inhaltsangabe
+
+- Recap über wichtige Teile der DNN, die für effiziente Inferenz und Kompression wichtig sind
+- Motivation: Warum ist effiziente Inferenz wichtig und was heißt überhaupt effizient
+- Kompression: Verschiedene Komprimierungsmethoden für neuronale Netze
+- Implementation: Eigentliche Implementation der EIE
+- Evaluation: Vergleich der EIE mit anderen Hardware-Acceleratoren
+- Ausblick: Optmierungsmöglichkeiten und mögliche Implementation anderer Komprimierungsmethoden
+
+*nächste Folie*
+
+## Deep Neural Networks
+
+- Recap
+- Beispiel: LeNet
+- Convolutional Layer (Faltungsoperationen mit Filtern)
+- Fully Connected Layer (Alle Neuronen verbunden, für Klassifizierung)
+- FC benötigt in den meisten Netzen 90-95% des Speichers
+- Jede Schicht: Input vector $a$, Gewichtsmatrix $W$, Multiplikation und Addition, Aktivierungsfunktion in jedem Neuron, Output vector $b$
+
+*nächste Folie*
+
+- Formal: Berechnung von $b_i = f(\sum\limits_{j=0}^{n} W_{ij} a_j)$ für jedes Element im Output-Vektor
+- $W_{ij}$ Eintrag in der Gewichtsmatrix
+- $a_j$ Element im Input-Vektor
+- Multiplikation und Summation (Multiply-Accumulate MAC) über die Elemente im Input-Vektor bzw. Zeile in der Gewichtsmatrix
+- $f$ Aktivierungsfunktion
+- Matrix $W$ kann spärlich besetzt sein (englisch: sparse)
+
+*nächste Folie*
+
+## Motivation
+
+- Metriken: Was bedeutet Effizienz?
+- Durchsatz (Throughput): Wie viel Daten können pro Zeiteinheit verarbeitet werden?
+- Latenz (Latency): Wie lange dauert es, einen einzelnen Datensatz zu verarbeiten?
+- Modellgröße: Wie viel Speicher wird zum Speichern des Modells benötigt (hauptsächlich Gewichte, bei komplexeren Modellen auch Parameter für Aktivierungsfunktion)
+- Energieverbrauch: Wie viel Energie wird benötigt, um eine bestimmte Anzahl an Daten zu verarbeiten
+
+*nächste Folie*
+
+## Memory access
+
+- Klassischer Aufbau eines Hardware-Accelerators
+- Energieverbrauch der einzelnen Speichertypen in der Hierarchie
+- Energieverbrauch korrelliert mit Zugriffszeiten und somit mit Latenz und Durchsatz, da so bei Abfragen aus dem Speicher jedes Mal gewartet werden muss
+- DRAM ist bei Acceleratoren der Stand der Technik, um große DNN zu speichern (bisher ohne Komprimierung)
+- DRAM hat 200x Energieverbrauch im Vergleich zu Registerzugriffen
+- DRAM hat 33x Energieverbrauch im Vergleich zu SRAM-Buffer
+
+*nächste Folie*
+
+- Art und Anzahl der Speicherzugriffe variieren je nach Datenfluss-Modell
+- Acceleratoren können nicht immer eindeutig einem Modell zugeordnet werden, EIE ist eine Mischung aus a) und b)
+- Im Detail werden die einzelnen Modelle nicht vorgestellt
+
+*nächste Folie*
+
+- Hier sind die einzelnen Speicherzugriffe markiert
+- Jeder einzelne Speicherzugriff kostet Zeit und Energie, es ist also eines der Hauptmerkmale zur Optimierung
+
+*nächste Folie*
+
+## Komprimierung
+
+- Welche verschiedenen Speicherarten haben wir in einem Accelerator?
+- Dynamisch: Eingabedaten
+- Statisch: Gewichte, Parameter für Aktivierungsfunktionen
+
+*nächste Folie*
+
+## AlexNet
+
+- Um sich die Größenordnung des benötigten Speichers zu vergegenwärtigen
+- Populäres neuronales Netz, benannt nach designer Alex Krizhevsky
+- 5 convolutional layers
+- 3 fully connected layers
+- $\sim 62$ million parameters
+- $\sim 240$ MB with 32-bit float representation
+- Häufig für Benchmarking von Acceleratoren verwendet
+
+*nächste Folie*
+
+## Basis projection
+
+- Standardmäßig sind die kanonischen Einheitsvektoren die Basisvektoren für die Gewichtsmatrizen
+- Meistens produzieren jedoch andere Basisvektoren, auf die die Zeilenvektoren der Gewichtsmatrizen projiziert werden, bessere Werte
+- Besser = Geringere Werte (ungefähr 0 oder gleich 0)
+- Genau das wird hier gemacht
+- Gewichte als Linearkombination der Basisvektoren darstellbar
+- Beispiel: Von 7% Nullen auf 56% Nullen
+
+*nächste Folie*
+
+## Pruning
+
+- Entferne unwichtige Gewichte, die kaum Einfluss auf die Genauigkeit des neuronalen Netzes haben
+- 3-Schritt-Verfahren: Training, Pruning (Gewichte werden auf 0 gesetzt oder ganze Output-Neuronen in einer Schicht weggelassen), Retraining (ohne die entfernten Gewichte)
+- Wiederholung so lange, bis je nach Verfahren nichts mehr entfernt werden kann oder ein unterer Grenzwert der Genauigkeit unterschritten worden ist
+
+*nächste Folie*
+
+- Mehrere Pruning-Verfahren möglich
+- Betrags-Grenzwert-Verfahren (englisch: magnitude threshold based pruning):
+ Entferne Gewichte, deren Betrag unter einem bestimmten Grenzwert liegen
+- Optimal Brain Damage / Optimal Brain Surgeon (ja, so heißen die Verfahren wirklich):
+ - Entfernt Gewichte basierend auf ihrem Einfluss auf die Zielfunktion (Fehlerfunktion, z.B. Quadratische Fehlerfunktion)
+ - Gewichte mit geringem Einfluss werden entfernt
+ - Optimal Brain Damage berechnet die Sensitivitätswerte basierend auf dem Gradienten, Optimal Brain Surgeon basierend auf der Hesse-Matrix
+- Biased weight decay
+ - Entfernen von Gewichten durch Hinzufügen eines Terms im Update-Schritt beim Backpropagation-Algorithmus
+ - Große Gewichte bleiben länger, kleine Gewichte konvergieren zu Null
+ - Während des Trainings, Details außerhalb des Scopes, hier geht es nur um Inferenz, bei der bereits ein vollständig trainiertes NN vorliegt
+
+*nächste Folie*
+
+## Weight quantization
+
+- Gewichtsquantisierung
+- Grob: Floating point Gewichte werden als Ganzzahl-Werte kodiert
+- Wird durch Clustering gelöst
+- Ähnliche Gewichte werden in Clustern gruppiert
+- Jeder Cluster hat einen Mittelwert (centroid), durch den dann jedes Gewicht des Clusters ersetzt wird
+- Am Ende gespeichert werden nur die Cluster indices und die Mittelwerte der Cluster in einem extra Array, welche mit den indizes indiziert werden
+- Durch den Gradienten der Gewichtsmatrix lassen sich die Werte der centroids fine-tunen
+
+*nächste Folie*
+
+- Wie weise ich die Gewichte den Clustern zu?
+- Minimierung der Varianz innerhalb aller Cluster
+- k-means clustering: 1. Initialisiere k cluster centroids, 2. Für alle Gewichte: Füge Gewicht dem Cluster hinzu, dessen Mittelwert am nächsten dran ist, berechne Mittelwerte aller Cluster neu (weil sich der Mittelwert durch das Hinzufügen ja ändert)
+
+*nächste Folie*
+
+- Die Initialisierung der Mittelwerte macht einen entscheidenden Unterschied bezüglich der Genauigkeit der Quantisierung und damit der Genauigkeit des gesamten NN
+- In vielen Anwendungen des k-means clusterings wird die CDF (kumulative Verteilungsfunktion) betrachtet, die Anzahl der Vorkommnisse (y-Achse) äquidistant abgetastet, und die dazugehörigen Werte als Mittelwerte genommen
+- Das führt allgemein dazu, dass die durchschnittliche Abweichung von den eigentlichen Werten am geringsten ist
+- Im Kontext NN: Höhere Werte haben größere Auswirkung auf Ergebnis als niedrige, sind aber selten und somit im CDF-Verfahren unterrepräsentiert, wodurch hohe Abweichungen in solchen Werten entstehen
+- Daher: Lineare Initialisierung
+
+*nächste Folie*
+
+## Huffman encoding
+
+- Zählung und Sortierung der vorkommenden Gewichtswerte
+- Erstellen des Huffman-Baumes: Am seltendsten vorkommende Gewichte unten, je häufiger, desto weiter oben am Wurzelknoten
+- Binärbaum: Kodierung über Kanten 1 und 0
+- Gespeichert werden muss nur der Baum, die Daten können somit z.B. von 1,58 Megabits auf 1,17 Megabits reduziert werden
+
+*nächste Folie*
+
+## HashNets
+
+- Idee: Es müssen keine Indexwerte in der Matrix gespeichert werden
+- Stattdessen: Es existiert eine sog. Hashfunktion $h^{\ell}(i, j)$: Einweg-Funktion, welche den Matrix-Koordinaten $(i,j)$ einen Indexwert für das Lookup-Array $w^{\ell}$ zuweist
+- Somit existiert keine tatsächliche Matrix, sondern sie ist nur virtuell, gespeichert werden muss nur die größe der Matrix, die Hashfunktion und das Lookup-Array
+
+*nächste Folie*
+
+## Speicherformat
+
+- Etabliert hat sich das Compressed Sparse Column (CSC) / Compressed Sparse Row (CSR) Format
+- Je nach dem, ob man PEs des Accelerators nach Spalten oder Zeilen segmentieren und input oder output lokal bleiben möchte
+- EIE nutzt das CSC Format
+- Jede Spalte wird als Vektoren $v$ und $z$ kodiert
+- $v$ enthält alle Gewichte, die nicht null sind
+- $z$ enthält die Anzahl der Nullen vor dem jeweiligen Eintrag in $v$
+- Beispiel: $W_j = [0, 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3]$ wird zu $v = [1, 2, 0, 3]$, $z = [2, 0, 15, 2]$
+- EIE: $v$'s und $z$'s aller Spalten werden zusammen als ein großes Array-Paar gespeichert, zusammen mit Vektor $p$, wobei $p_j$ ein Zeiger auf das erste Element der Spalte $W_j$ ist
+
+*nächste Folie* \ No newline at end of file