BOFIT: Hyperparameter-Optimierung für Deep Learning mit FPGAs
Einführung
In eingebetteten Systemen müssen oft Vorgaben im Bereich Energieverbrauch und Rechenzeit mit beschränkten Hardware-Komponenten eingehalten werden [1]. Daher ist es nicht gerade trivial, Deep Learning "on the edge" auszuführen (besonders wenn man hört, dass die großen Tech-Firmen gerade massiv in leistungsfähige Hardware und in die für den Betrieb von neuronalen Netzen notwendige Energie investieren). Generell hängt die Qualität einer Inferenz von der Architektur des Modells und der Hardware ab, auf der sie ausgeführt wird [2]. Im klassischen Vorgehen wird nur das Modell optimiert. Wenn es daneben aber möglich ist, die Hardware auf bestimmte Entwicklungsziele anzupassen, können bessere Ergebnisse erzielt werden. Die Verwendung spezialisierter Hardware ist eine vielversprechende Option, die Rechenleistung eines Systems zu verbessern, auch wenn Vorgaben wie geringer Energieverbrauch vorhanden sind [3]. FPGAs (Field Programmable Gate Array) bieten sich hierfür an, da ihre angepasste Implementierung für eine bestimmte Aufgabe relativ schnell und kostengünstig umgesetzt werden kann.
BOFIT (Bayesian Optimization for FPGA-accelerated Inference Tuning) wurde von mir unter diesem Akronym realisiert, um diese Ziele auch in der Praxis umzusetzen. BOFIT ist ein selbst entwickeltes Vorgehen, das sowohl das Modell optimiert, aber auch die Flexibilität von FPGAs zur Verbesserung der Inferenz hinzuzieht.
Deep Learning mit FPGAs - Wie geht das?
FPGAs besitzen gewisse Vorteile in Bezug auf Deep Learning [4-8]:
- FPGAs sind oft direkt mit Sensoren verbunden oder an Schnittstellen platziert. Dadurch können Daten mit neuronalen Netzen schon dort verarbeitet werden, wo sie entstehen.
- Verglichen mit klassischen Prozessoren ist mit FPGAs eine hohe Parallelität möglich.
- FPGAs können durch geringere Redundanz schneller und effizienter sein als allgemeine Hardware.
- Verglichen mit Application Specific Integrated Circuits (ASIC) sind mit FPGAs schnellere und kostengünstigere Hardwareanpassungen möglich.
Es gibt aber auch Nachteile [4-8]:
- FPGAs sind durch die mögliche Hardware-Flexibilität langsamer als Graphics Processing Units (GPU), aber können durch Spezialisierung der Implementierung und Parallelität vergleichbare Ergebnisse erzielen.
- FPGAs können mit den klassischen Deep Learning Frameworks wie PyTorch nicht direkt angesteuert werden.
Da neuronale Netzwerke nicht direkt auf FPGAs ausführbar sind, gibt es verschiedene Frameworks, die das ermöglichen. Diese Tools automatisieren die Implementierung des FPGAs und generieren eine optimierte Beschreibung der Modelle zur Ausführung der Inferenz auf dem FPGA. Beispiele für solche Tools sind Vitis AI und FPGA AI Suite. Die Implementierung der Hardware kann durch Konfigurationen beeinflusst werden, die entweder automatisch (abhängig von der Modellbeschreibung) oder manuell eingestellt werden. Einen Überblick des Ablaufs zur Ausführung eines Modells auf einen FPGA ist in folgender Skizze zu sehen:
Modelle werden typischerweise auf einer hohen Ebene definiert und trainiert (z.B. mit Tensorflow oder PyTorch). Mit einem passenden Framework wird das Modell optimiert und in ein Programm umgewandelt, das auf dem FPGA geladen und damit die Inferenz ausgeführt werden kann. Einige Frameworks extrahieren die Konfiguration der Hardware aus dem trainierten Modell automatisch, aber das ist nicht mit jedem Tool möglich. Eine manuelle Konfiguration ist die Alternative. Mit der Hardwarekonfiguration wird der FPGA implementiert und schließlich das Programm darauf ausgeführt.
Motivation und Aufgabenbeschreibung
Die automatische Generierung einer passenden Hardwarebeschreibung ist auf dem ersten Blick sehr ansprechend, hat aber mehrere Nachteile:
- Die Ausführung der Inferenz auf der Hardware muss modelliert werden, um Aussagen über die Rechenzeit und den Energieverbrauch zu treffen, was genaues Wissen über die Hardware und das Backend des Frameworks voraussetzt.
- Nebeneffekte wie variable Latenz durch Speicherzugriffe können nur sehr schwer modelliert werden.
- Eine akkurate Modellierung des Energieverbrauchs ist schwierig.
- Nicht alle Tools ermöglichen eine automatische Konfiguration.
Daraus folgt, dass für eine Optimierung der Hyperparameter des Modells und der Hardware reale Experimente nötig sind, um mit konkreten Messwerten optimale Konfigurationen zu bestimmen. Eine solche Optimierung musste daher entwickelt werden. Die Optimierung sollte auch mit konkurrierenden Entwicklungszielen wie geringer Energieverbrauch, geringe Latenz und hohe Genauigkeit gute Ergebnisse erzielen können. Die Möglichkeit, das Modell und die Hardware gleichzeitig zu optimieren, sollte möglich sein. Die Methode sollte zudem einfach in die bestehenden Frameworks inkludiert werden können. Die Optimierung wurde für das Framework Vitis AI von AMD erprobt.
Architekturen im FPGA-Kontext
FPGAs sind aus mehreren Configurable Logic Blocks (CLB), IO-Blöcken sowie gehärteten Speicherelementen und Digital Signal Processors (DSP) aufgebaut. Die einzelnen Elemente können mittels einstellbarer Interconnects verbunden werden. Eine Architektur im FPGA-Kontext beschreibt eine spezielle Implementierung einer Funktionalität und impliziert die Verschaltung einer gewissen Anzahl der oben genannten Elemente.
Als Analogie:
- Eine Architektur ist eine Art Kochrezept.
- Es werden Zutaten (Elemente) benötigt, die sich aus dem Rezept ergeben.
- Welche Zutaten benötigt werden, hängt davon ab, was (welche Funktionalität) und wie viele Portionen (welche Eigenschaften) ich kochen will.
- Im Supermarkt (FPGA) gibt es dann ein gewisses Sortiment an Zutaten in mehrfacher Ausführung, aus denen dann die passenden für das Rezept ausgewählt werden.
Erste Schritte
In Vitis AI wird die Hardware-Konfiguration mit Architekturen parametrisiert, die die Beschleunigungseinheit (Deep Learning Processing Unit) für ML-Operationen auf dem FPGA einstellen. Die einzelnen Architekturen unterscheiden sich darin, wie viele Berechnungen maximal pro Clock Cycle möglich sind, indem sie Ressourcen und Parallelitäten unterschiedlich strukturieren. Dies ist auch in der Namenskonvention hinterlegt. Es scheint, dass Architekturen mit höherer Maximalgeschwindigkeit auch generell schneller sind. Dies widerlegt aber folgendes Experiment mit dem ResNet-50 Modell:
Manche Architekturen sind in der Ausführung der Inferenzen schneller bzw. gleich schnell als deren große Brüder. Zum Beispiel sind die Architekturen B1152 und B2304 nahezu gleich schnell in der Ausführung des Testsets. Interessant ist auch der Energieverbrauch:
Auch hier verhalten sich die verschiedenen Architekturen unterschiedlich. Hinzu kommt noch, dass verschiedene Modellbeschreibungen die einzelnen Architekturen mal besser und mal weniger gut ausnutzen. Es ist daher nicht trivial, eine gute Konfiguration aller Hyperparameter zu erhalten, weil es sehr viele Abhängigkeiten zwischen den einzelnen Einstellungen gibt.
Aus den Anforderungen und Lösungsmöglichkeiten ergeben sich beispielsweise folgende Fragen:
- Ist jetzt ein modernes und großes Modell mit hoher Genauigkeit vorteilhaft oder ist eine Mid-range Architektur mit höherer Geschwindigkeit und geringerer Energieeffizienz ein besserer Kompromiss?
- Welche Modelle und Operatoren sind besser geeignet für die verfügbaren Hardwareoptionen?
Diese Fragen können so nicht effektiv beantwortet werden und es bedarf einer anderen Herangehensweise.
Optimierung der Hyperparameter
Zum einen entstehen durch die neue Ebene der Hardware-Konfiguration neue Abhängigkeiten, zum anderen sind Evaluierungen am echten System zeitlich teuer, da die Modelle trainiert und für den FPGA umgewandelt werden müssen, der FPGA selbst aber auch gebaut werden muss. Daher sollte eine Optimierung gewählt werden, die den gesamten Suchraum abdecken kann, verschiedene konkurrierende Ziele optimiert und in einer überschaubaren Anzahl an Iterationen brauchbare Ergebnisse erzielen kann.
Hier bietet sich die Bayes'sche Optimierung an, da die Auswahl der nächsten zu untersuchenden Konfiguration auf allen vergangenen Messungen beruht, aber das Vorgehen an sich auch weniger parametrisiert und zufällig ist im Vergleich zu anderen Methoden. In Bayes'scher Optimierung wird ein probabilistisches Modell verwendet, um eine unbekannte Systemfunktion zu beschreiben. Dieses Modell gibt Schätzungen über die Wertpaare der Funktion an, aber auch deren Unsicherheiten. Dieses Modell wird nach jedem Messdurchgang aktualisiert. Mithilfe des Modells wird eine sogenannte Akquisitionsfunktion optimiert, was die beste Konfiguration bestimmt, die als Nächstes ausgewertet werden soll. Nachdem eine Initialkonfiguration ausgewählt wurde, werden so lange Konfigurationen durchgeführt, bis genügend qualitativ hochwertige Ergebnisse erzielt wurden.
Experimente und Ergebnisse
Für die Experimente wurde der Datensatz Cifar-10 ausgewählt. Es wurde ein konfigurierbares Modell mit einer variablen Anzahl an Convolutions und deren Größe, die Position von Pooling-Operatoren und der Möglichkeit einer Verwendung von residualen Verbindungen bzw. effizienteren Convolutions erstellt. Auf Seite der Hardware wurden die verschiedenen Architekturen als Hyperparameter festgelegt.
In den folgenden Plots sind die Ergebnisse der Optimierung erkennbar. Jeder Punkt entspricht einer bestimmten Konfiguration, die in Bezug auf die Entwicklungsziele unterschiedlich performant ist. Es ergibt sich in den Plots eine Grenze an Konfigurationen, die besonders gut zwischen den Entwicklungszielen abwägen. Diese Grenze wird Pareto-Front genannt. Konfigurationen auf der Pareto-Front sind die Besten mit jeweils unterschiedlicher Gewichtung der Entwicklungsziele. Im Allgemeinen werden Konfigurationen mit hoher Genauigkeit, hohem Durchsatz und niedrigem Energieverbrauch gesucht.
Es sind nicht alle Konfigurationen der Pareto-Front relevant, da die Genauigkeit nur im sinnvollen Maß zur Verbesserung des Durchsatzes bzw. des Energieverbrauchs reduziert werden kann. Folglich ist nur der Bereich hoher Genauigkeit relevant. Die Modelle mit jeweils bester Geschwindigkeit bzw. Energieverbrauch wurden aus diesem Bereich extrahiert und als Vergleich auf einer GPU ausgeführt. Zudem wurden diese Modelle mit dem ResNet-50 Modell verglichen. Die Ergebnisse sind in folgender Tabelle veranschaulicht:
Model | Hardware | Durchsatz in FPS | Ø Leistung µW | Energiekosten µWh/Inferenz |
---|---|---|---|---|
ResNet-50 | FPGA | 202.9 | 5.3 | 7.3 |
GPU | 4847.6 | 69.0 | 4.0 | |
Beste Geschwindigkeit | FPGA | 1521.7 | 7.3 | 1.3 |
GPU | 13.0k | 73.5 | 1.6 | |
Bester Energieverbrauch | FPGA | 992.4 | 4.7 | 1.3 |
GPU | 17.3k | 64.6 | 1.0 |
Tab. 1: Vergleich der Ergebnisse von BOFIT auf verschiedenen Hardware-Plattformen.
Es ist zu erkennen, dass der FPGA generell langsamer ist und weniger Leistung verbraucht als eine GPU. In Bezug auf Anwendungen in eingebetteten Systemen wäre dies durchaus akzeptabel und gewollt. Um einen besseren Vergleich zwischen den beiden Systemen herzustellen, wird die Größe der Energiekosten eingeführt, die den energetischen Preis einer Inferenz abbildet. Für ResNet-50, was nicht für den FPGA optimiert wurde, ist klar zu erkennen, dass die GPU bessere Ergebnisse erzielt als der FPGA. Für die mit BOFIT optimierten Modelle ist der Unterschied wesentlich geringer und beim schnellsten Modell konnte die GPU sogar überholt werden. In diesem Kontext zeigt es sich, dass die Modelle mit BOFIT generell optimiert wurden, aber die größeren Verbesserungen klar beim FPGA zum Tragen kommen, da die Modelle speziell für die Hardware optimiert wurden und auch die Hardware für diese angepasst wurde.
Ausblick
In der Zukunft kann analysiert werden, wie sich BOFIT auf andere Hardware und Deep Learning Frameworks für FPGAs auf die Ergebnisse auswirkt. Methoden zur gezielteren Ergebnisfindung könnten für die Bayes'sche Optimierung ähnliche Ergebnisse in weniger Durchläufen erzielen. Andere Ansätze von Neural Architecture Search können mit dem des verwendeten parametrisierten Modells verglichen werden.
Abschließendes
Dieses Thema wurde im Rahmen meiner Masterarbeit behandelt. Neben der technischen Betreuung wurde mir auch bei der schriftlichen Ausführung und der Abschlusspräsentation immer schnell und gerne weitergeholfen. Alle benötigten Ressourcen wurden mir ebenfalls zur Verfügung gestellt. Es wurde ein Umfeld geschaffen, in dem ich mich technisch aber auch im Bereich der Soft Skills sehr weiterentwickeln konnte. Zusammenfassend bin ich sehr zufrieden mit der Durchführung meiner Masterarbeit gewesen und es freut mich, dass ich meine letzte Studienleistung in guter Erinnerung behalten kann.
Quellen
- Sze, V. et. al.. (2017, August 13). Efficient Processing of Deep Neural Networks: A Tutorial and Survey.
- Qiu, J. et. al.. 2016. Going Deeper with Embedded FPGA Platform for Convolutional Neural Network. Proceedings of the 2016 ACMSIGDA International Symposium on Field-Programmable Gate Arrays, 26-35.
- Reuther, A. et. al.. 2019. Survey and Benchmarking of Machine Learning Accelerators. IEEE High Performance Extreme Computing Conference (HPEC ’19), 1–9.
- Guo, K, et. al. 2019. [DL] A Survey of FPGA-based Neural Network Inference Accelerators. ACM Transactions on Reconfigurable Technology and Systems (TRETS), 12(1), 1-26.
- Nechi, A. et. al.. 2023. FPGA-based Deep Learning Inference Accelerators: Where Are We Standing? ACM Transactions on Reconfigurable Technology and Systems, 16(4), 1-32.
- Farabet, C. et. al.. 2009. CNP: An FPGA-based processor for Convolutional Networks. International Conference on Field Programmable Logic and Applications, 32–37.
- Mittal, S.. 2020. A survey of FPGA-based accelerators for convolutional neural networks. Neural Computing and Applications, 32(4), 1109–1139.
- Guan, Y. et. al.. 2017. FP-DNN: An Automated Framework for Mapping Deep Neural Networks onto FPGAs with RTL-HLS Hybrid Templates. 25th Annual International Symposium on Field-Programmable Custom Computing Machines,152–159.