NVIDIA fügt CUDA native Python-Unterstützung hinzu
(thenewstack.io)- CUDA erweitert sich über sein bisher stark auf C/C++ ausgerichtetes Ökosystem hinaus, damit Python-Entwickler NVIDIA-GPU-Computing direkter nutzen können
- Die neue Unterstützung ist nicht nur ein einfaches Binding, sondern ein Versuch, Python-Schnittstellen und Skript-Workflows in das gesamte CUDA Toolkit zu integrieren
- Der CUDA-Python-Stack umfasst Basis-Bindings, einen Runtime-Compiler, cuPyNumeric, CUDA Core, NVMath Python sowie Profiler- und Code-Analyse-Tools
- NVIDIA will mit JIT-Kompilierung und der Anbindung bestehender C++-Codes die Produktivität in Python steigern und gleichzeitig den Performance-Unterschied klein halten
- Die CuTile-Schnittstelle ist ein Modell, das es Python-Entwicklern erleichtern soll, GPU-Arbeit eher in Arrays und Tiles als in Threads zu verstehen und zu debuggen
Natives Python kommt zu CUDA
- Python wurde laut der GitHub-Open-Source-Umfrage 2024 zur weltweit beliebtesten Programmiersprache und überholte damit JavaScript
- Das Software-Toolkit CUDA von NVIDIA hatte jahrelang keine native Python-Unterstützung, doch auf der GTC wurden native Unterstützung und vollständige Integration angekündigt
- Entwickler können algorithmisches Computing, das auf NVIDIA-GPUs läuft, direkt in Python schreiben
- Der CUDA-Architekt Stephen Jones sagte, man habe daran gearbeitet, „accelerated Python“ als erstklassige Unterstützung in den CUDA-Stack zu bringen
- Die neue Richtung besteht nicht darin, C in Python-Syntax zu übertragen, sondern CUDA Python zu schaffen, das sich für Python-Entwickler natürlich anfühlt
Ausbau auf Basis der Python-Entwicklergemeinschaft
- CUDA setzte bislang Kenntnisse in C++ oder Fortran voraus; es gab zwar einige Python-Tools, aber keine native Unterstützung
- Die native Python-Unterstützung öffnet die CUDA-Entwicklerwerkzeuge für Millionen von Python-Entwicklern
- Laut The Futurum Group stieg die Zahl der CUDA-Nutzer von 2 Millionen im Jahr 2020 auf 4 Millionen im Jahr 2023
- Python ist eine schnell wachsende Sprache, und NVIDIA kann nun auch Python-Entwickler in Schwellenländern wie Indien und Brasilien erreichen
- Ein großer Teil der NVIDIA-GPUs steht in den USA und Europa, doch Telekommunikations- und Infrastrukturunternehmen in Indien bauen derzeit große GPU-Installationen auf, die künftig betrieben werden sollen
- NVIDIA investiert stark in die Gewinnung von Programmierern und will mehr Programmiersprachen unterstützen, darunter Rust und Julia
Aufbau des Pythonic CUDA-Stacks
- CUDA umfasst Bibliotheken, SDKs, Compiler, Host-Runtime, Tools sowie vorgepackte Software und Algorithmen
- NVIDIA ergänzt Komponenten über den gesamten Pythonic CUDA stack
- Das zentrale Ziel ist es, GPU-Beschleunigung bereitzustellen, ohne Python zu verlassen
- Laut Jones darf CUDA Python nicht damit enden, nur Kernel bereitzustellen; nötig sind ein nahtloser Ablauf und Integration über den gesamten Stack hinweg
- Man sollte Kernel schreiben und in PyTorch einbinden können
- Auch Pythonic Libraries und andere Komponenten sollten sich aufrufen lassen
- Die Compiler-Schicht ist faktisch stark auf JIT-Kompilierung ausgerichtet, wodurch sich der Abhängigkeitsbaum des GPU-Stacks deutlich verkleinert
- Die Interoperabilität zwischen den Schichten ist wichtig für Produktivitätsgewinne durch einen durchgängigen Python-End-to-End-Workflow
CUDA Core, cuPyNumeric, NVMath Python
- NVIDIA baute zunächst grundlegende Python-Bindings und Python-Bibliotheken auf, darunter einen Runtime-Compiler
- cuPyNumeric ist ein Drop-in-Ersatz für die in Python weit verbreitete Rechenbibliothek NumPy
- Wenn man nur die
import-Anweisung ändert, läuft NumPy-Code statt auf der CPU auf der GPU
- Wenn man nur die
- Im vergangenen Jahr entwickelte NVIDIA CUDA Core; Jones sieht darin eine Neuvorstellung der CUDA-Runtime als natürliches, natives Python
- CUDA Core folgt dem Ausführungsfluss von Python, arbeitet vollständig In-Process und stützt sich stark auf JIT-Kompilierung
- NVIDIA hat außerdem NVMath Python geschaffen, das eine einheitliche Schnittstelle für Bibliotheksaufrufe auf Host- und Device-Seite bietet
- Laut Jones führt die Fähigkeit, Bibliotheksaufrufe zusammenzuführen, zu großen Performance-Verbesserungen
- Es wurden auch Bibliotheken aufgebaut, die direkten Zugriff aus Python auf beschleunigte C++-Bibliotheken ermöglichen
- Bestehender, fein abgestimmter C++-Code wird angebunden, statt ihn in Python neu zu implementieren
- Jones meint, dass der Performance-Unterschied auf diese Weise vernachlässigbar wird
- Außerdem wurden Tools für Profiler und Code-Analyzer hinzugefügt
Das CuTile-Programmiermodell
- Python macht das Programmieren einfacher, ohne ständig Hardware-Details im Blick zu haben, und NVIDIA ergänzt nun Codierungsschichten, die auf höherwertige Abstraktionen für die GPU-Ausführung ausgerichtet sind
- Das neue Programmiermodell, die CuTile-Schnittstelle, wird zunächst für Pythonic CUDA entwickelt; eine Erweiterung für C++ CUDA soll später folgen
- CuTile ist darauf ausgelegt, dass Python-Entwickler eher in Arrays als in Threads denken, anders als C++-Entwickler
- Python-Code lässt sich nicht auf magische Weise einfach für GPU-Beschleunigung ausgeben
- CUDA teilt Probleme in der Regel in Tausende kleiner Blöcke auf
- Blöcke werden in noch kleinere Tiles unterteilt
- Innerhalb dieser Tiles verarbeiten Tausende Threads einzelne Elemente
- Die Threads arbeiten zusammen, um eine Operation auszuführen
- Die hohe Rechenleistung von GPUs beruht darauf, dass Parallelverarbeitung bis auf die Ebene einzelner Elemente auf Thread-Ebene möglich ist
- NVIDIA ist der Ansicht, dass GPU-Ausführung nicht zwingend bis auf die Thread-Ebene heruntergebrochen werden muss, sondern auch auf der mittleren Tile-Ebene behandelt werden kann
- CuTile bildet Arrays effizient auf die GPU auf einer weniger feingranularen Ebene ab und erleichtert so das Verständnis und Debugging des Codes
- Laut Jones führt dieser Ansatz grundsätzlich zur gleichen Performance
- Die Daten eines Tiles können aus Vektoren, Tensoren oder Arrays bestehen
- Der Compiler kann die Abbildung ganzer Array-Operationen aus Thread-Blöcken auf die GPU oft besser übernehmen; Jones meint, dass der Compiler das häufig besser kann als er selbst, weil er die Details der GPU-Ausführung tiefgreifend versteht
- Python ist im Gegensatz zu C++ nicht als feingranulare Sprache konzipiert, und Jones nennt Triton von OpenAI als Beispiel dafür, wie gut sich so etwas natürlich in ein Python-Programm einfügt
2 Kommentare
Ob es wohl schneller ist als bestehende CUDA-Wrapper wie CuPy oder PyTorch? Der Vorteil von CuPy und torch war, dass ihre API fast identisch mit NumPy ist, sodass man Testcode, den man mit NumPy geschrieben hatte, ohne großen Aufwand übertragen konnte. Wie es sich damit verhält, muss ich wohl selbst ausprobieren.
Ist die erste Geschwindigkeitsangabe wirklich korrekt? Es ist viel zu langsam...