functionNormally commited on
Commit
c57b8a9
·
1 Parent(s): 7a0bb55

Recalibrer les durees GPU statiques restantes (extraction, evaluation, prediction)

Browse files

Vu 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.

Files changed (1) hide show
  1. app.py +12 -4
app.py CHANGED
@@ -168,7 +168,9 @@ def train_cnn_callback(
168
  # Tab 4 — Backbone + ML classique
169
  # ---------------------------------------------------------------------------
170
 
171
- @spaces.GPU(duration=60)
 
 
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
- @spaces.GPU(duration=120)
 
 
 
 
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
- @spaces.GPU(duration=60)
 
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
- @spaces.GPU(duration=60)
 
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)