Profiling in PyTorch (Teil 3): Attention ist alles, was Sie profilen
PyTorch
NVIDIA
Dieser Beitrag profiliert Aufmerksamkeitsmechanismen in PyTorch und vergleicht naive Aufmerksamkeit, In-Place-Optimierung und Backends der Skalierten Punktprodukt-Aufmerksamkeit (SDPA). Es zeigt, dass das Mathematik-Backend von SDPA aufgrund von Unterauslastung der Tensor Cores, Maskenrekonstruktion und Overhead durch sicheres Softmax langsamer ist als naive Aufmerksamkeit.
Der dritte Beitrag der Serie „Profiling in PyTorch“ profiliert Aufmerksamkeitsmechanismen. Er beginnt mit einem naiven Aufmerksamkeitsmodul (Matmul, Skalierung, Maskierung, Softmax, Matmul), dessen Trace 5 GPU-Kernel pro Vorwärtsdurchlauf zeigt. Der Ersatz von out-of-place masked_fill durch in-place masked_fill_ eliminiert einen Speicherkopierkernel und spart Zeit sowie Speicher. Als Nächstes wird Scaled Dot Product Attention (SDPA) eingeführt; dessen Math-Backend ist zwar sicherer (behandelt NaN-Fälle) und präziser (FP32), aber 3,7-mal langsamer als naive Aufmerksamkeit, da es 20 GPU-Kernel startet, keine Tensor Cores verwendet (stattdessen sgemm anstelle von bf16 Tensor Core Matmul), die kausale Maske bei jedem Aufruf neu erstellt und _safe_softmax einsetzt. Der Beitrag stellt fest, dass SDPA normalerweise automatisch das schnellste Backend auswählt.
Quelle: Hugging Face blog —
Original
