Comment la fusion de kernels CUDA accélère l’inférence des LLM
Traduction automatique
Cet article a été traduit automatiquement depuis la version originale en anglais.
La fusion de kernels CUDA combine des opérations qui, autrement, s’exécuteraient dans des kernels GPU distincts. Elle peut réduire le coût des lancements et éviter d’écrire un tenseur intermédiaire dans la mémoire du GPU pour le relire immédiatement. Elle est utile lorsque ces coûts représentent une part significative de la latence d’inférence.
Suivre les données intermédiaires
Prenons une addition résiduelle suivie d’une normalisation. Des kernels distincts peuvent écrire le résultat de l’addition dans la mémoire principale du GPU, puis le relire pour la normalisation. Une implémentation fusionnée compatible peut réutiliser les valeurs intermédiaires à l’intérieur du kernel. Cela réduit les transferts ; cela ne supprime ni les opérations mathématiques ni leurs exigences de correction.
La fusion s’applique aussi à des opérations plus importantes. DeepFusionKernel étudie la fusion d’un calcul complet du réseau à propagation avant SwiGLU, y compris ses multiplications matricielles. Cela va au-delà de la combinaison de fonctions d’activation élément par élément.
FlashNorm utilise une autre transformation : elle intègre le facteur d’échelle appris de RMSNorm dans une opération linéaire suivante et reporte la remise à l’échelle.
Vérifier si la fusion a été utile
| Comparer | Ce qu’une amélioration montrerait |
|---|---|
| Lancements de kernels et intervalles entre eux | Moins de surcoût entre les petites opérations |
| Lectures et écritures en HBM | Moins de transferts intermédiaires |
| Utilisation des registres et de la mémoire partagée | Si le kernel combiné nécessite davantage de stockage local |
| Transferts des registres vers la mémoire et blocs actifs | Si la pression sur les ressources a réduit l’exécution parallèle |
| Latence de la requête complète | Si le changement de kernel a eu un effet pour les utilisateurs |
Le guide d’optimisation de Hopper explique les limites de ressources qui restreignent le travail GPU actif simultanément. Combiner des opérations peut augmenter l’utilisation des registres, provoquer des transferts des registres vers la mémoire ou limiter le nombre de blocs exécutés en même temps. Un kernel fusionné plus grand peut donc être plus lent pour certaines formes de tenseurs.
Gardez constants le modèle, la précision, le GPU, la longueur d’entrée et la taille du lot. Vérifiez les résultats numériques et la qualité sur la tâche, ainsi que le temps d’exécution. Comparez aussi le décodage avec de petits lots au prefill avec des lots plus grands : réduire le coût des lancements peut compter bien davantage pour les opérations courtes que pour les longs calculs matriciels.
Le guide d’ingénierie : kernels CUDA et fusion relie ces méthodes aux kernels matriciels quantifiés.