Spaces:
Sleeping
Sleeping
Commit History
-
Recalibrer les durees GPU statiques restantes (extraction, evaluation, prediction)
functionNormallyVu en prod : un simple clic sur "Evaluer" a ete rejete avec "quota exceeded (180s requested vs. 111s left)" alors que le calcul reel ne prend que quelques secondes. La deduction du quota ZeroGPU se fait sur le temps reel consomme, mais l'admission (le controle qui autorise ou non le demarrage de l'appel) compare la duree DECLAREE au solde restant -- une duree statique surestimee bloque donc des actions triviales des que le quota du visiteur devient bas, meme si le travail reel tiendrait largement dedans. extract_features (mesure <10s sur 352 images), evaluate (une passe sur 53 images, modele plus leger que le backbone), predict et random_test (une seule image) passent de 60/120/60/60s a 30/30/20/20s.c57b8a9 -
Revenir a ZeroGPU pour toutes les fonctions : le mode hybride plante
functionNormallyTentative de garder seulement train_cnn_callback sur @spaces.GPU et de forcer torch.device("cpu") ailleurs (MLP, evaluation, prediction, extraction de features) pour eviter de toucher au quota GPU sur ces chemins. Ca plante en production : import spaces monkey-patche torch pour que torch.cuda.is_available() reponde True partout (meme hors decorateur), et un chemin bas niveau echappe a cette emulation des que du vrai calcul (construction de modele, forward/backward) est declenche hors du decorateur -> "CUDA error: no CUDA-capable device is detected" malgre device=cpu explicite. L'exception est avalee par le try/except du callback donc pas moyen d'avoir la trace complete sans instrumenter davantage, ce qui ne vaut pas le detour pour un contournement qui reste fragile de toute facon. Retour a la configuration deja validee : les six fonctions (MLP, CNN, extraction de features, evaluation, prediction, test aleatoire) sont a nouveau decorees @spaces.GPU, avec les durees dynamiques calibrees…7a0bb55 -
Forcer le CPU sur les chemins non decores @spaces.GPU
functionNormallySur du materiel ZeroGPU, torch.cuda.is_available() repond True meme en dehors d'un decorateur @spaces.GPU (mode emulation, pour que .to('cuda') au chargement des modules ne plante pas), mais aucun GPU reel n'est alloue hors de ce decorateur. train_mlp plantait donc en production avec "Low-level CUDA init reached" des que get_runtime_device() detectait "cuda" a tort. Meme risque sur tous les autres chemins non decores : evaluate_callback, predict_callback, random_test_callback, extract_features_callback. Ces cinq chemins forcent maintenant explicitement torch.device("cpu") au lieu de faire confiance a la detection automatique. train_cnn (seul chemin reellement decore @spaces.GPU) garde get_runtime_device().1d6e1d9 -
Modele hybride : CNN sur ZeroGPU, reste du Space sur CPU
functionNormallyMesures reelles sur CPU basic apres le dernier commit : MLP par defaut 252s (vs 66.6s GPU, x3.8, tolerable), extraction ResNet18 sur 352 images <10s (inference pure, negligeable), mais CNN par defaut 601s / 10min (vs 65.3s GPU, x9.2) -- une convolution entrainee sur plusieurs epoques ne beneficie pas du meme overhead fixe qui masquait le cout GPU des autres etapes, contrairement a l'hypothese du commit precedent. Sur un Space materiel ZeroGPU, seules les fonctions decorees @spaces.GPU empruntent un vrai GPU (et consomment le quota du visiteur) ; le reste tourne sur le CPU du conteneur sans toucher au quota. Seul train_cnn_callback reprend son decorateur et sa duree dynamique calibree ; MLP, extraction de features, evaluation, prediction et test restent non decores (CPU, quota zero). Le changement de materiel du Space (CPU basic -> ZeroGPU) se fait cote Settings HF, pas dans ce commit.41341d0 -
Retirer ZeroGPU : le Space passe en CPU
functionNormallyLe quota GPU journalier par visiteur (2 a 5 min selon le compte) restait un probleme structurel pour l'usage en classe, meme apres avoir calibre les durees demandees sur des mesures reelles. Les mesures elles-memes montraient que le temps d'entrainement sur ce jeu de donnees minuscule est domine par un overhead fixe (chargement, tiny batches) plutot que par le calcul GPU : multiplier les parametres du CNN par ~128x n'avait fait varier le temps par epoque que de ~40%. Le CPU ne devrait donc pas etre dramatiquement plus lent, et supprime completement le systeme de quota par utilisateur. Suppression des decorateurs @spaces.GPU et des fonctions de duree dynamique associees (devenues inutiles), et de la dependance spaces. Le changement de materiel du Space (ZeroGPU -> CPU basic) se fait cote Settings HF, pas dans ce commit.52205a2
-
Calibrer les durees ZeroGPU sur des mesures reelles et exposer le telechargement des modeles
functionNormallyLe duration= des decorateurs @spaces.GPU etait un plafond fixe (300s) quel que soit l'entrainement demande, alors que ZeroGPU reserve la duree declaree (pas le temps reellement mesure) sur le quota journalier de la personne qui clique, pas sur celui du proprietaire du Space. Pour un compte gratuit (300s/jour), un seul entrainement MLP ou CNN epuisait donc tout le quota du jour. MLP et CNN utilisent maintenant une duree dynamique calibree sur des mesures reelles (66.6s / 140.8s pour le MLP, 65.3s / 153.9s pour le CNN selon les hyperparametres), plafonnee a 180s pour rester nettement sous le quota journalier gratuit. Les curseurs d'architecture les plus extremes (hidden_dim=1024, 5 couches/blocs, filtres=128) sont retires de l'UI : les mesures montrent que le nombre de parametres surestime tres largement le cout reel sur ce jeu de donnees minuscule, dont le temps est domine par un overhead fixe plutot que par les FLOPs du modele. Ajout d'un composant de telechargement (poids .pt ou pip…72ef639
-
Isoler le stockage des modeles par session et corriger le role de la CV
functionNormallyChaque session de navigateur (session_hash Gradio) a maintenant son propre sous-repertoire dans saved_models/ et saved_models_meta/, pour qu'un(e) etudiant(e) ne voie plus les modeles entraines par un(e) autre sur le meme Space partage. Pour les classifieurs ML classiques, la validation croisee effectue desormais une vraie recherche par grille (GridSearchCV) sur l'hyperparametre expose dans l'UI au lieu de se contenter de noter la valeur choisie a la main : elle selectionne le meilleur candidat, et c'est ce modele-la qui est sauvegarde et evalue.c72538b
-
Ajouter MLP baseline, courbes de perte, CV et backbone ImageNet brut
functionNormallySuite aux retours de Marco sur la conception du QCM : - Tab MLP (baseline) avant le CNN pour montrer que le surapprentissage persiste quel que soit le choix d'hyperparametres (nombre de couches, neurones par couche), motivant le passage au CNN - Courbes de perte train/validation par epoque (MLP et CNN) - Backbone ResNet18 remplace par les poids ImageNet d'origine, sans fine-tuning sur le dataset (retire la dependance a HF_BACKBONE_REPO) - Chaque algorithme classique (SVM, LogReg, k-NN, RF) n'expose plus qu'un seul hyperparametre ; LDA retire - Option de validation croisee (CV stratifiee, fallback si classe trop petite) affichant score CV et score test cote a cotee7db87b
-
Restructurer le parcours pédagogique : CNN de zéro puis backbone + ML classique
functionNormallyc7f3e02
-
Persister les features sur disque /tmp pour partage entre workers Gradio
functionNormally27c7e24 -
Ajouter @spaces.GPU à extract_features_callback (ZeroGPU)
functionNormally8e71d97 -
Utiliser CircleStar/charcoal-resnet18-backbone comme dépôt backbone par défaut
functionNormallyddfedb8 -
Corriger caractère invalide U+00B7 dans data_utils.py ligne 27
functionNormally9234471 -
Restructurer l'app : backbone préentraîné + ML classique + FC head + CNN de zéro
functionNormally- Ajout backbone_utils.py : chargement du backbone ResNet18 depuis HF, extraction de features 512-dim avec cache mémoire - Ajout classical_ml_utils.py : SVM / LogReg / k-NN / RF / LDA sur les features extraites (pipeline sklearn avec StandardScaler + joblib) - Refactorisation train_utils.py : train_fc_head (tête FC seule, ~200Ko sauvegardés) et train_cnn (SimpleCNN de zéro) ; evaluate_saved_model unifié pour tous les types - Mise à jour model.py : BackboneWithFC (backbone gelé + tête FC) + SimpleCNN conservé - Mise à jour predict_utils.py : dispatch automatique selon model_type - Mise à jour app.py : 4 onglets (dataset / ML classique / neuronaux / test-prédiction) - Ajout config.py : HF_BACKBONE_REPO, CLASSICAL_MODEL_TYPES - Ajout .gitignore : exclut data/, backbone/, saved_models/, __pycache__/ - Ajout finetune_backbone.py : script local pour entraîner le backbone sur les donnéescdc317a
-
Restaurer les paramètres CNN qui fonctionnaient + epoch max à 50
functionNormally- data_utils.py : augmentation revenue à Resize + flip + rotation 5° - train_utils.py : batch_size par défaut 16 (était 32) - app.py : dropout 0.4, batch 16, epochs max 5015c5bd9 -
Ajouter ResNet18 (layer4 + classifieur) comme option de modèle
functionNormally- model.py : classe ResNet18Classifier restaurée (layer4 + tête FC) - train_utils.py : paramètre model_type, instanciation et config selon le choix - app.py : radio CNN simple / ResNet18, panneau CNN masquable, lr ajusté automatiquement selon le modèle sélectionné5a128ba -
Remplacer RandomResizedCrop par Resize fixe pour images microscopiques
functionNormallyL'échelle des textures est discriminante en microscopie — un crop aléatoire détruit cette information et empêche la convergence sur petit dataset. Rotation réduite à 15°, ColorJitter conservé.733cbb8 -
Merge branch 'main' of https://huggingface.co/spaces/CircleStar/Image_Classification
functionNormallyb67cff0 -
Augmentation renforcée, scheduler LR et dropout par défaut 0.5
functionNormally- data_utils.py : RandomResizedCrop, rotation 30°, ColorJitter - train_utils.py : ReduceLROnPlateau (factor=0.5, patience=8, min_lr=lr×0.2), affichage du lr courant dans les logs - app.py : dropout par défaut 0.540062d1 -
Update app.py
ef7bb2d -
Update app.py
b6c6e38 -
Remplacer ResNet18 par un CNN simple configurable
functionNormally- model.py : nouvelle classe SimpleCNN (blocs Conv→BN→ReLU→MaxPool, pooling global adaptatif, classifieur FC) - train_utils.py : paramètres num_conv_blocks, base_filters, kernel_size, use_batchnorm ; lr par défaut 0.001, batch 32 - app.py : interface mise à jour avec les nouveaux contrôles CNNd1c85fc
-
Update data_utils.py
c9b3cf0 -
Update train_utils.py
6d3948c -
Update app.py
6c9f7c0 -
Update train_utils.py
ff5c769 -
Update data_utils.py
8aae570 -
Update model.py
033fb72 -
Update metrics_utils.py
c7bf23c -
Update metrics_utils.py
191923b -
Update metrics_utils.py
1eabf78 -
Update requirements.txt
e588f19 -
Update app.py
6cababb -
Update predict_utils.py
c722f9c -
Update train_utils.py
61d4684 -
Create metrics_utils.py
ac44c2a -
Update model.py
7fcff1a -
Update data_utils.py
be4dde9 -
Update config.py
ab13e5c -
Update config.py
a1909f8 -
Update requirements.txt
230bcc7 -
Update data_utils.py
5972698 -
Update config.py
91fadd5 -
Update model.py
b9a0c51 -
Update config.py
ef1898f -
Update app.py
1649120 -
Create predict_utils.py
a616e56 -
Create train_utils.py
26bc3cb -
Create data_utils.py
b834807 -
Create model.py
61ce884