Présentation de @huggingface/kernels
Hugging Face a lancé @huggingface/kernels, une bibliothèque JavaScript capable de charger et d’exécuter directement depuis le Hub plus de 207 kernels WebGPU. Chaque kernel est empaqueté comme un dépôt versionné (licence Apache‑2.0) contenant son interface, ses modèles de shaders WGSL, des cas de test de correction et des benchmarks. La collection couvre les opérations classiques des réseaux de neurones : multiplications matricielles, convolutions, normalisations, primitives d’attention, quantifications et transformations de layout.
Architecture et gestion des kernels
Le cœur du système repose sur un manifest.json qui définit le contrat de l’opération (types d’entrée, sortie, règles de diffusion, contraintes de forme). Un metadata.json consigne l’identifiant, les empreintes et la provenance du kernel, tandis que test.json et bench.json stockent respectivement les cas de correction et les scénarios de performance. Les implémentations shader sont générées à partir de fichiers .wgsl.jinja, ce qui permet de paramétrer la taille du work‑group, le type de données et les stratégies de fusion en fonction du matériel cible. Le chargeur getKernel récupère le dépôt, lit le manifest, alloue automatiquement les tenseurs de sortie et renvoie une fonction JavaScript prête à être invoquée.
import { getKernel } from "@huggingface/kernels";
const add = await getKernel("webgpu-kernels/ai.onnx.Add", { version: 1 });
const { c } = await add({
a: { data: new Float32Array([1,2,3,4,5,6]), shape: [2,3] },
b: { data: new Float32Array([10,20,30]), shape: [3] }
});
console.log(c.shape); // [2,3]
Ce même appel s’applique à des kernels plus lourds comme ai.onnx.MatMul; seul l’identifiant du dépôt change, ce qui garantit une compatibilité d’API indépendante des optimisations internes.
Fleet : banc d'essai collaboratif
Fleet est une suite de benchmark exécutée dans le navigateur. Elle mesure le temps d’exécution et la correction des kernels sur le GPU de l’utilisateur, puis envoie les métriques (avec consentement) à un serveur central. Ainsi, chaque exécution enrichit une base de preuves privées qui permet d’identifier les cas d’échec (résultats erronés ou ralentissements pathologiques) et d’ajuster les variantes de kernels. Le modèle de crowdsourcing compense l’impossibilité de couvrir exhaustivement tous les GPU, OS et navigateurs depuis un laboratoire fixe.
Performances et limites observées
Une comparaison directe a été réalisée contre ORT WebGPU (ONNX Runtime) sur un GPU Apple M4, en utilisant la version de développement 1.30.0‑dev.20260826‑b1f76d586a. Sur les 1 756 cas de test initiaux, 809 ont produit des sorties concordantes et ont été retenus pour l’évaluation de performance. Les kernels de Hugging Face ont montré des gains de latence allant jusqu’à 3‑5× sur les opérations de multiplication matricielle et d’attention, tout en conservant une précision numérique équivalente. Cependant, le coût de round‑trip JavaScript‑GPU demeure dominant pour les kernels très petits (exemple : addition de six flottants), ce qui explique pourquoi les benchmarks se concentrent sur des charges de travail significatives.
En pratique, la portabilité offerte par WebGPU ne garantit pas automatiquement l’efficacité : les tailles de work‑group, les schémas d’accès mémoire et la vectorisation restent dépendants du matériel. La modularité versionnée de chaque kernel permet de publier rapidement de nouvelles variantes sans rompre le contrat JavaScript, mais elle implique également une responsabilité accrue de suivi des compatibilités entre versions de manifestes et de drivers GPU.