Spaces:
Sleeping
Sleeping
functionNormally commited on
Commit ·
c57b8a9
1
Parent(s): 7a0bb55
Recalibrer les durees GPU statiques restantes (extraction, evaluation, prediction)
Browse filesVu 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.
app.py
CHANGED
|
@@ -168,7 +168,9 @@ def train_cnn_callback(
|
|
| 168 |
# Tab 4 — Backbone + ML classique
|
| 169 |
# ---------------------------------------------------------------------------
|
| 170 |
|
| 171 |
-
|
|
|
|
|
|
|
| 172 |
def extract_features_callback():
|
| 173 |
try:
|
| 174 |
_, class_names, counts = extract_all_features()
|
|
@@ -261,7 +263,11 @@ def download_model_callback(model_name, request: gr.Request):
|
|
| 261 |
return None
|
| 262 |
|
| 263 |
|
| 264 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 265 |
def evaluate_callback(model_name, request: gr.Request):
|
| 266 |
try:
|
| 267 |
summary, report_df, cm_df, cm_path = evaluate_saved_model(model_name, request.session_hash)
|
|
@@ -270,7 +276,8 @@ def evaluate_callback(model_name, request: gr.Request):
|
|
| 270 |
return {"Erreur": str(e)}, None, None, None
|
| 271 |
|
| 272 |
|
| 273 |
-
|
|
|
|
| 274 |
def predict_callback(model_name, image, request: gr.Request):
|
| 275 |
try:
|
| 276 |
return predict_uploaded_image(model_name, image, request.session_hash)
|
|
@@ -278,7 +285,8 @@ def predict_callback(model_name, image, request: gr.Request):
|
|
| 278 |
return f"Échec :\n{e}", None
|
| 279 |
|
| 280 |
|
| 281 |
-
|
|
|
|
| 282 |
def random_test_callback(model_name, request: gr.Request):
|
| 283 |
try:
|
| 284 |
return test_random_sample(model_name, request.session_hash)
|
|
|
|
| 168 |
# Tab 4 — Backbone + ML classique
|
| 169 |
# ---------------------------------------------------------------------------
|
| 170 |
|
| 171 |
+
# Mesuré : 352 images -> <10s. 30s laisse une marge x3 sans bloquer
|
| 172 |
+
# l'admission ZeroGPU quand il ne reste que peu de quota au visiteur.
|
| 173 |
+
@spaces.GPU(duration=30)
|
| 174 |
def extract_features_callback():
|
| 175 |
try:
|
| 176 |
_, class_names, counts = extract_all_features()
|
|
|
|
| 263 |
return None
|
| 264 |
|
| 265 |
|
| 266 |
+
# Une seule passe forward sur le jeu de test (53 images) sur un modèle bien
|
| 267 |
+
# plus léger que le backbone ResNet18 (mesuré <10s sur 352 images) : quelques
|
| 268 |
+
# secondes réelles. 30s de marge, pas 120s, pour ne pas bloquer l'admission
|
| 269 |
+
# ZeroGPU quand il reste peu de quota au visiteur.
|
| 270 |
+
@spaces.GPU(duration=30)
|
| 271 |
def evaluate_callback(model_name, request: gr.Request):
|
| 272 |
try:
|
| 273 |
summary, report_df, cm_df, cm_path = evaluate_saved_model(model_name, request.session_hash)
|
|
|
|
| 276 |
return {"Erreur": str(e)}, None, None, None
|
| 277 |
|
| 278 |
|
| 279 |
+
# Une seule image, inférence pure. 20s de marge (chargement du modèle inclus).
|
| 280 |
+
@spaces.GPU(duration=20)
|
| 281 |
def predict_callback(model_name, image, request: gr.Request):
|
| 282 |
try:
|
| 283 |
return predict_uploaded_image(model_name, image, request.session_hash)
|
|
|
|
| 285 |
return f"Échec :\n{e}", None
|
| 286 |
|
| 287 |
|
| 288 |
+
# Une seule image, inférence pure. 20s de marge (chargement du modèle inclus).
|
| 289 |
+
@spaces.GPU(duration=20)
|
| 290 |
def random_test_callback(model_name, request: gr.Request):
|
| 291 |
try:
|
| 292 |
return test_random_sample(model_name, request.session_hash)
|