15 Punkte von GN⁺ 2025-02-22 | 1 Kommentare | Auf WhatsApp teilen
  • GPUs sind massiv parallele Prozessoren mit Tausenden von Kernen, die dafür ausgelegt sind, viele Aufgaben gleichzeitig zu verarbeiten
  • CPUs sind hervorragend für komplexe und sequenzielle Aufgaben geeignet, aber die Zahl der Aufgaben, die sie gleichzeitig verarbeiten können, ist begrenzt
  • GPUs hingegen verarbeiten Aufgaben parallel über Tausende von Threads und sind daher besonders stark bei der schnellen Verarbeitung großer Datenmengen
  • So verfügt die NVIDIA RTX 4090 GPU beispielsweise über 16.384 CUDA-Kerne, verglichen mit 16 bis 24 Kernen bei High-End-CPUs
  • Jeder GPU-Kern ist zwar langsamer als ein CPU-Kern, eignet sich durch die parallele Verarbeitung über eine große Zahl von Kernen aber besonders für umfangreiche Berechnungen wie Matrixoperationen

CUDA und Python

  • CUDA (Compute Unified Device Architecture) von NVIDIA ist eine Plattform und eine C++-Erweiterung, mit der sich Programme schreiben lassen, die auf GPUs ausgeführt werden
  • CUDA stellt ein Programmiermodell und APIs bereit, damit Entwickler Code schreiben können, der direkt auf der GPU läuft
  • Dadurch lassen sich parallelisierbare Aufgaben von der CPU auf die GPU auslagern, um die Leistung zu steigern
  • Python-Entwickler können Tools wie Numba nutzen, um von GPU-Beschleunigung zu profitieren
  • Numba ist ein Python-Compiler, der Python-Code so kompiliert, dass er auf CUDA-fähigen GPUs ausgeführt werden kann
  • Damit können Python-Entwickler mit minimalem neuem Syntax- und Begriffswissen leicht in GPU-beschleunigtes Computing einsteigen
  • CUDA Python bietet Cython-/Python-Wrapper für die CUDA-Treiber- und Runtime-APIs, damit Python-Entwickler paralleles Computing auf der GPU nutzen können
  • CUDA Python kann über PIP und Conda installiert werden

Thread- und Blockstruktur in CUDA

  • In CUDA ist ein Kernel eine Funktion, die auf der GPU ausgeführt wird. Beim Start eines Kernels laufen Hunderte oder Tausende paralleler Threads gleichzeitig und verarbeiten jeweils unterschiedliche Daten
  • Dieses Modell wird als SIMT-Modell (Single-Instruction Multiple-Thread) bezeichnet
  • Threads sind zu Warps organisiert (Gruppen aus 32 Threads), und Warps werden zu Blöcken gruppiert
  • Jeder Block wird auf einem Streaming Multiprocessor (SM) ausgeführt, und ein SM verfügt über begrenzte Ressourcen wie Register und Shared Memory
  • Die Blockgröße beeinflusst die Zuteilung dieser Ressourcen und die Zahl gleichzeitig ausführbarer Warps (Occupancy)
  • Durch eine passende Wahl von Anzahl und Größe der Thread-Blöcke lassen sich die GPU-Ressourcen effizient nutzen

Speicherverwaltung und Optimierung

  • In der CUDA-Programmierung muss die Speicherverwaltung zwischen CPU (Host) und GPU (Device) explizit durchgeführt werden
  • Der typische Ablauf sieht wie folgt aus:
    • GPU-Speicher reservieren (cudaMalloc)
    • Daten vom Host auf das Device kopieren (cudaMemcpy)
    • Kernel ausführen
    • Ergebnis vom Device zurück auf den Host kopieren (cudaMemcpy)
    • GPU-Speicher freigeben (cudaFree)
  • Shared Memory ist ein On-Chip-Speicher, über den Threads innerhalb eines Blocks schnell Daten gemeinsam nutzen können, was die Geschwindigkeit von Speicherzugriffen erhöht
  • Die Synchronisation zwischen Threads wird mit __syncthreads() umgesetzt, wodurch Race Conditions vermieden werden können

Benutzerdefinierte CUDA-Kernel für LLMs

  • Für Aufgaben mit großen Sprachmodellen (LLMs) werden benutzerdefinierte CUDA-Kernel entwickelt, die mehrere Operationen in einem einzigen Kernel zusammenfassen, um den Speicher-Overhead zu reduzieren und die Effizienz zu erhöhen
  • Ein Beispiel ist FlashAttention, das die Self-Attention in Transformern optimiert und die Effizienz deutlich steigert, indem es Speicherzugriffe beim Lesen und Schreiben reduziert
  • FlashAttention nutzt Shared Memory, um Berechnungen zu tilen, und erreicht dadurch auch bei langen Sequenzen eine hohe Effizienz
  • Solche Optimierungen können das Problem lösen, dass die Speicherbandbreite im Deep Learning zum Flaschenhals wird

Vergleich zwischen PyTorch und CUDA-Implementierung

  • In PyTorch lassen sich GPU-Operationen dank hochgradiger Abstraktion sehr einfach ausführen
  • So lässt sich etwa die Addition zweier Vektoren wie folgt einfach implementieren:
import torch  
  
# GPU에서 두 개의 큰 벡터 생성  
a = torch.rand(1000000, device='cuda')  
b = torch.rand(1000000, device='cuda')  
  
# 요소별로 더하기  
c = a + b  
  • Wenn jedoch Performance-Optimierung nötig ist, können benutzerdefinierte Kernel direkt mit CUDA geschrieben werden
  • Mit CUDA lassen sich Speicherzugriffsmuster, Thread-Konfigurationen und die Nutzung von Shared Memory fein abstimmen, um die Leistung zu maximieren
  • Die CUDA-Implementierung von FlashAttention optimiert beispielsweise Speicherzugriffe und tiled Berechnungen in Shared Memory, um die Performance zu verbessern
  • Durch solche Low-Level-Optimierungen kann eine höhere Leistung erreicht werden als mit einer High-Level-Implementierung in PyTorch

Fazit

  • Durch die Nutzung der parallelen Verarbeitungsfähigkeit von GPUs lassen sich große Datenmengen und komplexe Berechnungen effizient bewältigen
  • CUDA ist eine Plattform, mit der sich die Leistung von GPUs bestmöglich ausschöpfen lässt, und auch Python-Entwickler können über Tools wie Numba von den Vorteilen von CUDA profitieren
  • Wer die Thread- und Blockstruktur von CUDA sowie Techniken der Speicherverwaltung versteht, kann effizientere GPU-Programme schreiben
  • Besonders in Bereichen wie Deep Learning lässt sich die Leistung durch benutzerdefinierte CUDA-Kernel maximieren
  • Auch beim Einsatz von High-Level-Frameworks wie PyTorch kann bei Bedarf durch Low-Level-CUDA-Optimierungen noch mehr Performance herausgeholt werden

1 Kommentare

 
GN⁺ 2025-02-22
Hacker-News-Kommentare
  • Dumme Frage: Gibt es als Ingenieur eine Möglichkeit, tief in die Low-Level-Aspekte von CUDA oder der GPU-Architektur einzutauchen, ohne die mathematische Seite von AI zu lernen? Falls ja, wie sollte man anfangen? Ich habe das Gefühl, man müsste lernen, warum GPUs für Optimierung und bestimmte Berechnungen verwendet werden

    • Parallele Frage: Ich habe mich immer gefragt, ob man als Data Engineer in MLE oder AI Data Engineering einsteigen kann, ohne AI/ML zu kennen. Ich dachte, man müsse nur die Form der Daten kennen, aber in allen MLE-Stellenbeschreibungen, die ich bisher gesehen habe, wird ein AI-Hintergrund verlangt
  • Ein wirklich großartiger Artikel. Die Inline-Quizze (QnA), die von AI erzeugt zu sein scheinen, sind sehr nützlich, um das Verständnis zu testen. Ich wünschte, jedes Tutorial hätte diese Funktion

  • Ich frage mich, ob alle CUDA-Tutorials auf AI ausgerichtet sind oder ob es zum Beispiel auch welche für allgemeine wissenschaftliche Berechnungen gibt. Es wäre interessant, für High Performance Computing Dinge wie den Luftstrom über einem Flügel auszuprobieren

  • Danke fürs Teilen, ich habe die Lektüre genossen. Ich habe eine leicht verwandte Frage: Mich würde interessieren, ob jemand Einblicke darin hat, wie DeepSeek die Ausführung effizienter gemacht hat, indem es CUDA umgangen hat

    • Ich fand es immer erstaunlich, dass bei CUDA, einer über lange Zeit entwickelten Kernbibliothek, immer noch Raum für Verbesserungen besteht. Vor allem so sehr, dass ein neues Entwicklerteam die Lücke selbst schließen kann
  • Wenn Jensen gibt, nimmt Guido wieder weg

  • Dieses Buch: "Programming Massively Parallel Processors" scheint maßgeschneidert für Leute zu sein, die von der CPU- zur GPU-Architektur wechseln

  • Schaut euch auch https://github.com/rust-gpu/rust-gpu und https://github.com/rust-gpu/rust-cuda an

  • Verwandte Links: https://sakana.ai/ai-cuda-engineer/ und https://reddit.com/r/MachineLearning/…

  • Ich frage mich, ob jemand eine Idee hat, was sich in letzter Zeit geändert hat, sodass Simulationen, die früher nur auf der CPU möglich waren, jetzt komplett auf der GPU laufen können, zum Beispiel in isaac sim

  • Da es auf der Website von PySpur steht, würde mich interessieren, ob jemand Erfahrung mit UI-Tools für AI-Agenten wie PySpur und n8n hat. Ich suche nach etwas, das hilfreich wäre, um zum Spaß ein paar Ideen zu prototypen. Ich muss es selbst hosten ($), daher würde ich etwas bevorzugen, das relativ einfach einzurichten ist, wie Open Hands