GPU -Programmierung mit Python

GPU -Programmierung mit Python
In diesem Artikel werden wir mit Python in die GPU -Programmierung eintauchen. Mit der einfachen Python können Sie die unglaubliche Rechenleistung der GPU Ihrer Grafikkarte (Grafikverarbeitungseinheit) freischalten. In diesem Beispiel werden wir mit der CUDA -Bibliothek von Nvidia zusammenarbeiten.

Anforderungen

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 bei Amazon Web Services. Entweder sollte gut funktionieren, aber wenn Sie eine physische Maschine verwenden, müssen Sie sicherstellen, dass die proprietären Treiber von Nvidia installiert sind.com/install-nvidia-drivers-linux

Sie müssen auch das CUDA -Toolkit installiert. Dieses Beispiel verwendet Ubuntu 16.04 LTS speziell, aber für die meisten wichtigen Linux -Verteilungen sind bei der folgenden URL Downloads verfügbar: https: // Entwickler.Nvidia.com/cuda-downloads

Ich bevorzuge die .Deb -basierter Download, und diese Beispiele werden davon ausgehen, dass Sie diese Route gewählt haben. Die Datei, die Sie herunterladen, ist a .DEB -Paket, hat aber keine .Deb -Erweiterung, also umbenennen .Deb am Ende sein hilfreich. Dann installieren Sie es mit:

sudo dpkg -i paketname.Deb

Wenn Sie aufgefordert werden, einen GPG -Schlüssel zu installieren.

Jetzt müssen Sie das CUDA -Paket selbst installieren. Um dies zu tun, rennen Sie:

sudo apt-Get-Update
sudo apt -get installieren cuda -y

Dieser Teil kann eine Weile dauern, also möchten Sie vielleicht eine Tasse Kaffee holen. Sobald es fertig ist, empfehle ich das Neustart, um sicherzustellen, dass alle Module ordnungsgemäß neu geladen werden.

Als nächstes brauchen Sie die Anaconda Python -Verteilung. Sie können das hier herunterladen: https: // www.Anakonda.com/download/#Linux

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

Sh Anaconda*.Sch

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

Der Standard -Installationsort sollte in Ordnung sein, und in diesem Tutorial werden wir es verwenden. Standardmäßig wird an ~/Anaconda3 installiert

Am Ende der Installation werden Sie aufgefordert, zu entscheiden, ob Sie Anaconda zu Ihrem Weg hinzufügen möchten. Antworten Sie hier mit Ja, um das Ausführen der erforderlichen Befehle zu erleichtern. Um sicherzustellen, dass diese Änderung stattfindet, melden Sie sich nach dem vollständig abgeschlossenen Installationsprogramm an und melden Sie sich dann wieder in Ihr Konto an.

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

Schließlich müssen wir Numba installieren. Numba verwendet den LLVM -Compiler, um Python zu Maschinencode zu kompilieren. Dies verbessert nicht nur die Leistung des regulären Pythoncode. Um dies zu tun, rennen Sie:

Conda Installieren Sie Numba

Einschränkungen und Vorteile der GPU -Programmierung

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

CPUs verarbeiten viele verschiedene Eingänge und Ausgänge und haben eine breite Auswahl an Anweisungen für den Umgang mit diesen Situationen. Sie sind auch für den Zugriff auf Speicher, den Umgang mit dem Systembus, dem Handhabungsschutz, der Segmentierung und der Eingabe-/Ausgangsfunktion verantwortlich. Sie sind extreme Multitasker ohne spezifischen Fokus.

GPU. Um dies zu erreichen, erwarten sie einen einheitlicheren Eingangs- und Ausgangszustand. Durch Spezialisierung auf skalare Funktionen. Eine Skalarfunktion nimmt eine oder mehrere Eingänge an, gibt jedoch nur eine einzelne Ausgabe zurück. Diese Werte müssen Typen sein, die von Numpy definiert sind.

Beispielcode

In diesem Beispiel erstellen wir eine einfache Funktion, die eine Werteliste aufnimmt, sie zusammenfasst und die Summe zurückgibt. Um die Kraft der GPU zu demonstrieren, werden wir eine dieser Funktionen auf der CPU und eines auf der GPU ausführen und die Zeiten anzeigen. Der dokumentierte Code ist unten:

Numph als NP importieren
von Timeit importieren default_timer als Timer
von numba importieren vectorize
# Dies sollte ein wesentlich hoher Wert sein. Auf meiner Testmaschine 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 Bereich (num_elements):
c [i] = a [i] + b [i]
Rückkehr c
# Dies ist die GPU -Version. Beachten Sie den @Vectorize -Dekorator. Das sagt
# Numba, um dies in eine GPU -vektorisierte Funktion zu verwandeln.
@Vectorize (["float32 (float32, float32)"], target = 'cuda')
Def vector_add_gpu (a, b):
Return a + b;
Def Main ():
a_source = np.eins (num_elements, dType = np.float32)
B_SOURCE = NP.eins (num_elements, dType = np.float32)
# Zeit für die CPU -Funktion
start = timer ()
vector_add_cpu (a_source, b_source)
vector_add_cpu_time = timer () - starten
# Zeit für die GPU -Funktion
start = timer ()
vector_add_gpu (a_source, b_source)
vector_add_gpu_time = timer () - starten
# Berichtszeiten
drucken ("CPU -Funktion dauerte %f Sekunden." % vector_add_cpu_time)
Druck ("Die GPU -Funktion dauerte %F Sekunden." % vector_add_gpu_time)
Rückkehr 0
Wenn __name__ == "__main__":
hauptsächlich()

Um das Beispiel auszuführen, tippen Sie auf:

Python GPU-Exampe.py

Hinweis: Wenn Sie beim Ausführen Ihres Programms Probleme begegnen, verwenden Sie "Conda Install Accelerate".

Wie Sie sehen können, läuft die CPU -Version erheblich langsamer.

Wenn nicht, dann sind Ihre Iterationen zu klein. Passen Sie die num_elements auf einen größeren Wert an (auf meiner Breakeven -Marke schien rund 100 Millionen zu liegen). Dies liegt daran. Sobald Sie es über den Schwellenwert für Ihre Maschine erhöht haben, werden Sie die wesentliche Leistungsverbesserungen der GPU -Version gegenüber der CPU -Version feststellen.

Abschluss

Ich hoffe, Sie haben unsere grundlegende Einführung in die GPU -Programmierung mit Python genossen. Obwohl das obige Beispiel trivial ist, bietet es den Rahmen, den Sie benötigen, um Ihre Ideen mit der Kraft Ihrer GPU weiter zu verwenden.