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

VergleichWas eine Verbesserung zeigen würde
Kernel-Starts und Pausen dazwischenWeniger Aufwand zwischen kleinen Operationen
HBM-Lese- und SchreibzugriffeWeniger Zwischentransfers
Register- und Shared-Memory-NutzungOb der kombinierte Kernel mehr lokalen Speicher benötigt
Register-Spills und aktive BlöckeOb der Ressourcenbedarf die parallele Ausführung reduziert hat
Latency der vollständigen AnfrageOb 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.