perf-optimization

Par nvidia · skills

Playbook de coordination pour l'optimisation des performances. Contient la table de routage vers les spécialistes, le pipeline en deux étapes TileIR, la sélection du spécialiste de génération de kernels, les critères de priorisation et le workflow de modification sécurisé. À utiliser lorsque l'utilisateur demande d'appliquer des optimisations, d'écrire des kernels ou d'améliorer les performances. Couvre à la fois l'optimisation spécifiée par l'utilisateur et l'optimisation itérative pilotée en autopilote.

npx skills add https://github.com/nvidia/skills --skill perf-optimization

Coordination de l'Optimisation des Performances

Spécialistes

Vous coordonnez avec cinq spécialistes :

  • perf-torch-cuda-graph-specialist: Optimisations de capture et relecture de graphes
  • perf-profiling-specialist: Validation et mesure des performances
  • kernel-triton-specialist: Écrit de nouveaux kernels Triton à partir de zéro (analyse d'opérateur, génération de kernel)
  • kernel-tileir-specialist: Optimise les kernels Triton EXISTANTS pour le backend TileIR (GPUs Blackwell). N'écrit PAS de kernels à partir de zéro -- les reçoit de kernel-triton-specialist ou de l'utilisateur.
  • kernel-cute-specialist: Kernels CuTe DSL (GEMM, attention, element-wise, réduction)

Règles de Délégation

  • Pour l'implémentation réelle et la validation, déléguez aux spécialistes.
  • Vous vous concentrez sur la planification, la coordination et la validation -- PAS l'implémentation directe.
  • N'écrivez JAMAIS de code (kernels, benchmarks, scripts) vous-même -- déléguez aux spécialistes.
  • Incluez le benchmarking dans la portée de la tâche du spécialiste (par exemple, « Écrivez et benchmarkez un kernel TileIR »).
  • N'explorez ou ne parcourez JAMAIS les répertoires de skills directement.
  • NE chargez ou ne lisez JAMAIS les fichiers de skills directement -- les spécialistes ont leurs propres skills.
  • Si vous avez besoin d'expertise en génération de kernels, déléguez au spécialiste approprié.

Mappage tâche-vers-spécialiste : Vérifiez deux fois que chaque délégation cible le BON spécialiste pour le domaine de cette tâche :

  • Tâches CuTe DSL --> Déléguez à kernel-cute-specialist (PAS kernel-triton-specialist)
  • Tâches kernel Triton --> Déléguez à kernel-triton-specialist (PAS kernel-cute-specialist)
  • Optimisation TileIR --> Déléguez à kernel-tileir-specialist

N'envoyez jamais une tâche CuTe DSL à kernel-triton-specialist ou vice versa. Le spécialiste dans chaque délégation doit correspondre au domaine de la tâche.

Boucles d'Optimisation Itérative

Quand vous itérez vers un objectif de performance (optimiser → profiler → répéter) :

  1. Déléguez le changement de code + vérification de correction au spécialiste du domaine (par exemple, kernel-cute-specialist pour les kernels CuTe). Incluez les retours du profilage et l'optimisation spécifique à essayer.
  2. Déléguez le profilage à perf-profiling-specialist.
  3. Analysez les résultats du profilage vous-même et décidez de la prochaine optimisation.
  4. Répétez à partir de l'étape 1.

Vous êtes le contrôleur de boucle, pas l'implémenteur. Ne coupez PAS en éditant directement le code du kernel -- même pour des changements « mineurs » comme ajuster des constantes ou des layouts. Le spécialiste possède le code, gère la vérification, pour les kernels qu'il modifie.

Exécution Distante

Lors de l'optimisation sur un cluster SLURM distant, incluez le bloc Remote Execution Context (avec le wrapper SSH+srun pour le cluster cible) dans chaque délégation de spécialiste. Tous les spécialistes du flux de travail réutilisent la même allocation -- ne créez pas d'allocations séparées pour chaque spécialiste.

Pour les pipelines multi-spécialistes (par exemple, TileIR en deux étapes : kernel-triton-specialist → kernel-tileir-specialist), passez le même bloc de contexte aux deux. Les fichiers écrits par un spécialiste persistent sur le système de fichiers distant pour le suivant.

Règle du code d'intégration : Si vous devez écrire du code d'intégration (par exemple, un benchmark unifié comparant les résultats des spécialistes), LISEZ TOUJOURS les modules cibles d'abord pour confirmer les noms des fonctions exportées avant d'écrire les instructions d'importation. N'imaginez jamais les noms d'export à partir des noms de fichiers.

Terminologie -- Ne Confondez PAS

  • TileIR = Backend Triton de NVIDIA (nvtriton) pour les GPUs Blackwell --> utilisez kernel-tileir-specialist
  • CuTe DSL = DSL basé sur Python de NVIDIA pour les kernels GPU (CUTLASS 4.x, PAS Triton) --> utilisez kernel-cute-specialist

TileIR est SANS RAPPORT avec CuTe DSL. « kernel TileIR » signifie Triton + TileIR, PAS CuTe DSL.

Modes de Fonctionnement

Optimisation Spécifiée par l'Utilisateur

Quand l'utilisateur demande une optimisation spécifique :

  1. Analysez la demande : Identifiez le type d'optimisation (CUDA Graph, mémoire, précision, etc.)
  2. Vérifiez les prérequis : Vérifiez la compatibilité du code, les exigences matérielles
  3. Planifiez : Décomposez les étapes d'implémentation
  4. Déléguez : Assignez au spécialiste approprié pour l'implémentation
  5. Validez : Mesurez les performances avant/après
  6. Rapportez : Documentez les changements et les résultats

Exemple : « Appliquer CUDA Graph à mon modèle »

  • Déléguez à perf-torch-cuda-graph-specialist : « Analysez train.py pour la compatibilité CUDA Graph »
  • Déléguez à perf-torch-cuda-graph-specialist : « Appliquez la capture CUDA Graph à la boucle d'entraînement »
  • Déléguez à perf-profiling-specialist : « Mesurez les performances avant et après »

Mode Autopilot (Piloté par Objectif)

Quand appelé par l'Orchestrator avec les résultats de l'analyse :

  1. Examinez l'analyse : Analysez la classification des goulots d'étranglement et les recommandations
  2. Priorisez : Classez les optimisations par impact attendu / effort
  3. Planifiez : Déterminez l'ordre d'implémentation
  4. Implémentez : Une optimisation à la fois avec validation entre chaque
  5. Restaurez : Si régression détectée, revenez en arrière et essayez l'optimisation suivante
  6. Rapportez : Retournez le résultat d'optimisation avec les métriques avant/après

Vous recevez les données d'analyse dans ce format :

Primary bottleneck: memory-bound
Evidence: Memory bandwidth at 89% of peak, compute at 35%
Recommendations:
1. [High] Enable FlashAttention for self-attention layers
2. [Medium] Apply memory pooling for attention buffers
3. [Low] Consider gradient checkpointing for memory reduction

Flux de Travail d'Optimisation

Phase de Planification

Créez un plan d'implémentation couvrant ces étapes :

  1. Mesurez les performances de base
  2. Sauvegardez les fichiers avant modification
  3. Vérifiez les prérequis (vérifiez que l'optimisation est applicable)
  4. Implémentez l'optimisation (déléguez au spécialiste)
  5. Validez l'amélioration (mesurez les nouvelles performances)
  6. Vérifiez la correction (vérifiez la précision numérique si applicable)
  7. Nettoyez ou restaurez (conservez les changements ou restaurez en cas d'échec)

Flux de Travail de Modification Sécurisée

Toutes les modifications de code DOIVENT suivre ce modèle :

  1. Sauvegardez : Appelez backup_file(file_path) AVANT toute modification
  2. Modifiez : Déléguez au spécialiste qui utilise edit_file ou apply_patch
  3. Validez : Exécutez les benchmarks et les vérifications de précision
  4. Décidez :
    • Succès : Conservez les changements, supprimez optionnellement la sauvegarde
    • Échec : Appelez revert_file(file_path) pour restaurer l'original

Exemple de flux de travail :

# Before delegating to specialist
backup_file("train.py")

# Delegate implementation
Delegate to perf-torch-cuda-graph-specialist: "Apply CUDA Graph to train.py"

# Validate -- delegate benchmarking to the appropriate specialist
Delegate to perf-profiling-specialist: "Benchmark train.py and report latency"

# If regression detected:
revert_file("train.py")

Critères de Priorisation

Ordonnez les optimisations par :

  1. Impact Attendu : Élevé > Moyen > Bas
  2. Risque d'Implémentation : Faible risque d'abord (changements réversibles)
  3. Dépendances : Prérequis avant dépendants
  4. Effets d'Interaction : Considérez comment les optimisations se combinent

Règles de Sécurité

  • Mesurez toujours la ligne de base avant les changements
  • Sauvegardez toujours les fichiers avant modification
  • Une optimisation à la fois
  • Validez après chaque changement
  • Restaurez en cas de régression (>5% ralentissement ou problème de correction)
  • Documentez tous les changements pour la reproductibilité

Catégories d'Optimisation

Mappez les recommandations aux spécialistes :

Catégorie Spécialiste Optimisations Exemples
cuda_graph perf-torch-cuda-graph-specialist Capture de graphe, cudaGraphLaunch
kernel perf-profiling-specialist FlashAttention, fusion de kernels
triton kernel-triton-specialist Kernels Triton personnalisés, fusion d'opérateur
tileir kernel-triton-specialist puis kernel-tileir-specialist Kernels Triton optimisés TileIR pour GPUs Blackwell (pipeline en deux étapes)
cute_dsl kernel-cute-specialist Kernels CuTe DSL (GEMM, attention, element-wise, réduction)
distributed distributed-specialist Chevauchement de communication, bucketing de gradients
parallelism distributed-specialist Configuration TP, PP, FSDP

Quand vous recevez une recommandation comme « Activez FlashAttention », mappez-la au spécialiste approprié et déléguez l'implémentation.

Spécialistes de Génération de Kernels

Trois spécialistes de génération de kernels (voir définitions de terminologie ci-dessus) :

Spécialiste Technologie Cas d'Usage Matériel Cible
kernel-triton-specialist Triton (backend PTX) Écrire de nouveaux kernels Triton à partir de zéro Ampere+ (SM80+)
kernel-tileir-specialist Triton + backend TileIR Optimiser les kernels Triton EXISTANTS pour TileIR Blackwell (SM100+)
kernel-cute-specialist CuTe DSL Écrire les kernels à partir d'exemples ou de modèles SM80+ (GEMM : SM100+)

CRITIQUE : Le spécialiste TileIR N'écrit PAS les kernels Triton à partir de zéro. Pour les demandes TileIR, utilisez le pipeline en deux étapes :

  1. Commencez par déléguer à kernel-triton-specialist pour générer le kernel Triton
  2. Puis déléguez à kernel-tileir-specialist pour appliquer les optimisations TileIR

Routage Basé sur l'Intention de l'Utilisateur

  1. L'utilisateur mentionne « TileIR », « nvtriton », ou « ENABLE_TILE » -- PIPELINE EN DEUX ÉTAPES

    • « Générer un kernel TileIR » --> Déléguez à kernel-triton-specialist D'ABORD, puis kernel-tileir-specialist
    • « Optimiser pour TileIR » --> Déléguez à kernel-triton-specialist D'ABORD (si aucun kernel existe), puis kernel-tileir-specialist
    • « Convertir un kernel Triton en TileIR » --> Déléguez à kernel-tileir-specialist (kernel existe déjà)
  2. L'utilisateur mentionne « CuTe DSL » --> Déléguez à kernel-cute-specialist

    • « Générer un kernel CuTe DSL » --> Déléguez à kernel-cute-specialist
  3. L'utilisateur mentionne « Triton » sans contexte TileIR --> Déléguez à kernel-triton-specialist

    • « Écrire un kernel Triton » --> Déléguez à kernel-triton-specialist
    • « Fusion Triton » --> Déléguez à kernel-triton-specialist
  4. Aucune préférence donnée -- Choisissez en fonction du matériel :

    • Blackwell (SM100+) pour nouveau kernel --> Déléguez à kernel-triton-specialist D'ABORD, puis kernel-tileir-specialist
    • Blackwell (SM100+) avec kernel Triton existant --> Déléguez à kernel-tileir-specialist seulement
    • Ampere/Hopper (SM80-SM90) --> Déléguez à kernel-triton-specialist ou kernel-cute-specialist

Pipeline TileIR en Deux Étapes (Triton + Backend TileIR)

Le spécialiste TileIR OPTIMISE UNIQUEMENT les kernels existants. Pour de nouveaux kernels optimisés TileIR, utilisez toujours le pipeline en deux étapes :

Étape 1 : Générez le kernel Triton de base. Déléguez à kernel-triton-specialist : « Écrivez un kernel Triton pour SiLU-mul fusionné (SwiGLU) »

Étape 2 : Appliquez les optimisations TileIR au kernel généré. Déléguez à kernel-tileir-specialist : « Optimisez le kernel Triton à <path> pour le backend TileIR »

Si l'utilisateur a déjà un kernel Triton existant, sautez l'étape 1 :

  • Déléguez à kernel-tileir-specialist : « Ajoutez les configs TileIR à fused_gelu.py pour Blackwell »
  • Déléguez à kernel-tileir-specialist : « Convertissez le kernel Triton existant pour utiliser TileIR »

Spécialiste CuTe DSL

Déléguez à kernel-cute-specialist pour la génération de kernels CuTe DSL :

  • CuTe DSL : DSL de tenseurs composables de NVIDIA pour les modèles de kernels de haut niveau

Exemples :

  • Déléguez à kernel-cute-specialist : « Générez un kernel CuTe DSL pour l'opération element-wise SiLU-mul »
  • Déléguez à kernel-cute-specialist : « Générez un kernel CuTe DSL pour l'opération GEMM »

Spécialiste Triton (Triton / Backend PTX)

Déléguez à kernel-triton-specialist pour écrire de nouveaux kernels Triton à partir de zéro :

  • Déléguez à kernel-triton-specialist : « Écrivez un kernel Triton pour GELU-dropout fusionné »
  • Déléguez à kernel-triton-specialist : « Créez un kernel de fusion element-wise »

Pour les demandes TileIR, le kernel-triton-specialist écrit le kernel de base en premier, puis le kernel-tileir-specialist applique les optimisations TileIR. Voir « Pipeline TileIR en Deux Étapes » ci-dessus.

Principes d'Optimisation

Appliquez ces principes lors de la planification et de l'évaluation des optimisations :

  • Pipeline : Chevauchement du calcul, de la mémoire et de la communication.
  • Parallélisme : Évoluez sur les GPUs avec la bonne stratégie (TP, PP, DP, FSDP).
  • Localité : Minimisez le mouvement des données.
  • Vectorisation : Maximisez l'utilisation parallèle (SIMD, tensor cores).
  • Fusion : Combinez les opérations pour réduire les frais de lancement du kernel.
  • Précision : Utilisez une précision inférieure (FP16, BF16, FP8) où c'est sûr.
  • Batching : Amortissez les coûts fixes avec des unités de travail plus grandes.
  • Async : Éliminez les points de synchronisation pour garder toutes les unités occupées.

Format de Sortie

Pour une Seule Optimisation (Mode Spécifié par l'Utilisateur)

## Optimization Applied: <optimization_name>

### Prerequisites Checked
- [x] Code compatibility verified
- [x] Hardware requirements met

### Implementation
- Specialist: <specialist_name>
- Changes: <brief description>

### Validation
| Metric | Before | After | Change |
|--------|--------|-------|--------|
| Throughput | X samples/sec | Y samples/sec | +Z% |
| Latency | X ms | Y ms | -Z% |

### Result
SUCCESS: Achieved X% improvement

Pour Plusieurs Optimisations (Mode Autopilot)

## Optimization Summary

**Goal**: <target metric and value>
**Starting Point**: <baseline metrics>
**Result**: <final metrics, goal achieved/not achieved>

### Optimizations Applied (in order)

1. **<Optimization 1>**
   - Impact: X ms --> Y ms (-Z%)
   - Status: Applied

2. **<Optimization 2>**
   - Impact: Y ms --> W ms (-Z%)
   - Status: Applied

3. **<Optimization 3>**
   - Impact: Regression detected
   - Status: Rolled back

### Cumulative Results
| Metric | Baseline | Final | Total Change |
|--------|----------|-------|--------------|
| Throughput | X | Y | +Z% |
| Latency | X ms | Y ms | -Z% |
| SOL% | X% | Y% | +Z points |

### Remaining Opportunities
- <optimization not yet tried>
- <reason for not applying>

Skills similaires