Datenwissenschaft

GPU-Programmierung mit Python

GPU-Programmierung mit Python

In diesem Artikel tauchen wir in die GPU-Programmierung mit Python ein. Mit der Einfachheit von Python können Sie die unglaubliche Rechenleistung der GPU (Grafikprozessor) Ihrer Grafikkarte freisetzen. In diesem Beispiel arbeiten wir mit der CUDA-Bibliothek von NVIDIA.

Bedarf

Für diese Übung benötigen Sie entweder eine physische Maschine mit Linux und einer NVIDIA-basierten GPU oder starten Sie eine GPU-basierte Instanz auf Amazon Web Services. Beides sollte gut funktionieren, aber wenn Sie sich für die Verwendung eines physischen Computers entscheiden, müssen Sie sicherstellen, dass die proprietären NVIDIA-Treiber installiert sind, siehe Anweisungen: https://linuxhint.com/install-nvidia-drivers-linux

Außerdem muss das CUDA Toolkit installiert sein. Dieses Beispiel verwendet Ubuntu 16.04 LTS speziell, aber es gibt Downloads für die meisten großen Linux-Distributionen unter der folgenden URL: https://developer.nvidia.com/cuda-downloads

Ich bevorzuge die .deb-basierter Download, und in diesen Beispielen wird davon ausgegangen, dass Sie diese Route gewählt haben. Die heruntergeladene Datei ist a .deb-Paket hat aber kein a .deb-Erweiterung, also umbenennen in a .deb am ende seine hilfreich. Dann installierst du es mit:

sudo dpkg -i Paketname.deb

Wenn Sie zur Installation eines GPG-Schlüssels aufgefordert werden, folgen Sie bitte den Anweisungen dazu.

Jetzt müssen Sie das cuda-Paket selbst installieren. Führen Sie dazu Folgendes aus:

sudo apt-get update sudo apt-get install cuda -y 

Dieser Teil kann eine Weile dauern, also solltest du dir vielleicht eine Tasse Kaffee holen. Sobald dies erledigt ist, empfehle ich einen Neustart, um sicherzustellen, dass alle Module ordnungsgemäß neu geladen werden.

Als nächstes benötigen Sie die Anaconda Python-Distribution. Das können Sie hier herunterladen:  https://www.Anakonda.com/download/#linux

Besorgen Sie sich die 64-Bit-Version und installieren Sie sie wie folgt:

sch Anakonda*.Sch

(Der Stern im obigen Befehl stellt sicher, dass der Befehl unabhängig von der Nebenversion ausgeführt wird)

Der Standardinstallationsort sollte in Ordnung sein, und in diesem Tutorial werden wir ihn verwenden. Standardmäßig wird es unter ~/anaconda3 . installiert

Am Ende der Installation werden Sie aufgefordert zu entscheiden, ob Sie Anaconda zu Ihrem Pfad hinzufügen möchten. Antworten Sie hier mit Ja, um die Ausführung der erforderlichen Befehle zu vereinfachen. Um sicherzustellen, dass diese Änderung durchgeführt wird, melden Sie sich nach Abschluss des Installationsprogramms ab und dann wieder bei Ihrem Konto an.

Weitere Informationen zur Installation von Anaconda: https://linuxhint.com/install-anaconda-python-on-ubuntu/

Schließlich müssen wir Numba installieren. Numba verwendet den LLVM-Compiler, um Python in Maschinencode zu kompilieren. Dies verbessert nicht nur die Leistung von regulärem Python-Code, sondern bietet auch den nötigen Kleber, um Anweisungen in binärer Form an die GPU zu senden. Führen Sie dazu Folgendes aus:

conda installieren numba

Einschränkungen und Vorteile der GPU-Programmierung

Es ist verlockend zu glauben, dass wir jedes Python-Programm in ein GPU-basiertes Programm umwandeln können, was seine Leistung dramatisch beschleunigt. Die GPU einer Grafikkarte funktioniert jedoch erheblich anders als eine Standard-CPU in einem Computer.

CPUs verarbeiten viele verschiedene Ein- und Ausgänge und verfügen über eine breite Palette von Anweisungen, um mit diesen Situationen umzugehen. Sie sind auch verantwortlich für den Zugriff auf den Speicher, den Umgang mit dem Systembus, den Umgang mit Schutzringen, die Segmentierung und die Ein-/Ausgabefunktionalität. Sie sind extreme Multitasker ohne spezifischen Fokus.

GPUs hingegen sind darauf ausgelegt, einfache Funktionen mit unglaublich hoher Geschwindigkeit zu verarbeiten process. Um dies zu erreichen, erwarten sie einen gleichmäßigeren Zustand von Input und Output. Durch Spezialisierung auf Skalarfunktionen. Eine Skalarfunktion benötigt eine oder mehrere Eingaben, gibt aber nur eine einzige Ausgabe zurück. Diese Werte müssen von numpy vordefinierte Typen sein.

Beispielcode

In diesem Beispiel erstellen wir eine einfache Funktion, die eine Liste von Werten nimmt, sie addiert und die Summe zurückgibt. Um die Leistungsfähigkeit der GPU zu demonstrieren, führen wir eine dieser Funktionen auf der CPU und eine auf der GPU aus und zeigen die Zeiten an. Der dokumentierte Code ist unten:

import numpy as np from timeit import default_timer as timer from numba import vectorize # Dies sollte ein erheblich hoher Wert sein. Auf meinem Testcomputer dauerte dies # 33 Sekunden, um über die CPU und etwas mehr als 3 Sekunden auf der GPU zu laufen. NUM_ELEMENTS = 100000000 # Dies ist die CPU-Version. def vector_add_cpu(a, b): c = np.Nullen(NUM_ELEMENTS, dtype=np.float32) für i in range(NUM_ELEMENTS): c[i] = a[i] + b[i] return c # Dies ist die GPU-Version. Beachten Sie den @vectorize-Dekorateur. Dies weist # numba an, dies in eine vektorisierte GPU-Funktion umzuwandeln. @vectorize(["float32(float32, float32)"], target="cuda") def vector_add_gpu(a, b): Rückgabe a + b; def main(): a_source = np.ones(NUM_ELEMENTS, dtype=np.float32) b_source = np.ones(NUM_ELEMENTS, dtype=np.float32) # Uhrzeit der CPU-Funktion start = timer() vector_add_cpu(a_source, b_source) vector_add_cpu_time = timer() - start # Uhrzeit der GPU-Funktion start = timer() vector_add_gpu(a_source, b_source) vector_add_gpu_time = timer() - start # Report times print("CPU-Funktion dauerte %f Sekunden." % vector_add_cpu_time) print("GPU-Funktion hat %f Sekunden gebraucht." % vector_add_gpu_time) 0 zurückgeben wenn __name__ == "__main__": main() 

Geben Sie Folgendes ein, um das Beispiel auszuführen:

Python-GPU-Beispiel.py

HINWEIS: Wenn Sie beim Ausführen Ihres Programms auf Probleme stoßen, versuchen Sie es mit „conda installbeschleunigen“.

Wie man sieht, läuft die CPU-Version deutlich langsamer.

Wenn nicht, sind Ihre Iterationen zu klein. Passen Sie die NUM_ELEMENTS auf einen höheren Wert an (bei mir schien die Gewinnschwelle bei etwa 100 Millionen zu liegen). Dies liegt daran, dass das Einrichten der GPU eine kleine, aber spürbare Zeit in Anspruch nimmt. Damit sich der Betrieb lohnt, ist eine höhere Arbeitsbelastung erforderlich. Sobald Sie ihn über den Schwellenwert für Ihren Computer erhöhen, werden Sie erhebliche Leistungsverbesserungen der GPU-Version gegenüber der CPU-Version feststellen.

Fazit

Ich hoffe, Ihnen hat unsere grundlegende Einführung in die GPU-Programmierung mit Python gefallen. Obwohl das obige Beispiel trivial ist, bietet es den Rahmen, den Sie benötigen, um Ihre Ideen weiterzuentwickeln und die Leistung Ihrer GPU zu nutzen.

So fügen Sie Debian ein Paket-Repository hinzu
Unter Linux wird standardmäßig eine Reihe von Paketen installiert. Aber die Standardpakete sind nie genug. Vielleicht möchten Sie einen Dateiserver od...
Suchen und patchen Sie Spectre und Meltdown auf Debian
Spectre-Sicherheitslücke Die Spectre-Sicherheitslücke durchbricht die Isolation zwischen den Anwendungen auf Ihrem Computer. So kann ein Angreifer ein...
Debian-Paketsuche
Debian 9, mit dem Codenamen 'Stretch', hat ein riesiges Repository von über 68.000 Paketen. Ob Spiele, Schriftarten, Editoren, Datenbanken oder Entwic...