Aus Linux-Magazin 06/2022

Verteilte lineare Algebra mit Apache Mahout

© Lyudmyla Voytovych / 123RF.com

Algorithmen der linearen Algebra auf komfortable Weise entwickeln, zügig ausführen und problemlos von einer Compute Engine zur nächsten portieren: Das verspricht das Projekt Apache Mahout.

Wer nach neuen Werkzeugen und Methoden für die Datenanalyse, für die Konstruktion von Machine-Learning-Data-Pipelines und Modellen des maschinellen Lernens sucht, der sollte sich Apache Mahout näher ansehen. Die idealen Szenarien für den Einsatz dieses Frameworks sind solche, in denen Teams die Flexibilität haben, sich im Laufe der Zeit an veränderte Anforderungen anzupassen. Mahout ermöglicht, Back-End-Compute-Engines wie (Micro-)Batch-Systeme unkompliziert auszutauschen, beispielsweise Apache Spark oder Streaming-Systeme wie Apache Flink. Darüber hinaus kann Mahout Berechnungen auf verschiedenen Soft- und Hardwaresystemen ausführen, von der Java Virtual Machine (JVM) über jede verfügbare Multi-Core-CPU bis hin zu integrierten GPUs für hochvolumige Parallelberechnungen.

Typische Nutzer von Apache Mahout sind fortgeschrittene Dateningenieure und -wissenschaftler, die Erfahrung darin haben, Modelle in verschiedenen Sprachen zu entwickeln. Ihnen bietet Mahout einen Arbeitsansatz, bei dem sie ihre Lösungen nicht immer wieder neu schreiben müssen, je nachdem, welches System sie gerade verwenden. Zusätzlich werden mathematisch orientierte Softwareingenieure die Sprache Samsara lieben. Diese DSL (Domain Specific Language) bietet eine reduzierte Syntax und fühlt sich für Menschen vertraut an, die an das Schreiben mit mathematischer Notation gewohnt sind. Dabei vermeidet Samsara das für viele Machine-Learning-Bibliotheken typische Aufblähen der Syntax.

Was ist Apache Mahout?

Apache Mahout ist eine Bibliothek, die dafür geschaffen wurde, Algorithmen der linearen Algebra mit minimalem Aufwand zu entwickeln und zu pflegen. Das erreicht Mahout, indem es eine Abstraktionsschicht oberhalb der Compute Engine (in der Open-Source-Version von Mahout: Apache Spark) einzieht. Diese Schicht implementiert grundlegende Funktionen der linearen Algebra wie die Arbeit mit verteilten Matrizen, Matrixmultiplikation oder Multiplikation mit Selbsttransponierung und andere. Dabei kommt die Sprache Samsara zum Zug, die es ermöglicht, Algorithmen mit einer R-ähnlichen Syntax zu definieren, was das Schreiben und spätere Lesen komplexer mathematischer Formeln erheblich erleichtert.

Mahout hat eine lange Geschichte und war eine der ersten (wenn nicht sogar die erste) Bibliotheken für maschinelles Lernen mit Big Data. Ursprünglich wurde es entwickelt, um maschinelle Lernaufgaben auf Daten in Apache-Hadoop-Clustern zu unterstützen. In den Jahren 2014 und 2015 erfuhr es ein größeres Refactoring, das es in seine aktuelle Form brachte. Noch immer sind viele Informationen in Umlauf, die sich auf das alte Hadoop-basierte Mahout beziehen, was Recherchen erschwert.

Der Begriff Machine Learning dient manchmal als Synonym für eine Reihe von Techniken zur numerischen Lösung von Problemen, deren Umfang den Einsatz statistischer Standardansätze verbietet. Mahout gibt dem Anwender Werkzeuge an die Hand, um solche Probleme zu lösen. Es lässt sich auf jeder Big-Data-Plattform anwenden, auf der man zum Beispiel mit verteilten Datensätzen arbeitet. Verwendet ein Unternehmen kritische Algorithmen, bei denen es Bedenken gibt, sie in maschinelle Lernansätze umzuwandeln, kann Mahout sich auszahlen.

Verteilte lineare Algebra

Lineare Algebra, auch als Matrixmathematik bekannt, ist ein weites Feld der theoretischen und angewandten Mathematik mit Einsatzszenarien in den verschiedensten Gebieten der Computerwissenschaft und des Software Engineering, darunter bei visuellen Simulationen, Audioanalyse und prädiktiver Analytik.

In einigen Fällen kann lineare Algebra enorm rechenintensiv sein, mit Methoden, die iterative oder Massenverfahren benutzen. In großem Maßstab erweisen sich solche Berechnungen oft entweder als zu schwerfällig oder erzwingen auf verteilten Systemen komplexe Programmieransätze. Glücklicherweise abstrahiert Apache Mahout einen Großteil der Komplexität und beseitigt mögliche Fallstricke. Es präsentiert sich als aufgeräumte Bibliothek für die Arbeit mit verteilter linearer Algebra, die sich damit fast anfühlt wie normale lineare Algebra.

Abbildung 1 zeigt, wie Mahout die Matrixmultiplikation einer Matrix A mit ihrer eigenen Transformation auf konzeptioneller Ebene angeht. Die Ausgangsmatrix und deren Transposition werden in korrespondierende Zeilen und Spalten zerlegt, die man an eine Compute Engine senden kann, die ihrerseits jeweils kleine Teile der Berechnung ausführt. Am Ende führt Mahout die Ergebnisse wieder zusammen.

Abbildung 1: Mahout zerlegt Matrixmultiplikationen in kleinere Teile, die sich separat und parallel berechnen lassen, und setzt am Ende die Ergebnisse zu einem Gesamtresultat zusammen.

Abbildung 1: Mahout zerlegt Matrixmultiplikationen in kleinere Teile, die sich separat und parallel berechnen lassen, und setzt am Ende die Ergebnisse zu einem Gesamtresultat zusammen.

In der Mathematik sind komplexe Prozeduren oft das Produkt von vielen einfacheren Arbeitsschritten. Mahout zieht durch das Einführen der Engine-Abstraktionsschicht daraus einen Vorteil. In dieser Schicht haben Experten performante Versionen von Basisoperationen implementiert wie etwa der Matrizenmultiplikation. Das Architekturdiagramm in Abbildung 2 zeigt an der Spitze den Application Layer, der verschiedene Engines überspannt, die für den Anwender transparent die Verteilung der Berechnungen organisieren.

Abbildung 2: Der Application Layer von Mahout überspannt verschiedene Engines.

Abbildung 2: Der Application Layer von Mahout überspannt verschiedene Engines.

Der Vorteil dieses Ansatzes besteht darin, dass der Endbenutzer, der die Algorithmen implementiert, nicht alle Besonderheiten einer bestimmten Engine kennen muss. Tatsächlich muss die Person, die die Algorithmen schreibt, überhaupt keine der zugrunde liegenden Engines kennen.

Samsara DSL

Als Schnittstelle für den Benutzer dient die Samsara DSL. Diese Domain Specific Language macht es Mathematikern viel leichter, Algorithmen zu implementieren. Der Trick dabei: Scala ermöglicht es, die Syntax und Regeln der Sprache je nach Anwendungsfall zu wählen. Nehmen wir zum Beispiel diese Berechnung aus Mahouts verteilter, stochastischer Hauptkomponentenanalyse (dsPCA):

In Samsara lässt sich das in der Form aus der ersten Zeile von Listing 1 schreiben. Die folgenden Zeilen liefern einige weitere typische Syntaxbeispiele. Mehr Informationen zu Samsara finden Sie auf der Mahout-Webseite [1].

Listing 1

Samsara DSL: Syntaxbeispiele

val G = B %*% B.t - C - C.t + (xi dot xi) * (s_q cross s_q)
// Dense vectors:
val denseVec1: Vector = (1.0, 1.1, 1.2)
val denseVec2 = dvec(1, 0, 1, 1, 1, 2)
// Sparse vectors:
val sparseVec1: Vector = (5 -> 1.0) :: (10 -> 2.0) :: Nil
val sparseVec1 = svec((5 -> 1.0) :: (10 -> 2.0) :: Nil)
// Dense matrices:
val A = dense((1, 2, 3), (3, 4, 5))
// Sparse matrices:
val A = sparse(
  (1, 3) :: Nil,
  (0, 2) :: (1, 2.5) :: Nil
)
// Diagonal matrix with constant diagonal elements:
diag(3.5, 10)
// Diagonal matrix with main diagonal backed by a vector:
diagv((1, 2, 3, 4, 5))
// Identity matrix:
eye(10)
// Plus/Minus:
a + b
a - b
a + 5.0
a - 5.0
// Hadamard (elementwise) product:
a * b
a * 0.5
// Operations with assignment:
a += b
a -= b
a += 5.0
a -= 5.0
a *= b
a *= 5
// Dot product:
a dot b
// Cross product:
a cross b
// Matrix multiply:
a %*% b
// Optimized right and left multiply with a diagonal matrix:
diag(5, 5) :%*% b
A %*%: diag(5, 5)
// Second norm, of a vector or matrix:
a.norm
// Transpose:
val Mt = M.t
// Cholesky decomposition
val ch = chol(M)
// SVD
val (U, V, s) = svd(M)
// In-core SSVD
val (U, V, s) = ssvd(A, k = 50, p = 15, q = 1)
// EigenDecomposition
val (V, d) = eigen(M)
// QR decomposition
val (Q, R) = qr(M)

Engine-Agnostizismus

Mahouts Agnostizismus hinsichtlich der Compute Engines spielt eine große Rolle, wenngleich das vielen Anwendern gar nicht so klar ist. In den 2000er-Jahren haben wir den Wechsel von Clustern von Hadoop zu Spark und von Spark zu Kubernetes erlebt. Das brachte so manchen Benutzer in die Zwickmühle, entweder an einer veralteten Technik festhalten zu müssen oder teure Consultants zu bezahlen, die die Algorithmen und Methoden von einem alten auf ein neueres System portierten.

Das Mahout-Projekt hat die Migration von Hadoop zu Spark miterlebt und die daraus gewonnenen Erkenntnisse in seine Struktur integriert, sodass sich Algorithmen von jeder beliebigen Plattform auf jede andere portieren lassen. Das Beispiel in Abbildung 3 zeigt Code aus dem Bereich der Matrixmathematik, wobei eine Version die Apache-Flink-Engine und die andere die Apache-Spark-Engine verwendet. Nach den einleitenden Import-Statements ist der Code exakt derselbe. Beim Wechsel der Engine muss man also am Programmtext für die eigentlichen Berechnungen nichts ändern, wodurch eine große Fehlerquelle entfällt.

Abbildung 3: Der Code für die Apache-Flink- (links) und -Spark-Engine (rechts) fällt in weiten Teilen identisch aus. Das macht den Umstieg einfach.

Abbildung 3: Der Code für die Apache-Flink- (links) und -Spark-Engine (rechts) fällt in weiten Teilen identisch aus. Das macht den Umstieg einfach.

Use Cases für Mahout

Mahout ist für Unternehmen gedacht, die statistische Methoden für verteilte Datensätze benötigen, aber das Risiko eines technischen Lock-ins durch das Schreiben von Algorithmen für eine bestimmte Engine minimieren wollen, solange nicht klar ist, ob die Engine eine erfolgreiche Zukunft haben wird. Mahout ermöglicht es, jederzeit das System zu wechseln, ohne dass sich das auf die Datenausgabe auswirkt.

Außerdem erlaubt es Mahout den Anwendern, Konzepte der linearen Algebra in Datenspeicher einzubinden, die entweder schwache oder keine entsprechenden Implementierungen bieten. Ein Beispiel dafür ist Apache Spark, dessen lineare Algebra in Einzelknotenimplementierungen gut funktioniert, aber bei der Skalierung auf größere verteilte Datensätze Probleme macht.

So nutzt beispielsweise ein großer amerikanischer Gebrauchtwagenhändler Mahout für sein Empfehlungssystem, das auf Mahouts Correlated Co-Occurrence (CCO) beruht. Der CCO-Algorithmus ähnelt dem populäreren CO-Algorithmus, bezieht aber mehr Attribute in seine Empfehlungen mit ein. Mathematisch gesprochen ist er multimodal. Mahout kommt in vielen Situationen zum Einsatz, in denen der Schutz der Privatsphäre und des geistigen Eigentums der Kunden eine Veröffentlichung verhindert. Viele Forscher und Praktiker haben mit den Mahout-Tools Empfehlungsprogramme, Ähnlichkeitsmaschinen und andere Vorhersagemodelle in großem Maßstab entwickelt.

Eine von einem der Autoren dieses Artikels geschriebene Studie veranschaulicht weitere Anwendungsfälle von Mahout. Zu Beginn der Covid-Pandemie erwiesen sich beispielsweise CT-Scans als ebenso gut oder in einigen Fällen sogar besser als PCR-Tests. Ein Hauptproblem war jedoch die hohe Strahlendosis. Mithilfe von Mahout zeigte der Autor, wie sich CT-Scans mit geringer Strahlendosis, die dafür aber verrauscht sind, schnell und einfach entrauschen lassen. Dazu genügen fünf Zeilen Mahout-Code.

Erste Schritte

Mahout lässt sich in ein Projekt integrieren, indem man es als Apache-Maven-Abhängigkeit hinzufügt, ein vorgefertigtes Docker-Image ausführt oder einen Binär- oder Quellcode-Build von der Projektwebseite [2] herunterlädt. Um sich als Benutzer oder Mitwirkender in das Projekt einzubringen, abonnieren Sie die Mailing-Listen mailto:user@mahout.apache.org und mailto:dev@mahout.apache.org. Verschiedene alternative Methoden zur Installation und Verwendung der Software einschließlich eines vorgefertigten Docker-Images, zeigt eine Folienpräsentation [3] eines der Artikelautoren auf. (jcb/jlu)

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 4 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Nach oben