De zéro au GPU : Guide pour construire et déployer des kernels CUDA prêts pour la production
Sources: https://huggingface.co/blog/kernel-builder, Hugging Face Blog
Aperçu\n\nLes kernels CUDA personnalisés offrent des gains de performance importants pour les modèles, mais transformer une preuve de concept en solution prête pour la production nécessite des processus de build robustes, des cibles multi-architectures et une deployment fiable. Le kernel-builder de Hugging Face propose un flux de travail cohérent pour développer un kernel localement, le construire pour plusieurs architectures et le publier pour une réutilisation étendue. Ce guide décrit la construction d’un kernel CUDA moderne et aborde les défis réels de la production — en conservant vitesse, efficacité et maintenabilité tout au long du cycle. Une fois terminé, d’autres développeurs peuvent accéder à votre kernel directement depuis le Hub.\n\nL’exemple utilise l’API C++ moderne de PyTorch pour enregistrer une fonction en tant qu’opérateur natif de premier ordre, montrant comment une structure de projet propre et les outils adaptés facilitent la maintenance à long terme. L’organisation et les outils insistent sur la reproductibilité et la portabilité entre les environnements.\n\nLe flux kernel-builder met l’accent sur un environnement de développement reproductible via Nix, garantissant que les builds sont déterministes d’une machine à l’autre. Un fichier flake.nix verrouille les versions exactes du kernel-builder et des dépendances pour éviter les problèmes du type « ça marche sur ma machine ». Cela permet de développer, tester et construire dans un environnement cohérent, indépendamment du système hôte.\n\nLe code GPU, les bindings Python et l’architecture sont organisés pour faciliter l’utilisation et l’extensibilité. Le code CUDA (par exemple, csrc/img2gray.cu) est écrit pour une grille 2D de threads, ce qui convient bien pour les charges de traitement d’image. L’opérateur est enregistré comme opérateur PyTorch natif dans TorchScript, et est exposé sous le namespace torch.ops. Le fichier torch-ext/torch_binding.cpp utilise TORCH_LIBRARY_EXPAND pour déclarer l’opérateur de manière extensible pour les backends futurs. Cette architecture est au cœur de l’histoire de production : la compatibilité avec torch.compile permet l’intégration de votre opérateur personnalisé dans des graphes plus vastes, réduisant l’overhead et maximisant les performances globales. Des implémentations spécifiques au matériel — CUDA ou CPU — sont supportées via des blocs de dispatch (par exemple, TORCH_LIBRARY_IMPL(img2gray, CUDA, …) et TORCH_LIBRARY_IMPL(img2gray, CPU, …)) afin que la même API fonctionne sur différents périphériques.\n\nUn wrapper Python est généré pour que les utilisateurs puissent importer et appeler l’opérateur enregistré directement dans Python. Le module wrapper (_ops) est généré automatiquement par kernel-builder à partir d’un modèle afin de fournir un espace de noms stable pour les fonctions C++ enregistrées.\n\n## Principales fonctionnalités\n- Développement local de kernels dans un environnement Nix reproductible.\n- Support multi-architecture (CUDA et backends CPU) avec dispatch automatique.\n- Enregistrement d’opérateur PyTorch natif via TORCH_LIBRARY_EXPAND pour une intégration fluide dans les graphes.\n- Backends hardware dédiés et backends portables via des blocs TORCH_LIBRARY_IMPL distincts.\n- Structure de projet épurée avec un package Python exposant l’opérateur sous torch.ops.\n- Builds reproductibles avec verrouillage des dépendances via flake.nix.\n- Construction automatique pour multiples versions PyTorch/CUDA.\n- Publication sur le Hub pour partager les kernels avec la communauté (par ex. drbh/img2gray).\n- Support du versioning avec tags semantiques (vx.y.z) et limites de version pour stabiliser l’usage.\n- Flux de gestion des kernels au niveau du projet (pyproject.toml) et utilitaire kernels en ligne de commande pour verrouiller les versions.\n- Séparation nette entre artefacts de build et de runtime pour simplifier la distribution.\n- Directives pour nettoyer les artefacts de développement avant publication afin d’obtenir des versions plus compactes.\n\n## Cas d’usage courants\n- Prototypage et validation de kernels CUDA performants localement, puis extension pour répondre à des charges de production.\n- Construction multi-architecture (CUDA et CPU) afin que le dispatcher PyTorch sélectionne automatiquement le kernel.\n- Emballage des kernels pour distribution via Hugging Face Hub, permettant une réutilisation facile entre équipes et projets.\n- Intégration des kernels personnalisés avec des graphes PyTorch en utilisant le torch.compile pour minimiser l’overhead et maximiser la fusion des opérations.\n- Gestion des versions des kernels au niveau du projet avec des verrouillages et du versionnage semantique pour éviter les ruptures.\n- Fonctionnement dans des environnements avec des combinaisons fixes de PyTorch/CUDA tout en conservant une voie vers des versions plus récentes si nécessaire.\n\n## Setup & installation (commandes exactes; blocs de code)\n- Prérequis: vous travaillerez avec Nix et le Hub Hugging Face.\n- Construisez le kernel dans un environnement local reproductible:\nbash\nnix build . -L\n\n- Entrez dans un shell de développement avec les dépendances préinstallées et les versions ciblées (CUDA & PyTorch):\nbash\nnix develop\n\n- Connectez-vous au Hub Hugging Face pour publier votre kernel:\nbash\nhuggingface-cli login\n\n- Après test et build local, publiez votre kernel dans un dépôt du Hub (par exemple, drbh/img2gray) pour le mettre à disposition des utilisateurs. Les commandes exactes dépendront de votre flux VCS, mais le chemin du dépôt sera celui du Hub. Le flux kernel-builder et la publication sur le Hub visent à réduire l’effort pour les utilisateurs finaux.\n```
\n## Quick start (exemple minimal exécutable)\nCe quick start montre l’utilisation d’un opérateur PyTorch enregistré et chargé depuis le Hub. L’opérateur est exposé via le namespace torch.ops. L’exemple ci-dessous convertit une image RGB synthétique en niveaux de gris en utilisant le kernel enregistré.\npython\nimport torch\n\n# Création d’une image RGB fictive sur CUDA\nrgb = torch.randn(1, 3, 64, 64, device='cuda')\n\n# Utilisation du kernel enregistré via le dispatcher PyTorch\ngray = torch.ops.img2gray(rgb)\n\nprint(gray.shape)\n
\n## Avantages et inconvénients\n- Avantages:\n - Builds reproductibles et verrouillages des dépendances éliminent les problèmes d’environnement.\n - Support multi-architecture garantissant l’exécution sur GPUs CUDA et CPUs.\n - Enregistrement natif PyTorch facilite la fusion dans les graphes et l’intégration à l’exécution.\n - Publication via le Hub simplifie le partage et la gestion des versions.\n - Versionnage semantique et limites de version aident à maintenir la compatibilité descendante.\n- Inconvénients:\n - La configuration initiale peut être complexe, notamment autour du multi-architectures et de la publication sur le Hub.\n - Les temps de build peuvent augmenter lorsque l’on génère de nombreuses variantes PyTorch/CUDA.\n - Nécessite une certaine familiarité avec Nix, les extensions C++ de PyTorch et les flux Hub.\n\n## Alternatives (comparaisons rapides)\n| Approche
| Ce qu’elle offre
| Inconvénients
|\n|---|---|---|\n| Développement manuel de kernels CUDA avec scripts de build | Contrôle total, pas de dépendance Hub | Maintenance accrue, gestion de versionnage propriétaire |\n| Kernel-builder + publication sur Hub (recommandé) | Builds reproductibles, multi-ARCH, partage facilité |
Requiert adoption du Hub et gestion des versions |\n\n## Prix ou Licence\nAucune information explicite sur la licence n’est fournie dans les sources.\n\n## Références\n- https://huggingface.co/blog/kernel-builder\n- https://huggingface.co/drbh/img2gray\n
More resources
CUDA Toolkit 13.0 pour Jetson Thor : Écosystème Arm Unifié et Plus
Kit CUDA unifié pour Arm sur Jetson Thor avec cohérence mémoire complète, partage du GPU entre processus, interop OpenRM/dmabuf, support NUMA et outils améliorés pour l’embarqué et le serveur.
Réduire les coûts de déploiement des modèles tout en conservant les performances grâce au swap de mémoire GPU
Exploitez le swap mémoire GPU (hot-swapping de modèles) pour partager les GPUs entre plusieurs LLM, réduire les coûts inoccupés et améliorer l’auto-Scaling tout en respectant les SLA.
Amélioration de l’auto-tuning GEMM avec nvMatmulHeuristics dans CUTLASS 4.2
Présente nvMatmulHeuristics pour sélectionner rapidement un petit ensemble de configurations de kernels GEMM à fort potentiel pour CUTLASS 4.2, réduisant considérablement le temps de tuning tout en approchant les performances d’une Recherche Exhaustive.
Accélérez ZeroGPU Spaces avec la compilation ahead-of-time (AoT) de PyTorch
Découvrez comment la compilation AoT de PyTorch accélère ZeroGPU Spaces en exportant un modèle compilé et en le rechargeant instantanément, avec quantification FP8, formes dynamiques et intégration au flux Spaces GPU.
Comment détecter et corriger 5 goulets d'étranglement pandas avec cudf.pandas
Ressource technique pour développeurs présentant cinq goulets d'étranglement courants, des solutions CPU et GPU, et l'accélération GPU en mode drop-in via cudf.pandas.
À l'intérieur du NVIDIA Blackwell Ultra : la puce qui propulse l'ère des usines d'IA
Profil détaillé du Blackwell Ultra, sa conception à double die NV‑HBI, sa précision NVFP4, ses 288 Go HBM3e par GPU et ses interconnexions système pour les usines IA et l'inférence à grande échelle.