TU Darmstadt / ULB / TUprints

Performance engineering of data-intensive applications

Mazaheri, Arya (2022)
Performance engineering of data-intensive applications.
Technische Universität Darmstadt
doi: 10.26083/tuprints-00021078
Ph.D. Thesis, Primary publication, Publisher's Version

[img] Text
AMazaheri_dissertation_final_oct2021.pdf
Copyright Information: CC BY-SA 4.0 International - Creative Commons, Attribution ShareAlike.

Download (10MB)
Item Type: Ph.D. Thesis
Type of entry: Primary publication
Title: Performance engineering of data-intensive applications
Language: English
Referees: Wolf, Prof. Dr. Felix ; Jannesari, Prof. Dr. Ali ; Riedel, Prof. Dr. Morris
Date: 2022
Place of Publication: Darmstadt
Collation: xix, 114 Seiten
Date of oral examination: 21 October 2021
DOI: 10.26083/tuprints-00021078
Abstract:

Data-intensive programs deal with big chunks of data and often contain compute-intensive characteristics. Among various HPC application domains, big data analytics, machine learning and the more recent deep-learning models are well-known data-intensive applications. An efficient design of such applications demands extensive knowledge of the target hardware and software, particularly the memory/cache hierarchy and the data communication among threads/processes. Such a requirement makes code development an arduous task, as inappropriate data structures and algorithm design may result in superfluous runtime, let alone hardware incompatibilities while porting the code to other platforms.

In this dissertation, we introduce a set of tools and methods for the performance engineering of parallel data-intensive programs. We start with performance profiling to gain insights on thread communications and relevant code optimizations. Then, by narrowing down our scope to deep-learning applications, we introduce our tools for enhancing the performance portability and scalability of convolutional neural networks (ConvNet) at inference and training phases.

Our first contribution is a novel performance-profiling method to unveil potential communication bottlenecks caused by data-access patterns and thread interactions. Our findings show that the data shared between a pair of threads should be reused with a reasonably short intervals to preserve data locality, yet existing profilers neglect them and mainly report the communication volume. We propose new hardware-independent metrics to characterize thread communication and provide suggestions for applying appropriate optimizations on a specific code region. Our experiments show that applying relevant optimizations improves the performance in Rodinia benchmarks by up to 56%.

For the next contribution, we developed a framework for automatic generation of efficient and performance-portable convolution kernels, including Winograd convolutions, for various GPU platforms. We employed a synergy of meta-programming, symbolic execution, and auto-tuning. The results demonstrate efficient kernels generated through an automated optimization pipeline with runtimes close to vendor deep-learning libraries, and the minimum required programming effort confirms the performance portability of our approach. Furthermore, our symbolic execution method exploits repetitive patterns in Winograd convolutions, enabling us to reduce the number of arithmetic operations by up to 62% without compromising the numerical stability.

Lastly, we investigate possible methods to scale the performance of ConvNets in training and inference phases. Our specialized training platform equipped with a novel topology-aware network pruning algorithm enables rapid training, neural architecture search, and network compression. Thus, an AI model training can be easily scaled to a multitude of compute nodes, leading to faster model design with less operating costs. Furthermore, the network compression component scales a ConvNet model down by removing redundant layers, preparing the model for a more pertinent deployment.

Altogether, this work demonstrates the necessity and shows the benefit of performance engineering and parallel programming methods in accelerating emerging data-intensive workloads. With the help of the proposed tools and techniques, we pinpoint data communication bottlenecks and achieve performance portability and scalability in data-intensive applications.

Alternative Abstract:
Alternative AbstractLanguage

Datenintensive Anwendungen arbeiten mit großen Datenmengen und sind daher häufig sehr berechnungsintensiv. Bekannte Beispiele solcher Anwendungen im HPC-Bereich sind Big Data Analyse, Machine Learning und seit Neuestem auch Deep Learning Modelle. Der Entwurf von effizienten datenintensiven Anwendungen erfordert umfangreiches Wissen in Bezug auf Zielhardware und -software, hierbei sind insbesondere die Speicher- und Cache-Hierarchie sowie die Kommunikation zwischen Threads und Prozessen von Bedeutung. Für die Softwareentwicklung stellt dies eine große Herausforderung dar, weil unpassende Datenstrukturen und Algorithmen zu suboptimaler Laufzeitperformanz führen und auch der Transfer auf neue Zielplattformen Kompatibilitätsprobleme mit der Hardware verursachen kann.

In dieser Dissertation werden Werkzeuge und Methoden für das Performance-Engineering von parallelen, datenintensiven Anwendungen vorgestellt. Zuerst wird die Analyse des Laufzeitverhaltens solcher Anwendungen behandelt, um Erkenntnisse über die Kommunikation zwischen Threads zu gewinnen und damit entsprechende Codeoptimierungen vornehmen zu können. Anschließend werden Werkzeuge speziell für Deep-Learning-Anwendungen vorgestellt, die die Performanz-Portabilität und Skalierbarkeit von Convolutional Neural Networks in der Inferenz- und Trainingsphase verbessern.

Der erste Beitrag ist eine neuartige Performance-Profiling-Methode, die potenzielle Engpässe in der Kommunikation aufzeigt, welche durch Datenzugriffsmuster und Threadinteraktionen verursacht werden. Die Untersuchungen hierzu haben ergeben, dass die gemeinsam verwendeten Daten zweier Threads in einem bestimmten Abstand zueinander wiederverwendet werden müssen, um die Datenlokalität zu bewahren. Existierende Profiler berücksichtigen stattdessen meist nur das gesamte Kommunikationsvolumen. Weiterhin werden neue hardwareunabhängige Metriken zur Charakterisierung von Threadkommunikation und Empfehlungen für die Optimierung relevanter Coderegionen vorgeschlagen. Experimente zeigen, dass solche Optimierungen in den Rodinia Benchmarks eine Verbesserung von bis zu 56 % erreichen.

Für den nächsten Beitrag wurde ein Framework zur automatisierten Generierung von effizienten und portablen Convolution-Kernels (u.a. Winograd Convolution) entwickelt, das verschiedene GPU-Plattformen unterstützt. Dazu wird eine Kombination von Metaprogrammierung, symbolischer Ausführung und Autotuning verwendet. Die Experimente zeigen, dass mit Hilfe dieser automatisierten Optimierungspipeline effiziente Convolution Kernel generiert werden, die nahezu die Laufzeiten der Deep-Learning Bibliotheken von etablierten Anbietern erreichen. Zudem unterstreicht der minimale Programmieraufwand die Leistungsportabilität dieses Ansatzes. Die Verwendung von symbolischer Ausführung erlaubt es, sich wiederholende Muster in der Winograd Convolution auszunutzen, sodass bis zu 62 % der arithmetischen Operationen eingespart werden können, ohne die numerische Stabilität zu beeinflussen.

Abschließend werden Methoden zur Skalierung der Performanz von Convolutional Neural Networks in der Inferenz- und Trainingsphase untersucht. Die vorgestellte, spezialisierte Trainingsplattform, die mit einem neuartigen Topologie-bewussten Netzwerkpruning Algorithmus ausgestattet ist, erlaubt schnelles Training von neuronalen Netzen, schnelle Neural Architecture Search und schnelle Netzwerkkompression. Dadurch können KI-Modelle einfach auf eine Vielzahl von Rechenknoten hochskaliert werden, was schneller zu fertigen KI-Modellen bei gleichzeitig geringeren Betriebskosten führt. Darüber hinaus reduziert die Netzwerkkompression die Größe der Convolutional Neural Networks, indem es überflüssige Ebenen entfernt und dadurch die Performanz der Inferenz steigert.

Diese Arbeit demonstriert die Notwendigkeit und die Vorteile von Performance Engineering sowie paralleler Programmiermethoden, um die immer häufiger vorkommenden datenintensiven Anwendungen zu beschleunigen. Mit Hilfe der vorgestellten Werkzeuge und Techniken wurden Engpässe in der Datenkommunikation aufgezeigt und Portabilität und Skalierbarkeit von datenintensiven Anwendungen erzielt.

German
Status: Publisher's Version
URN: urn:nbn:de:tuda-tuprints-210788
Classification DDC: 000 Generalities, computers, information > 004 Computer science
Divisions: 20 Department of Computer Science > Parallel Programming
Date Deposited: 22 Apr 2022 11:24
Last Modified: 05 Aug 2022 06:51
URI: https://tuprints.ulb.tu-darmstadt.de/id/eprint/21078
PPN: 494289813
Export:
Actions (login required)
View Item View Item