Wie CUDA-Kernel-Fusion die LLM-Inference beschleunigt
Automatische Übersetzung
Dieser Artikel wurde automatisch aus der englischen Originalversion übersetzt.
CUDA-Kernel-Fusion kombiniert Operationen, die sonst als separate GPU-Kernels ausgeführt würden. Sie kann den Startaufwand reduzieren und vermeiden, dass ein Zwischentensor in den GPU-Speicher geschrieben und sofort wieder gelesen wird. Sie hilft, wenn diese Kosten einen nennenswerten Anteil an der Inference-Latency ausmachen.
Den Weg der Zwischendaten prüfen
Betrachten wir eine Residualaddition mit anschließender Normalisierung. Separate Kernels können das Additionsergebnis in den GPU-Hauptspeicher schreiben und für die Normalisierung erneut lesen. Eine kompatible fusionierte Implementierung kann Zwischenwerte innerhalb des Kernels wiederverwenden. Das spart Transfers; die mathematischen Operationen und ihre Korrektheitsanforderungen bleiben bestehen.
Fusion lässt sich auch auf größere Operationen anwenden. DeepFusionKernel untersucht die Fusion einer vollständigen SwiGLU-Feed-Forward-Berechnung einschließlich ihrer Matrixmultiplikationen. Das geht über das Zusammenführen elementweiser Aktivierungsfunktionen hinaus.
FlashNorm verwendet eine andere Transformation: Sie integriert den gelernten Skalierungsfaktor von RMSNorm in eine nachfolgende lineare Operation und verschiebt die erneute Skalierung auf später.
Prüfen, ob die Fusion geholfen hat
| Vergleich | Was eine Verbesserung zeigen würde |
|---|---|
| Kernel-Starts und Pausen dazwischen | Weniger Aufwand zwischen kleinen Operationen |
| HBM-Lese- und Schreibzugriffe | Weniger Zwischentransfers |
| Register- und Shared-Memory-Nutzung | Ob der kombinierte Kernel mehr lokalen Speicher benötigt |
| Register-Spills und aktive Blöcke | Ob der Ressourcenbedarf die parallele Ausführung reduziert hat |
| Latency der vollständigen Anfrage | Ob die Kernel-Änderung für Nutzer einen Unterschied gemacht hat |
Der Hopper-Optimierungsleitfaden erklärt die Ressourcenlimits, die gleichzeitig aktive GPU-Arbeit begrenzen. Das Zusammenführen von Operationen kann den Registerbedarf erhöhen, Register-Spills verursachen oder die Anzahl gleichzeitig ausgeführter Blöcke begrenzen. Ein größerer fusionierter Kernel kann daher bei manchen Tensorformen langsamer sein.
Halten Sie Model, Präzision, GPU, Eingabelänge und Batchgröße konstant. Prüfen Sie neben der Zeit auch die numerischen Ergebnisse und die Qualität bei der jeweiligen Aufgabe. Vergleichen Sie außerdem Decode mit kleinen Batches mit Prefill mit größeren Batches: Ein geringerer Startaufwand kann bei kurzen Operationen deutlich mehr ausmachen als bei langen Matrixberechnungen.
Der Engineering-Leitfaden: CUDA-Kernels und Fusion stellt den Zusammenhang zwischen diesen Methoden und quantisierten Matrix-Kernels her.