Loading…
Thumbnail Image

Optimizing end-to-end machine learning pipelines for model training

Kunft, Andreas

Modern data analysis programs often consist of complex operations. They combine multiple heterogeneous data sources, perform data cleaning and feature transformations, and apply machine learning algorithms to train models on the preprocessed data. Existing systems can execute such end-to-end training pipelines. However, they face unique challenges in their applicability to large scale data. In particular, current approaches either rely on in-memory execution (e.g., Python Pandas and scikit-learn) or they do not provide convenient programming abstractions for specifying data analysis programs (e.g., Apache Flink and Spark). Moreover, these systems do not support optimizations across operations in these pipelines, which also limits their efficient execution. In this thesis, we present our contributions towards a more efficient execution of end-to-end machine learning pipelines for model training. In particular, we discuss the following three contributions: In our first contribution, we propose a programming abstraction in the dynamic language R on top of the distributed dataflow engine Apache Flink. Our abstraction scales to large amounts of data but also hides system specifics of the dataflow engine. We integrate R and the system language Java in a shared runtime to alleviate the performance overhead of current solutions for language integration in case of complex user-defined functions. In our second contribution, we introduce an intermediate representation for data analytics programs, which allows us to optimize the complete training pipeline. We base our approach on a low-level intermediate representation that provides access to the whole program and augments two abstractions on top of it: a layer that unifies the application of user-defined functions enables operator fusion and pushdown; a high-level representation of the operations enables plan variant selection. In our third contribution, we propose a new context-aware operator for dataflow engines, which directly creates an efficient partitioning schema for matrices from normalized data sources. The operator decouples the evaluation of the join predicate from the materialization of the result. This minimizes data shuffling in distributed settings and enables the operator to choose the materialization strategy depending on the shape of the input relations. In summary, we conclude that we need a holistic system design that covers all tiers – programming abstraction, intermediate representation, and execution backend – to overcome the scalability challenges of large-scale data analysis programs.
Programme zur Datenanalyse vereinigen häufig komplexe Operationen. Sie verknüpfen verschiedenste heterogene Datenquellen, entfernen fehlerhafte Datenpunkte und transformieren deren Darstellung, bevor Modelle mit Verfahren des maschinellen Lernens auf diesen vorverarbeiteten Daten trainiert werden. Obwohl existierende Systeme solche sogenannten Ende-zu-Ende Pipelines ausführen können, stellt sie deren Anwendbarkeit auf großen Datenmengen vor neue Probleme und Herausforderungen. So sind bisherige Ansätze entweder auf die Ausführung innerhalb des verfügbaren Speichers limitiert (z. B.: Python Pandas und scikit-learn), oder es fehlen geeignete Programmierabstraktionen, um vollständige Analyse Pipelines auszudrücken (z. B.: Apache Flink und Spark). Weiterhin bieten diese Systeme keine übergreifenden Optimierungen an, welche die verschiedenen Operationen innerhalb dieser Pipelines einheitlich betrachten. Ausgehend von diesen Herausforderungen, stellen wir im folgenden unsere Forschungsbeiträge zur effizienteren Ausführung von Ende-zu-Ende Pipelines für maschinelles Lernen vor: Innerhalb des ersten Beitrags stellen wir eine Programmierabstraktion für die dynamische Sprache R vor, welche auf dem verteilten Datenfluss System Apache Flink ausgeführt wird. Unsere Implementierung stellt eine benutzerfreundliche Abstraktion bereit, welche die Skalierbarkeit auf große Datenmengen ermöglicht und gleichzeitig die Komplexität des Datenflusssystems verbirgt. Dabei integriert unsere Lösung R und die Systemsprache Java in einer gemeinsamen Laufzeitumgebung. Hierdurch ist eine effiziente Ausführung möglich, welche insbesondere bei komplexen, benutzerdefinierten Funktionen eine Herausforderung darstellt. Innerhalb des zweiten Beitrags führen wir einen Zwischencode für die Repräsentation von Datenanalyseprogrammen ein, der es ermöglicht, über die komplette Analyse Pipeline zu optimieren. Unser Ansatz verwendet dazu drei verschiedene Darstellungsschichten: eine feingranulare Schicht ermöglicht den Zugriff auf alle Details des Programms -- inklusive Daten- und Kontrollfluss -- und dient als Basis für die zwei darüber liegenden Schichten. Die einheitliche Darstellung von benutzerdefinierten Funktionen ermöglicht deren Zusammenführung und effiziente Ausführung. Die Darstellung der einzelnen Operationen auf hohem Abstraktionsniveau ermöglicht die Selektion von äquivalenten Planvarianten. In unserem dritten Forschungsbeitrag stellen wir einen neuen, kontextsensitiven Operator für Datenflusssysteme vor, welcher Matrizen auf effiziente Weise aus normalisierten Daten erstellt -- ein häufiger Teilschritt innerhalb von Ende-zu-Ende Pipelines. Der Operator entkoppelt die Evaluation des Join-Prädikates von der Materialisierung des Ergebnisses. Dies führt zur Minimierung der notwendigen Datenkommunikation und erlaubt eine von der Beschaffenheit der Daten abhängige Wahl der Datenmaterialisierung.