Login
Newsletter
Werbung

Do, 26. Dezember 2013, 15:00

GPU-Computing mit R

Dieser Artikel bietet eine Einführung in GPU-Computing mit dem Statistikprogramm R. Besitzer von Grafikkarten mit NVIDIA-Chipsatz haben unter Nutzung des Nvidia CUDA-Toolkits und des R-Pakets gputools die Möglichkeit, parallelisierbare Rechenaufgaben auf ihrer GPU auszuführen. Entsprechende Installationsanleitungen versetzen den Leser in die Lage, eine R-CUDA-Schnittstelle zu implementieren und für einfache mathematisch-statistische Rechenoperationen zu nutzen.

GPU Computing mit R

General Purpose Computing On Graphics Processing Units (GPGPU) – die Verwendung von GPUs zur Erledigung allgemeiner (Rechen-)Aufgaben – war lange Zeit eine Domäne von Profi-Anwendern in Grafik-, Video- und wissenschaftlichen Bereichen. Mittlerweile bietet sie auch in abgespeckter Form auf herkömmlichen Arbeitsplatzrechnern bei parallelisierbaren Anwendungen oft erstaunliche Geschwindigkeitsvorteile im Vergleich zu einer CPU.

Die Gründe hierfür liegen in der unterschiedlichen Architektur und Funktionsweise der beiden Recheneinheiten. GPUs sind generell für einen schnellen Datenfluss und auf die vielfach parallele Berechnung von Gleitkommazahlen konzipiert, während die maximale Leistung einer CPU nur auf eine begrenzte Anzahl gleichzeitiger Threads verteilt werden kann. GPU-Rechenkapazität für mathematisch/statistische Aufgabenstellungen zu nutzen, bietet sich also immer dann an, wenn eine Vielzahl an Berechnungen gleichzeitig ausgeführt werden kann, wobei die jeweiligen Rechenoperationen voneinander unabhängig sind (z.B. bei Matrixmultiplikationen oder Distanzmessungen zwischen Vektoren). Derartige Problemstellungen werden auch als »embarrassingly parallel« bezeichnet.

Insbesondere Besitzer von Grafikkarten mit einem geeigneten CUDA-fähigen NVIDIA-Chipsatz können so mit Hilfe von NVIDIAs CUDA-Toolkit und der Statistik-Software R einfache statistische Methoden effizient umsetzen, insofern die Datenmengen ein bestimmtes Maß nicht überschreiten. Einer der limitierenden Faktoren ist hierbei der Arbeitsspeicher der Grafikeinheit. Werden Objekte geladen, die die Größe des Arbeitsspeichers überschreiten, entstehen massive Kosten durch den ständigen Datenfluss von und zu den beteiligten Speicherbausteinen. Insbesondere einfachere Grafikkarten mit weniger als 512 MB RAM kommen dabei, trotz zum Teil über hundert nutzbaren CUDA-Kernen, schnell an die Grenzen ihrer Leistungsfähigkeit und bieten sich deshalb besser für Entwicklungsaufgaben an.

Der Kauf hochperformanter Grafikkarten, wie zum Beispiel der NVIDIA »Tesla«-Reihe, ist aber für den Gelegenheitsanwender meist wenig rentabel, da selbst bei kleineren GPU-Clustern durchaus der Gegenwert eines Kleinwagens aufkommen kann. Bei umfangreichen Rechenoperationen mit erhöhtem Datenfluss besteht allerdings auch die Möglichkeit, auf Internetdienste wie z.B. Amazon Web Services (AWS) auszuweichen. Dort können beispielsweise GPU-Cluster-Instanzen mit zwei NVIDIA »Tesla« M2050 GPU-Recheneinheiten angemietet werden (»cg1.4xlarge« GPU-Instanz). Die Abrechnung erfolgt dort auf Stundenbasis, der Satz beträgt momentan 2,10 US-Dollar. Dies mag im ersten Augenblick zwar nicht gerade günstig erscheinen, allerdings erhält man dafür auch die Leistung von zwei Grafikkarten mit jeweils drei GB GDDR5-Arbeitsspeicher und 448 CUDA-Kernen sowie ein weitgehend vorkonfiguriertes Systemabbild. Amazon hat über das AWS-Blog bereits angekündigt, das Angebot an GPU-Instanzen weiter ausbauen zu wollen und stellt zukünftig auch eine »g2.2xlarge instance« mit einer NVIDIA »Kepler« GK104 GPU (1536 CUDA-Kerne und vier GB Arbeitsspeicher) zur Anmietung bereit.

Die Installation des CUDA-Toolkits obliegt allerdings weiterhin dem Nutzer. Um unnötige Kosten bei der Anmietung von GPU-Instanzen zu vermeiden, wird daher empfohlen, innerhalb der Webdienste möglichst nur produktiv tätig zu werden und den Code vorab lokal zu entwickeln. Die Kosten der Anmietung sollte man auf diese Weise so gering wie möglich halten können.

Diese Vorgehensweise soll auch im praktischen Teil des vorliegenden Artikels verfolgt werden: Es wird gezeigt, wie im Anschluss an die lokale und kostengünstige Entwicklung eines einfachen, GPU-gestützten statistischen Programmcodes eine effiziente Produktionsphase mit Hilfe von zeitweilig angemieteten GPU-Instanzen erfolgen kann.

Zum besseren Verständnis für R-Einsteiger erfolgt zunächst eine kurze Einführung zum GPU-Computing mit R und zur Funktionalität des R-Pakets »gputools«, welches eine einfache Schnittstelle zum CUDA-Toolkit zur Verfügung stellt. Diese Installationsanweisung erfolgt beispielhaft für Ubuntu Server 12.04 LTS in Verbindung mit dem CUDA-Toolkit 5.0.35. Als geeignete Compiler erwiesen sich GCC 4.4 und 4.6. Anschließend wird chronologisch durch die relevanten Installationsvorgänge zum Aufbau einer CUDA-R-Schnittstelle geführt und eine Beispielsimulation mit Geschwindigkeitsvergleich vorgestellt.

Der Vollständigkeit halber sei erwähnt, dass mit OpenCL eine weitere Schnittstelle für GPU-gestützte Parallelisierungsaufgaben erhältlich ist. Diese ist im Gegensatz zu CUDA plattformunabhängig und Open Source.

GPU Computing mit R

R ist eine der bekanntesten Entwicklungssysteme für statistisches Rechnen. Im Gegensatz zu vielen kommerziellen Statistikprogrammen ist R durchgehend als Programmiersprache angelegt. Dadurch ist R zwar für Einsteiger schwieriger zu erlernen, bietet aber die volle Flexibilität einer Programmiersprache bei komplexen Anwendungen. Nicht zuletzt ist R ein GNU-Projekt und steht unter der GNU General Public License. R wird sehr intensiv in der Wissenschaft eingesetzt, ist aber auch in der Wirtschaft wegen seiner geringen Kosten geschätzt. R läuft prinzipiell auf allen gängigen Betriebssystemen. Mit der 2013 veröffentlichten Version 3 wird nun auch 64-Bit unterstützt, d.h. Vektoren und Matrizen können bis zu 252 (2 hoch 52) Einträge besitzen.

R als Programmiersprache ist speziell ausgelegt auf Datenanalyse und Statistik. R unterstützt beispielsweise ohne Zusatzpakete Matrixalgebra und viele statistische Funktionen sowie zahlreiche Funktionen zur Erzeugung von Diagrammen und Grafiken. Man kann als Nutzer in der Regel davon ausgehen, dass viele der existierenden statistischen Analyseverfahren entweder im Kernsystem oder als Zusatzpaket (unter R »library« genannt) frei verfügbar sind. Bei Schleifenberechnungen ist R selbst jedoch langsam. Deshalb sind viele verfügbare Funktionen in der Programmiersprache C implementiert und als Bibliothek eingebunden. Matrixoperationen werden z.B. standardmäßig mit der alleinstehenden Matrixbibliothek LAPACK ausgeführt.

Wenn man mit großen Daten und/oder vielen Schleifen arbeitet, reicht oft die Leistungsfähigkeit der Programmiersprache R für den Kern der gewünschten Berechnung nicht aus. Daher bietet R die Möglichkeit, auch selbst geschriebene Bibliotheken in C, C++ oder FORTRAN zu verlinken. Viele installierbare Pakete arbeiten nach diesem Prinzip. Die Methode ist effektiv, hat aber auch zwei Nachteile bei der Entwicklung. Zum einen muss man eine dieser Programmiersprachen zusätzlich beherrschen. Viele R-Nutzer sind aber keine Programmierer, sondern kommen aus angewandten Fachgebieten mit empirischen Aufgabenstellungen (Sozialwissenschaften, Wirtschaftswissenschaften, Naturwissenschaften). Das Erlernen einer weiteren Sprache bedeutet eine große Hürde. Zweitens ist die Umsetzung bspw. in C in der Praxis oft aufwendiger als in R gewohnt, weil viele höhere Datentypen und Funktionen dort nicht existieren. Selbst wenn man diese Mühe auf sich nimmt, haben viele statistische Berechnungen auch als solche Bibliothek eine beträchtliche Laufzeit. Typische Beispiele sind iterative, simulationsbasierte Bayes-Verfahren. Aber auch Anwendungsfälle, bei denen die Datenmenge sehr groß ist, können merkliche Rechenzeit beanspruchen. Schon eine simple Multiplikation von Matrizen der Dimension n x n wird bei großen n zum Geduldsspiel. An dieser Stelle wäre der Einsatz der GPU eine vielversprechende zusätzliche Verbesserung, zumal in vielen Desktop-Rechnern ohnehin bereits Grafikkarten verbaut sind.

Es existieren derzeit etwa ein halbes Dutzend R-Pakete, die sich GPU-Leistung zunutze machen. Drei Pakete haben ganz spezielle Analysefunktionen für die GPU implementiert (permGPU, cudaBayesreg, WideLM). Zwei weitere Pakete (magma, HiPLARM) setzen auf den Ersatz des Standard-Algebra-Pakets LAPACK durch GPU-fähige Bibliotheken. Alle genannten Pakete basieren auf der CUDA-Plattform von NVIDIA, funktionieren also auch nur mit einer GPU dieses Herstellers. Das OpenCL-Paket nutzt die plattformunabhängige Schnittstelle OpenCL, allerdings ist der Funktionsumfang recht begrenzt und nicht selbsterklärend. Das Paket gputools, das der Artikel genauer vorstellen will, hat sich als das momentan am einfachsten zu installierende und in der Praxis nützlichste und vielseitigste erwiesen. Allerdings basiert auch dieses Paket auf der proprietären, wenngleich kostenlosen CUDA-Plattform.

Das Paket gputools und Anwendungsszenarien

Das Paket gputools bietet Altenativimplementierungen für einige grundlegende Matrixoperationen und rechenintensive statistische Verfahren. Die Prozedurbezeichnungen halten sich syntaktisch an die bekannten (CPU-) Funktionen in R; es ist lediglich jeweils das Präfix gpu dem Namen der Funktion vorangestellt.

Das Paket bietet Funktionen aus den folgenden Bereichen:

Matrixoperationen:
Als GPU-Matrixmultiplikationen stehen Multiplikation (gpuMatMult) und Inverse (gpuSolve) zur Verfügung, sowie die der Inversion nahe stehende QR-Zerlegung und das der Multiplikation nahestehende Kreuzprodukt. Einfache lineare Operationen wie Spaltensummen oder Multiplikation mit einem Skalar sind leider nicht implementiert. Versuche und Beispielsimulationen haben gezeigt, dass hierbei die GPU keinen Geschwindigkeitsvorteil erzielen kann: Die GPU kann ihren Geschwindigkeitsvorteil immer nur dann zum Tragen bringen, wenn der Zeitaufwand für das Kopieren der Daten vom Arbeitsspeicher in den Arbeitsspeicher der GPU und umgekehrt im Vergleich zur eigentlichen Berechnung lediglich einen kleinen Teil einnimmt. Das ist bei solchen einfachen Befehlen offensichtlich noch nicht der Fall. Erfahrungswerte haben aber gezeigt, dass allein diese beiden Matrixfunktionen in Prozeduren mit vielen Operationen großer Matrizen zweistellige Beschleunigungsfaktoren erzielen können, obwohl ein Großteil des Codes immer noch ganz normal auf der CPU verarbeitet wird.
Lineare Regression und kleinste Quadrate:
gputools bietet mit den Befehlen gpuLm und gpuGlm lineare und generalisierte lineare Modelle an, also zum Beispiel lineare Regression und multinomiale Regressionsmodelle. Diese Funktionen berechnen das gesamte Modell auf der GPU und nicht nur einzelne, isolierte Matrixoperationen. Daher sind die Funktionen effizienter und schneller, als wenn man sie mit den Matrixoperationen nachbaut.
Distanzen und Clustering:
Clustering ist ein Verfahren, bei dem eine Anzahl von Objekten (Beobachtungen, Befragte) in Klassen mit ähnlichen Eigenschaften zerlegt wird. Grundlage der Berechnung ist ein Distanzmaß, das die Unähnlichkeit zweier Objekte als eine Zahl beschreibt. Mit der Funktion gpuDist kann man solche Distanzen berechnen. Es stehen dabei verschiedene Metriken zur Auswahl. Anschließend kann mit gpuHclust ein hierarchisches Clustering auf Basis der Distanzen ausgeführt werden. Der Befehl gpuDistClust vereinigt beide Funktionalitäten in einer Prozedur.

Bevor in der Beispielanwendung näher auf das Paket gputools eingegangen wird, folgt zunächst eine exemplarische Installationsanleitung für das CUDA-Toolkit und die entsprechenden R-Komponenten.

Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten
Werbung