La plupart des démos « du ML dans le navigateur » sont une interface mince devant une API : votre CSV part quelque part, un serveur fait le travail, et vous faites confiance à ce qui revient. LabML fait le pari inverse : une plateforme de machine learning complète - audit des données, entraînement, évaluation, explication, réutilisation de modèles - où chaque calcul s’exécute sur votre propre machine. Pas de backend, pas de compte, pas d’upload. Ouvrez l’onglet Réseau pendant qu’elle entraîne huit modèles : rien ne sort.
Elle est en ligne sur app.dominicdapice.com, installable en PWA hors-ligne, bilingue (FR/EN), et organisée en trois sections.
Le ML Lab - /ml
La boucle centrale : déposez un CSV (ou un fichier Excel, ou choisissez une démo comme titanic), désignez la colonne à prédire, et le labo profile chaque colonne, détecte la tâche (binaire, multi-classes, régression), écarte identifiants et constantes, signale les fuites de cible, puis entraîne un zoo de modèles dans un Web Worker : baseline naïve, régression linéaire/logistique, k-NN, Naive Bayes gaussien, arbre de décision, forêt aléatoire - plus un gradient boosting histogramme écrit à la main (bins de quantiles façon LightGBM, gains du second ordre, feuilles de Newton) et un MLP maison (init He seedée, Adam full-batch).
Plutôt que de le décrire, voici la boucle complète qui tourne, sans montage :
Trente-sept secondes, sans coupe : titanic.csv déposé, survived choisi, la colonne alive repérée comme fuite de cible et exclue toute seule, huit familles de modèles plus un ensemble entraînés dans le navigateur, puis le leaderboard, l’analyse par segments et les explications. Rien n’est téléversé — ouvrez l’onglet Réseau et regardez-le rester muet.
Le leaderboard n’est que le début. Ce que je voulais vraiment construire, c’est la partie que les démos sautent : l’évaluation honnête.
- Chaque run est mesuré contre une baseline naïve sur un jeu de test mis de côté (split seedé et stratifié - le même seed reproduit exactement le même run).
- Chaque métrique du leaderboard porte un intervalle bootstrap à 95 % (1 000 rééchantillonnages seedés, partagés entre modèles pour des comparaisons appariées), avec un verdict qui dit si l’avance du gagnant est « probablement réelle » ou « peut-être du bruit ».
- Une analyse par segments répond à « où mon modèle échoue-t-il ? » en re-mesurant le jeu de test sur chaque tranche catégorielle - y compris les colonnes exclues de l’entraînement, là où se cachent les effets de proxy. Sur titanic, elle pointe directement le pont C et les passagers de Cherbourg.
- Sur données déséquilibrées, courbe précision-rappel, courbe de calibration et seuil de décision chiffré par une matrice de coûts montrent ce que l’accuracy cache - une probabilité n’est pas une décision ; le seuil appartient à vos coûts.
Les outils de compréhension complètent le tableau : importance par permutation, dépendance partielle, prédictions what-if en direct avec explications de Shapley exactes (les barres somment à prédiction moins baseline), et une lecture en langage clair générée par règles - aucun LLM.
Le labo ferme aussi les boucles d’un vrai workflow : scorer un nouveau lot avec une comparaison honnête test vs lot, comparer deux runs côte à côte (« mon nettoyage a-t-il servi ? » - avec verdicts d’incertitude croisés), recherche d’hyperparamètres par random search seedée en validation croisée propre, et exporter un modèle en JSON puis le réimporter plus tard - LabML reconstruit le prédicteur exact (prédictions identiques à l’octet près) et score n’importe quel CSV sans réentraîner. Pas de colonne cible ? Un mode exploration k-means + ACP seedé décrit les groupes qu’il trouve ; une colonne de dates déverrouille des prévisions Holt-Winters validées par backtest à origine glissante. Les runs persistent localement (IndexedDB) avec tous leurs artefacts, et un dataset peut être conservé sur consentement, sous un budget explicite de 50 Mo.
Trois vagues ultérieures l’ont poussé au-delà de l’échelle démo. Les colonnes de texte libre ne sont plus sautées : elles entrent dans le pipeline via un TF-IDF bilingue écrit à la main, ajusté sur le seul split d’entraînement, et les explications parlent en mots - sur le fichier démo d’avis clients, fast et excellent poussent la prédiction vers le haut, refund la tire vers le bas. L’échelle a été mesurée avant d’être construite : un fichier d’un million de lignes entraîne tout le zoo en environ 130 secondes, et au-delà de 100 000 lignes utilisables un échantillon seedé et stratifié prend le relais - annoncé sur le leaderboard, jamais silencieux, chaque modèle plafonné restant mesuré sur le même jeu de test complet. Et une courbe d’apprentissage répond à la question budgétaire classique - « est-ce que plus de données aideraient ce modèle ? » - en le réentraînant sur des fractions seedées croissantes du split d’entraînement, avec bande de confiance et verdict en clair : la courbe grimpe encore, ou elle a plafonné - travaillez plutôt les variables.
Le Data Studio - /data
Les vrais jeux de données sont sales, alors le labo a son atelier de réparation. Le Data Studio audite un fichier sans l’uploader - cellules manquantes, doublons, variantes de casse et d’espaces, valeurs aberrantes (clôtures de Tukey), colonnes constantes ou identifiantes, le tout résumé en un score déterministe sur 100 - et le répare via une recette de nettoyage rejouable : trim, fusion de variantes, dédoublonnage, imputation, écrêtage, types forcés, dérivation de dates, et suppression des anomalies multivariées détectées par un isolation forest maison seedé. La recette s’exporte en JSON et se rejoue sur le fichier du mois prochain.
Il couvre aussi les deux gestes quotidiens que la plupart des outils sautent : la jointure gauche d’un second fichier sur une clé commune (taux de correspondance, doublons et orphelines sont nommés, jamais silencieux) et un contrôle de dérive qui compare un nouveau lot à la référence - diff de schéma, PSI par colonne, catégories nouvelles et disparues, verdict de sévérité. Un clic passe le résultat nettoyé au ML Lab.
Le studio embarque désormais un vrai moteur analytique : du SQL dans le navigateur, via DuckDB compilé en WebAssembly - jointures, fonctions de fenêtrage, agrégations sur le fichier que vous venez de déposer, plus tout CSV, Parquet ou JSON attaché dans la même session, chacun exposé comme une vue nommée d’après le fichier. Le fichier est interrogé tel que déposé, avant la recette de nettoyage, pour que chaque résultat reste traçable vers un fichier qu’on peut rouvrir ; un résultat s’exporte en CSV ou passe au ML Lab en un clic, et les erreurs SQL affichent le message de DuckDB lui-même, qui nomme la ligne et le symbole fautifs. Aucun serveur : le moteur lui-même est auto-hébergé et tourne dans l’onglet.
GROUP BY, calculé par DuckDB dans l'onglet. Le fichier est interrogé tel que déposé, avant la recette : c'est pourquoi les deux orthographes de Latte y sont encore, et pourquoi la moyenne de l'une d'elles porte la valeur aberrante que le studio a signalée.Le terrain de jeu IA - /ai
Deux expériences d’IA sur l’appareil, mêmes règles de confidentialité :
- Vision : analyse d’images locale via ONNX Runtime Web (WebAssembly) - déposez une photo ou utilisez la webcam et trois réseaux auto-hébergés la lisent : un classificateur EfficientNet-Lite4 nomme le sujet principal (1 000 classes ImageNet, 77,6 % top-1), YOLOX-Nano dessine des boîtes autour des objets qu’il trouve (80 classes du quotidien) et UltraFace localise les visages - « 1 visage détecté », compté en clair. Le calcul des boîtes (décodage de grilles, IoU, suppression non maximale) est écrit à la main et testé, et l’interface dit toujours honnêtement ce que les modèles ne peuvent pas savoir : la détection dit où, pas qui.
- Assistant de données : posez des questions en français ou en anglais sur votre dataset chargé - moyennes, comptages sous condition, top N, corrélations. Un interpréteur local déterministe lit chaque question en premier : il ne peut nommer qu’une colonne qui existe et une valeur qui s’y trouve vraiment, et quand il ne comprend pas, il le dit au lieu de deviner. Sur consentement explicite, un vrai modèle de langue - Qwen3-0.6B, 355 Mo, Apache-2.0, auto-hébergé, exécuté localement sur WebGPU - prend le relais pour les formulations que l’interpréteur abandonne. Il ne calcule jamais : il traduit seulement la question vers une grammaire de requêtes fermée, le moteur déterministe produit chaque chiffre, et un badge sous chaque réponse nomme le moteur qui a fait la lecture. Mesuré sur six questions de référence sur titanic, le duo en réussit maintenant cinq - et le sixième échec est consigné au plan comme une limite d’un modèle de 0,6 milliard de paramètres, pas maquillé.
Sous le capot
La contrainte d’ingénierie qui a tout façonné : si ça calcule, c’est écrit à la main et c’est déterministe. Gradient boosting, MLP, k-means++, ACP par itération de puissance, Holt-Winters, isolation forest, PSI, valeurs de Shapley, intervalles bootstrap, courbes PR/ROC et de calibration, décodage des boîtes de détection (grilles, IoU, suppression non maximale) - tout est implémenté from scratch en TypeScript, seedé de bout en bout, et testé unitairement contre des résultats connus. Tout ce qui est lourd tourne dans des Web Workers derrière des protocoles de messages typés : l’interface ne bloque jamais.
Certaines contraintes sont venues de l’hébergeur, pas des maths. La cible de déploiement refuse tout fichier de plus de 25 Mio - alors le modèle de langue de 355 Mo est récupéré au moment du déploiement et découpé en morceaux de 24 Mio que le navigateur recolle, chaque morceau vérifié contre des tailles d’octets épinglées (un écart fait échouer le build, jamais le visiteur), et DuckDB est épinglé à la dernière version dont le WebAssembly passe encore sous la limite. Mesuré, et consigné au plan, pour que la prochaine mise à niveau re-mesure au lieu de redécouvrir.
La barre de qualité est tenue en CI : 352 tests unitaires, 61 tests bout-en-bout
Playwright (dont un test PWA hors-ligne, un test webcam factice et des vérifications
d’accessibilité WCAG par axe-core), TypeScript strict et budgets Lighthouse - la page
/ml atteint ≈ 0,99 sur mobile en throttling réel grâce à des coquilles statiques
prérendues qui peignent avant l’arrivée du JavaScript.
Et la promesse de confidentialité est architecturale, pas déclarative : une Content-Security-Policy stricte n’autorise aucun appel tiers, les liens de partage portent les métriques dans le fragment d’URL (que les navigateurs n’envoient jamais aux serveurs), et toute l’application - démos et modèles de vision compris - continue de fonctionner câble réseau débranché. Une page /privacy dédiée va un cran plus loin et tend au lecteur un protocole DevTools en quatre étapes pour tout vérifier sans croire un mot de la promesse - et la politique qu’elle cite est épinglée à l’en-tête réellement servi par un test unitaire : la page ne peut pas revendiquer une protection que le site aurait abandonnée en silence.
Essayez : app.dominicdapice.com - chargez la démo titanic, entraînez, et faites défiler : le leaderboard, les intervalles, l’analyse par segments et les outils de seuil racontent l’histoire honnête d’un modèle en une trentaine de secondes.
Code source : github.com/dapiced/LabML
Comments
Sign in with your GitHub account to leave a comment or a reaction.