R in Ihrem Unternehmen

Startseite > Parallelisieren mit R (High Performance Computing, BigData)

Parallelisieren mit R (High Performance Computing, BigData)

Das exponentielle Wachstum von Datenmengen verlangt nach effizienten Werkzeugen für deren Analyse. Immer mehr analytische Berechnungen erfordern die Installation von Clustern mit R und Technologien wir MPI oder Hadoop, um die aufwändigen Berechnungen und Datenmengen aufzuteilen.

Datenbanken mit Hunderten Gigabyte (und sogar Terabyte) sind heutzutage nichts außergwöhnliches mehr.

Zum Beispiel beträgt die Anzahl der Facebook Benutzer derzeit knapp eine Milliarde. Wenn wir annehmen, dass jeder Benutzer zehn Artikel mit je tausend Zeichen schreibt, entspricht das bereits einer Datenmenge von 10 000 Gb = 10 Tb.

Die Anzahl der Transaktionen auf Finanzmärkten liegt im Bereich von 10 Milliarden pro Tag. Multiplizieren Sie diese Zahl mindestens mit 100, um eine Vorstellung der Größenordnung der anfallenden Datenmenge zu bekommen, die bei einer kompletten Orderbuch Analyse anfallen (etwa um eine Hochfrequenz Handelsstrategie zu entwickeln).

In der Biologie, die DNS der 23 Chromosomen umfastt knapp ein Terabyte.

High Performance Computing und BigData

"BigData" ist ein aktueller Trend.

Es ist unmöglich, statistische Analysen von Datenbanken mit einem Umfang im Terabyte Bereich auf einem einzelnen PC auszuführen. Man benötigt eine verteilte Plattform.

Für R existieren mindestens drei verschiedene High Performance Computing (HPC) Lösungen:

- Rmpi
Rmpi basiert auf der MPI (Message Passing Interface) Technologie. MPI ist ein Industriestandard.

- Rserve
Rserve ist ein R basierter Server, der auf mehreren PCs installiert werden kann, um einen Cluster zu bilden. Rserve ist keine Parallelisierungslösung, man muss die Aufteilung der Berechnungen selber durchführen.

Apache Hadoop is a registered trademark from the Apache Software Foundation

- Rhadoop
Hadoop ist eine neue Technik und verwendet den Map/Reduce Ansatz, um Berechnungen zu verteilen, Beispiele hier. Hadoop ist möglicherweise der zukünftige Standard des High Performance Computings.

MATLAB besitzt auch Funktionen zum verteilten Rechnen. Die "Parallel Computing" Toolbox verteilt Berechnungen auf einem Cluster von PCs bei minimalem zusätzlichen Programmieraufwand.

Was soll ich verwenden?

Das hängt von der Art Ihrer Berechnungen ab, der Größe Ihrer Datenmenge, die Art wie Sie darauf zugreifen (Binärdateien, Relationale Datenbanken, NoSQL), wie leicht Ihr Problem zu parallelisieren ist, wieviel Speicher benötigt wird,...

Sehr oft ist nicht die CPU, also die Rechenleistung, der Flaschenhals, sondern der Zugriff auf die Daten.

Dieses Problem wurde bei Hadoop HDFS clever gelöst: anstatt mehrere CPUs zu haben, die Daten aus einer einzigen Datenbank holen, geht Hadoop den umgekehrten Weg. Der für die Analyse relevante Code wird auf jene Kompenente des Hadoop Clusters gesendet, der die entsprechenden Daten bereithält. Über das Netzwerk müssen keine Daten mehr gesendet werden.

Das erfordet allerdings, dass das Problem in unabhängige Teilberechnung aufgeteilt werden kann, die auf separaten Datensätzen operieren. Die Berechnungen auf einem Knoten eines Hadoop Clusters dürfen nur Daten dieses Knotens verwenden.

Beispiele von Problemklassen, die leicht auf einem Hadoop Cluster parallelisierbar sind:

Sie haben eine Datenbank mit Tausenden Kunden, und für jeden Kunden haben Sie Millionen Datensätze (Logs, Surfverhalten, Telefonanrufe,...). Sie wollen eine Statistik über Ihr Kundenverhalten erstellen. Das ist einfach zu parallelisieren:
1. Führen Sie die Berechnungen für jeden einzelnen Kunden durch (das ist der rechenintensive Teil).
2. Berechnen Sie Durchschnitte über alle Kunden (oder Histogramme, oder ein Tortendiagramm,...), die Ihre Statistiken zusammenfassen.

Um dieses Problem zu lösen, benötigen Sie nur eine verteilte Datenbank, bei der jeder Knoten eine bestimmte Anzahl von Kunden mit allen zugehörigen Daten enthält. Jeder Knoten des Clusters kann dann die Berechnungen für seine eigenen Kundendaten durchführen.

Ein anderes Beispiel aus dem Hochfrequenzhandel für die Finanzindustrie, oder für Market-maker:

Sie haben eine Datenbank mit allen Transaktionen für Tausend Aktien. Für jede Aktie haben Sie die Historie eines Jahres, mit 10 Millionen Transaktionen.
Ihr Problem ist: Sie wollen eine Handelsstrategie für jede einzelne Aktie simulieren.

Auch dieses Problem ist "embarassingly parallel": die Datenbank kann bezüglich der Aktien verteilt werden, jeder Knoten eines HDFS Hadoop Clusters enthält wenige Aktien und deren Transaktionen. Die Handelsstrategie für jede Aktie wird dann auf dem entsprechenden Knoten simuliert.

Es gibt noch einige andere Problemklassen, die "embarassingly parallel" sind: Monte Carlo Simulationen, Optionsbewertung,...

Im Allgemeinen wird eine Strategie allerdings nicht für einzelne Aktien berechnet, sondern für ein Portfolio. Für die Berechnung eines Portfolios benötigt man aber prinzipiell Daten von allen Aktien. Die Investitionsentscheidung für oder gegen eine Aktie beeinflusst die Entscheidungen aller anderen Aktien. So eine Berechnung kann nicht mit der vorher beschriebenen Methode auf einem Hadoop Cluster verteilt werden.

In solchen Fällen können Sie das Problen aus einer anderen Richtung betrachten: anstatt die Berechnungen pro Aktie aufzuteilen, verteilt man die Berechnung pro Handelstag. Jeder Knoten des Hadoop Clusters enthält alle Transaktionen von allen Aktien innerhalb eines kurzen Zeitraums, z.B. für einen Handelstag. Dann ist es möglich, das Portfolio mit allen Kauf/Verkaussignalen für diesen Tag auf diesem Knoten zu berechnen.

Wie in diesem Beispiel gezeigt, ist es oft möglich, eine Berechnung zu parallelisieren, wenn man sie aus einem anderen Blickwinkel betrachtet.

Brauche ich das wirklich?

Nicht unbedingt. Wenn Ihr Hauptproblem die Rechenleistung ist, dann kann das Problem oft mit einer Optimierung des Codes gelöst werden (etwa mit Hilfe eines Profilers).
Vermeiden Sie Schleifen. Wenn Sie unbedingt Schleifen brauchen, dann halten Sie sie so kurz wie möglich, und berechnen Sie so viel wie möglich vorher. Verwenden Sie möglichst viel vektorisierten Code (in R und MATLAB).

Wir helfen Ihnen gerne bei der Optimierung der Leistung Ihrer Analysen!

Wenn Ihre Software bereits (zumindest teilweise) optimiert ist, und der Kern parallelisiert werden kann, dann wird Ihre Anwendung durch Installation von Hadoop hoch skalierbar.

Klicken Sie auf untenstehenden ’Kontakt’ Link für weitere Informationen.