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

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.
| Schicht | Typ | Filter / Neuronen insgesamt | Aufteilung pro GPU | GPU-übergreifende Kommunikation |
|---|---|---|---|---|
| Eingabe | RGB-Bild | 224 × 224 × 3 | Auf beide GPUs kopiert | Keine |
| Conv 1 | 11×11-Faltung (Schrittweite 4) + MaxPool | 96 Filter | 48 Filter pro GPU | Isoliert (keine Synchronisierung) |
| Conv 2 | 5×5-Faltung + MaxPool | 256 Filter | 128 Filter pro GPU | Isoliert (liest nur Conv 1 der eigenen GPU) |
| Conv 3 | 3×3-Faltung | 384 Filter | 192 Filter pro GPU | Vollständige Synchronisierung (liest alle 256 Merkmalskarten beider GPUs) |
| Conv 4 | 3×3-Faltung | 384 Filter | 192 Filter pro GPU | Isoliert (liest nur Conv 3 der eigenen GPU) |
| Conv 5 | 3×3-Faltung + MaxPool | 256 Filter | 128 Filter pro GPU | Isoliert (liest nur Conv 4 der eigenen GPU) |
| FC 6 | Vollständig verbunden + Dropout | 4.096 Neuronen | 2.048 Neuronen pro GPU | Vollständige Synchronisierung (mit allen Ausgaben von Conv 5 verbunden) |
| FC 7 | Vollständig verbunden + Dropout | 4.096 Neuronen | 2.048 Neuronen pro GPU | Vollständige Synchronisierung (mit allen Neuronen von FC 6 verbunden) |
| FC 8 | Vollständig verbunden (Softmax) | 1.000 Klassen | 1.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.