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

ComparerCe qu’une amélioration montrerait
Lancements de kernels et intervalles entre euxMoins de surcoût entre les petites opérations
Lectures et écritures en HBMMoins de transferts intermédiaires
Utilisation des registres et de la mémoire partagéeSi le kernel combiné nécessite davantage de stockage local
Transferts des registres vers la mémoire et blocs actifsSi la pression sur les ressources a réduit l’exécution parallèle
Latence de la requête complèteSi 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.