Deutsche Nachrichten
Aktuell
KI & Technologie

Ein Blick in cuda-convnet: AlexNets Schichten auf zwei GPUs und die ImageNet-Ära

Illustratives Detail eines Prozessorchips, nicht die im Artikel behandelte NVIDIA-GPU.
Illustratives Detail eines Prozessorchips, nicht die im Artikel behandelte NVIDIA-GPU.

Der AlexNet-Meilenstein von 2012 beruhte auf hardwarenaher GPU-Entwicklung (cuda-convnet) und einer auf zwei GPUs aufgeteilten Architektur. Er löste unmittelbar einen rasanten Wettlauf um tiefere und effizientere Modelle für maschinelles Sehen aus.

1. Wie cuda-convnet unter der Haube funktionierte

Bevor NVIDIA cuDNN entwickelte, schrieb Alex Krizhevsky cuda-convnet direkt in CUDA C++, um die frühen GPUs mit Fermi-Architektur (die GTX 580) maximal zu beschleunigen. Moderne Bibliotheken entfalten Faltungen üblicherweise zu riesigen Matrixmultiplikationen (im2col), was enorm viel Speicher verbraucht. Da jede GTX 580 nur 3 GB VRAM hatte, entwickelte Krizhevsky direkte, speichersparende GPU-Routinen.

  • Batch-orientiertes Speicherlayout (CHWN). Moderne Frameworks verwenden standardmäßig NCHW (Batch, Kanäle, Höhe, Breite), wodurch alle Pixel eines einzelnen Bildes im Speicher nebeneinanderliegen. Krizhevsky speicherte Tensoren in CHWN-Reihenfolge und setzte die Batch-Dimension (N) an die letzte Stelle. Wenn 32 GPU-Threads eines Warps 32 verschiedene Bilder an genau derselben Pixelposition verarbeiteten, waren ihre Speicherlesezugriffe vollständig zusammenhängend (zusammengefasst), was die VRAM-Bandbreite maximierte.
  • Kachelung im gemeinsam genutzten Speicher. Das Lesen aus dem globalen VRAM dauert Hunderte Taktzyklen, während der gemeinsam genutzte Speicher auf dem Chip (Shared Memory, auf der GTX 580 nur 48 KB pro Streaming Multiprocessor) lediglich wenige Zyklen benötigt. Thread-Blöcke luden kleine zweidimensionale Ausschnitte von Bildpixeln und Filtergewichte in den Shared Memory, berechneten Dutzende Skalarprodukte und schrieben erst danach die endgültigen Ergebnisse zurück in den VRAM.
  • Wiederverwendung von Registern auf Warp-Ebene. Krizhevsky wies jedem Thread-Block die Aufgabe zu, eine Kachel von Ausgabepixeln für mehrere Filter gleichzeitig zu berechnen. Da die Filtergewichte in schnellen GPU-Registern lagen, konnte ein aus dem Shared Memory geladener Bildausschnitt für viele Filter gleichzeitig wiederverwendet werden, was den Speicherverkehr drastisch verringerte.

2. Die einzelnen Schichten von AlexNet und ihre Aufteilung auf zwei GPUs

AlexNet enthielt 8 gelernte Schichten (5 Faltungsschichten und 3 vollständig verbundene Schichten) mit insgesamt rund 60 Millionen Parametern. Weil eine einzelne GTX 580 nicht über die für Aktivierungen, Gewichte und Gradienten benötigten mehr als 3 GB VRAM verfügte, teilte Krizhevsky das Netzwerk vertikal in zwei parallele Datenströme auf.

SchichtTypFilter / Neuronen insgesamtAufteilung pro GPUGPU-übergreifende Kommunikation
EingabeRGB-Bild224 × 224 × 3Auf beide GPUs kopiertKeine
Conv 111×11-Faltung (Schrittweite 4) + MaxPool96 Filter48 Filter pro GPUIsoliert (keine Synchronisierung)
Conv 25×5-Faltung + MaxPool256 Filter128 Filter pro GPUIsoliert (liest nur Conv 1 der eigenen GPU)
Conv 33×3-Faltung384 Filter192 Filter pro GPUVollständige Synchronisierung (liest alle 256 Merkmalskarten beider GPUs)
Conv 43×3-Faltung384 Filter192 Filter pro GPUIsoliert (liest nur Conv 3 der eigenen GPU)
Conv 53×3-Faltung + MaxPool256 Filter128 Filter pro GPUIsoliert (liest nur Conv 4 der eigenen GPU)
FC 6Vollständig verbunden + Dropout4.096 Neuronen2.048 Neuronen pro GPUVollständige Synchronisierung (mit allen Ausgaben von Conv 5 verbunden)
FC 7Vollständig verbunden + Dropout4.096 Neuronen2.048 Neuronen pro GPUVollständige Synchronisierung (mit allen Neuronen von FC 6 verbunden)
FC 8Vollständig verbunden (Softmax)1.000 Klassen1.000 Klassen (kombiniert)Vollständige Synchronisierung (liefert die endgültigen ImageNet-Vorhersagen)
  • Natürliche Spezialisierung auf Merkmale. Interessanterweise entwickelten die beiden Karten durchgängig spezialisierte Rollen, weil die Schichten 1 und 2 nie GPU-übergreifend kommunizierten. Eine GPU erlernte farbunabhängige Kanten- und Texturdetektoren (Gabor-ähnliche Graustufenfilter), während sich die andere GPU auf farbspezifische Flecken und Farbtöne spezialisierte.
  • Minimierung von PCIe-Engpässen. Die Datenübertragung über den PCIe-Bus des Mainboards war langsam. Indem Krizhevsky die GPU-übergreifende Kommunikation strikt auf Conv 3 und die vollständig verbundenen Schichten beschränkte, konnten die GPUs mit voller Geschwindigkeit rechnen, ohne durch Datenübertragungen aufgehalten zu werden.

3. Was in der ImageNet-Ära als Nächstes geschah

AlexNets Sieg entfachte einen jährlichen Wettlauf im ImageNet-Wettbewerb, der die Netzwerke innerhalb von nur drei Jahren von 8 auf über 150 Schichten anwachsen ließ.

  • 2013 - ZFNet (Visualisierung und Abstimmung). Matthew Zeiler und Rob Fergus führten Dekonvolutionstechniken ein, um sichtbar zu machen, was AlexNet in den verborgenen Schichten tatsächlich sah. Durch die Verringerung der Filtergröße in AlexNets erster Schicht von 11×11 auf 7×7 und eine kleinere Schrittweite senkte ZFNet die Top-5-Fehlerrate bei ImageNet von 15,3 % auf 14,8 %.
  • 2014 - VGGNet (Tiefe durch einheitliche 3×3-Filter). Forschende in Oxford zeigten, dass die Stapelung vieler kleiner 3×3-Faltungen (bis zu 16 oder 19 Schichten) besser funktionierte als einzelne große Filter (etwa 11×11 oder 5×5). Zwei gestapelte 3×3-Schichten decken denselben 5×5-Sichtbereich ab, benötigen aber weniger Parameter und bieten zusätzliche nichtlineare ReLU-Aktivierungen, wodurch die Fehlerraten auf 7,3 % sanken.
  • 2014 - GoogLeNet / Inception (Effizienz auf mehreren Skalen). Google führte das Inception-Modul ein, das innerhalb derselben Schicht parallel 1×1-, 3×3- und 5×5-Faltungen ausführte und die Ausgaben zusammenführte. Durch kostengünstige 1×1-Faltungen, die vor aufwendigen Berechnungen die Kanaltiefe reduzierten, erreichte GoogLeNet 22 Schichten und eine Fehlerrate von 6,7 % bei 12-mal weniger Parametern als AlexNet.
  • 2015 - ResNet (Sprungverbindungen und 152 Schichten). Das bloße Stapeln weiterer Schichten verschlechterte irgendwann die Trainingsgenauigkeit, weil Gradienten bei der Rückpropagation verschwanden. Microsoft Research löste dies mit Residualverbindungen (Sprungverbindungen), durch die Daten Schichten über direkte Identitätsabkürzungen umgehen konnten. Dies ermöglichte Netzwerke mit 152 Schichten und einer Top-5-Fehlerrate von 3,57 %, womit erstmals das menschliche Leistungsniveau im Benchmark (~5 %) übertroffen wurde.

Weitere Nachrichten: KI & Technologie