Machine Learning mit MLflow

Der gesamte Machine-Learning (ML) Prozess zeichnet sich in vielen Fällen durch eine außerordentlich hohe Komplexität aus, welche sich hauptsächlich durch folgende Ursachen erklären lässt:

  • Wachsender Parameterumfang: Mit immer leistungsstärkerer Hard- und Software wächst auch die Anzahl unterschiedlicher Parameter, welche im ML Prozess berücksichtigt werden. Den Überblick darüber zu behalten, welche Parameterkombinationen welche Resultate liefern, kann bei großer Parameterzahl schnell zu einer Herausforderung werden.
  • Keine Standardisierung: Für die Gestalt eines ML Modells gibt es kaum bzw. gar keine Standards. Dadurch wird es wesentlich erschwert unterschiedliche Modelle von anderen Entwicklern in den eigenen Workflows und Projekten mit reproduzierbaren Resultaten zu verwenden.
  • Eine enorme Vielzahl an Tools und APIs: Im ML Umfeld haben sich für verschiedene Problemstellungen, Projektschritte und Lösungsansätze die unterschiedlichsten Tools etabliert. Diese erfordern für ihren Einsatz unzählige verschiedene Applikationen, Bibliotheken und Implementierungen.

 

Um der Komplexität Herr zu werden, hat Databricks mit MLflow ein Open-Source-Tool entwickelt, welches die Komplexität im gesamten ML Lebenszyklus reduzieren soll. Dabei gliedert sich MLflow in drei Komponenten, welche zwar dahingehend entwickelt worden sind im Verbund zu arbeiten, aber auch unabhängig voneinander verwendet werden können:

  1. Tracking
  2. Projects
  3. Models

In diesem Blogbeitrag wollen wir die Komponenten von MLflow näher beleuchten und die Funktionen beschreiben, sowie einige Anwendungsfälle skizzieren.

Tracking

Der Einfluss von unterschiedlichen Parametern und etwaigen weiteren Umständen auf das Resultat eines ML Algorithmus ist aufgrund der schieren Anzahl der zu berücksichtigenden Faktoren nur schwierig zu erfassen. Hier verschafft MLflow Tracking Abhilfe.

Mit Tracking wird dazu eine API und ein UI bereitgestellt, welche zum Logging von Parametern, Codeversionen, resultierenden Metriken und entsprechenden Output Files sowie deren Visualisierung genutzt werden kann. Dabei kann Tracking in Python, REST, R API und JAVA API verwendet werden, wobei der Ort der Codeausführung, etwa in einem alleinstehenden Programm, auf einer Maschine in der Cloud oder in einem interaktiven Workbook, keine Rolle spielt. Auf diese Weise ist ein großes Anwendungsspektrum gewährleistet.

Der Nutzer konfiguriert Tracking basierend auf sogenannten Runs, wobei ein Run die Ausführung eines Stückes von Data Science Code, meist eine Trainingsiteration, darstellt. Für einen Run werden dann die Informationen zu Start- und Endzeitpunkt, Codeversion, Parametern, Metriken und Artefakten wie beispielsweise Bilddateien oder Modellinformationen in einem Log persistiert. Es kann dabei genau ausgewählt werden, welche Werte tatsächlich in der Logdatei festgehalten werden sollen und darüber hinaus, an welchem Ort diese abgelegt werden soll, zum Beispiel auf der lokalen Maschine, in S3, Azure, Google Cloud Storage oder HDFS. Auf diese Weise lassen sich die Parameterinformationen auch zentral auf einem Server ablegen und für diverse Nutzer zugänglich speichern.

Die Auswahl der in den Log aufzunehmenden Informationen erfolgt beispielsweise in der Python API sehr einfach über mlflow.log_param() oder mlflow.log_metric().

Mit der Tracking UI können die Resultate dann sehr übersichtlich dargestellt werden, wie in den beigefügten Abbildungen zu sehen ist. Dabei bietet die UI nicht nur eine tabellarische Übersicht, sondern auch verschiedene Darstellungen mit Plots.

Abbildung 1: Vergleichende Übersicht der Resultate von drei Runs

 

Abbildung 2: Übersicht der Runs

 

Projects

Um eine Standardisierung des Formats zum Packaging von Data Science Code zu erzielen, kann MLflow Projects verwendet werden. Dabei stellt jedes Projekt schlicht ein Verzeichnis oder ein Git-Repository dar und nutzt gängige Konventionen oder aber ein sogenanntes descriptor file, um seine Abhängigkeiten und wie der Code ausgeführt werden soll zu spezifizieren. Die Standardisierung soll es dabei ermöglichen, den Code auch in anderen Projekten und Workflows schnell und unkompliziert einsetzen zu können, ohne alle abhängigen Komponenten manuell zu konfigurieren.

Ein Projekt kann im Detail die folgenden Eigenschaften spezifizieren: einen Namen, Entry Points für das Programm (d.h. Anweisungen, welche zum Ausführen des Programms aufgerufen werden können), sowie Umgebungsinformationen (d.h. Library Dependencies in Form von Conda Umgebungen, Docker Container Umgebungen oder System Umgebungen). Das Ausführen eines erstellten Projektes erfolgt sehr einfach über die Verwendung des mlflow run Commands in der Konsole oder die Python API mittels mlflow.projects.run() und bietet somit die Möglichkeit, dass auch unerfahrene Nutzer die Projekte einfach ausführen können.

Ein Projekt bietet darüber hinaus die Möglichkeit Artefakte aus MLflow Tracking aufzugreifen und als Eingabe zu verwenden. Auf diese Weise können mehrstufige Workflows konstruiert werden, in welchen der Output eines Projektes mittels Tracking in Form von Artefakten direkt an das nächste Projekt weitergegeben wird.

Models

Für das Packaging und Deployment von ML Modellen bietet MLflow Models eine Standardisierung an, welche in einer Vielzahl von Downstream Tools verwendet werden kann, beispielsweise mit einer REST API in Apache Spark. Ein Model ist dabei ein Verzeichnis, welches diverse Dateien nebst einer MLmodel-Datei enthält, welche die sogenannten Flavors vorgibt in welcher das ML Modell betrachtet werden kann.

Diese Flavors sind die Schlüsselkomponente, welche die MLflow Models ausmachen, denn sie bilden eine Konvention, welche von Deployment Tools genutzt werden kann, um das ML Modell zu verstehen, was die Entwicklung von Tools erlaubt, welche mit ML Modellen aus beliebigen ML Bibliotheken umgehen können ohne die Notwendigkeit, das Tool für jede einzelne Bibliothek anzupassen.

Es stehen diverse Flavors zur Verfügung, etwa „Python function“. Die Verwendung dieses Flavors sorgt dafür, dass das ML Modell als Python Funktion beschrieben wird. Somit kann das Modell nun durch Tools verwendet werden, welche das Modell lediglich aufrufen müssen. Auch Bibliotheken können als Flavor verwendet werden, etwa der „scikit-learn“ Flavor. Dieser erlaubt es, ML Modelle als scikit-learn Pipeline Objekt zu laden zur Verwendung in Tools, welche scikit-learn verstehen, oder als generische Python Funktion.

Anwendungsfälle

  • Bei der Umsetzung der DSGVO sind Unternehmen gemäß Art. 15 dazu verpflichtet, bei der Verwendung von Scoring Modellen dem Kunden Auskunft über die verwendeten Parameter zu erteilen. In diesem Fall kann Tracking auf einem Server verwendet werden, um die verwendeten Parameter zur Erfüllung der gesetzlichen Pflichten zu speichern.
  • Ein einzelner Data Scientist kann Tracking auf seinem Rechner verwenden, um einen Überblick über seine Parameter und deren Effekt zu behalten. Projects können hilfreich sein, um die entworfenen Modelle für die weitere Verwendung strukturiert abzulegen. Sollen die Resultate deployt werden, um etwa von einem Data Engineer genutzt zu werden, kann dafür Models herangezogen werden.
  • Ein Team von Data Scientists kann einen Tracking Server verwenden, um die Resultate bei verschiedenen Parametern für alle Mitglieder stets verfügbar zu halten. Durch die Verwendung interner Konventionen können die einzelnen Entwickler ihre Modelle nach persönlichen Präferenzen anpassen und letztlich mit Projects und Models standardisiert den übrigen Teammitgliedern zur Verfügung stellen.
  • In der Forschung und nicht-kommerziellen Entwicklung können Resultate und Modelle via GitHub geteilt werden. Unter Verwendung der Project Funktionalitäten lassen sich die Modelle dabei von jedem leicht ausführen.

 

Generelles

Die Installation von MLflow kann über pip vorgenommen werden und erfolgt daher unkompliziert. Zur Verwendung kann man die Dokumentation des Projektes zu Rate ziehen, welche zudem mit einem Quickstart Guide und Tutorials zu den Funktionalitäten aufwartet.

Resümee

Bereits für kleine Projekte können die Funktionalitäten, insbesondere Tracking, interessant sein, um einen Überblick über die Parameter und deren Einfluss auf das Resultat zu behalten. Für größere Projekte gewinnen darüber hinaus die Funktionalitäten aus Projects und Models an Interesse, da diese den Austausch unter mehreren Entwicklern deutlich vereinfachen. Aufgrund der open-source Charakteristik des Projektes ist MLflow darüber hinaus für nicht-kommerzielle und kleinere Projekte von besonderem Interesse.

Die Verwendung der MLflow Funktionalitäten gestaltet sich vorwiegend einfach, wobei die gute Dokumentation dabei sehr hilfreich ist.

Besonders gut gefällt die übersichtliche Darstellung der Auswirkung unterschiedlicher Parameter auf das Resultat des ML Modells durch MLflow Tracking.