functionNormally commited on
Commit
1d6e1d9
·
1 Parent(s): 41341d0

Forcer le CPU sur les chemins non decores @spaces.GPU

Browse files

Sur 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().

Files changed (3) hide show
  1. backbone_utils.py +4 -1
  2. predict_utils.py +7 -3
  3. train_utils.py +9 -2
backbone_utils.py CHANGED
@@ -37,7 +37,10 @@ def extract_all_features(batch_size: int = 64):
37
 
38
  from data_utils import prepare_splits, get_class_names, HFDatasetWrapper, get_eval_transform
39
 
40
- device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
 
 
 
41
  backbone = load_backbone(device)
42
  backbone.eval()
43
 
 
37
 
38
  from data_utils import prepare_splits, get_class_names, HFDatasetWrapper, get_eval_transform
39
 
40
+ # extract_features_callback n'est pas décoré @spaces.GPU : forcer le CPU.
41
+ # Sur du matériel ZeroGPU, torch.cuda.is_available() répond True même
42
+ # hors décorateur (mode émulation), mais aucun GPU réel n'est alloué ici.
43
+ device = torch.device("cpu")
44
  backbone = load_backbone(device)
45
  backbone.eval()
46
 
predict_utils.py CHANGED
@@ -6,7 +6,7 @@ from PIL import Image
6
 
7
  from config import CLASSICAL_MODEL_TYPES
8
  from data_utils import get_eval_transform, prepare_splits, get_class_names
9
- from train_utils import load_model, get_runtime_device, _load_meta
10
 
11
 
12
  def _extract_feature(image: Image.Image, device: torch.device) -> np.ndarray:
@@ -28,7 +28,9 @@ def predict_uploaded_image(model_name: str, image: Image.Image, session_id: str)
28
  meta = _load_meta(model_name, session_id)
29
  model_type = meta["config"].get("model_type", "cnn")
30
  class_names = meta["config"]["class_names"]
31
- device = get_runtime_device()
 
 
32
 
33
  if model_type in CLASSICAL_MODEL_TYPES:
34
  from classical_ml_utils import load_classical_pipeline
@@ -62,7 +64,9 @@ def test_random_sample(model_name: str, session_id: str):
62
  meta = _load_meta(model_name, session_id)
63
  model_type = meta["config"].get("model_type", "cnn")
64
  class_names = get_class_names()
65
- device = get_runtime_device()
 
 
66
 
67
  splits = prepare_splits()
68
  test_dataset = splits["test"]
 
6
 
7
  from config import CLASSICAL_MODEL_TYPES
8
  from data_utils import get_eval_transform, prepare_splits, get_class_names
9
+ from train_utils import load_model, _load_meta
10
 
11
 
12
  def _extract_feature(image: Image.Image, device: torch.device) -> np.ndarray:
 
28
  meta = _load_meta(model_name, session_id)
29
  model_type = meta["config"].get("model_type", "cnn")
30
  class_names = meta["config"]["class_names"]
31
+ # predict_callback n'est pas décoré @spaces.GPU : forcer le CPU (voir
32
+ # le commentaire dans train_mlp, train_utils.py).
33
+ device = torch.device("cpu")
34
 
35
  if model_type in CLASSICAL_MODEL_TYPES:
36
  from classical_ml_utils import load_classical_pipeline
 
64
  meta = _load_meta(model_name, session_id)
65
  model_type = meta["config"].get("model_type", "cnn")
66
  class_names = get_class_names()
67
+ # random_test_callback n'est pas décoré @spaces.GPU : forcer le CPU (voir
68
+ # le commentaire dans train_mlp, train_utils.py).
69
+ device = torch.device("cpu")
70
 
71
  splits = prepare_splits()
72
  test_dataset = splits["test"]
train_utils.py CHANGED
@@ -451,7 +451,12 @@ def train_mlp(
451
  epochs: int = 30,
452
  model_tag: str = "",
453
  ):
454
- device = get_runtime_device()
 
 
 
 
 
455
  train_loader, val_loader, test_loader, class_names = make_loaders(batch_size)
456
  num_classes = len(class_names)
457
  input_size = 3 * IMAGE_SIZE * IMAGE_SIZE
@@ -568,7 +573,9 @@ def evaluate_saved_model(model_name: str, session_id: str):
568
 
569
 
570
  def _evaluate_neural(model_name: str, meta: dict, session_id: str):
571
- device = get_runtime_device()
 
 
572
  model, meta = load_model(model_name, device, session_id)
573
 
574
  batch_size = int(meta["config"].get("batch_size", 16))
 
451
  epochs: int = 30,
452
  model_tag: str = "",
453
  ):
454
+ # Pas de @spaces.GPU sur ce chemin (voir train_cnn_callback) : sur du
455
+ # matériel ZeroGPU, torch.cuda.is_available() répond True même hors
456
+ # décorateur (mode émulation), mais aucun GPU réel n'est alloué ici —
457
+ # utiliser get_runtime_device() planterait avec "Low-level CUDA init
458
+ # reached". On force donc le CPU explicitement.
459
+ device = torch.device("cpu")
460
  train_loader, val_loader, test_loader, class_names = make_loaders(batch_size)
461
  num_classes = len(class_names)
462
  input_size = 3 * IMAGE_SIZE * IMAGE_SIZE
 
573
 
574
 
575
  def _evaluate_neural(model_name: str, meta: dict, session_id: str):
576
+ # evaluate_callback n'est pas décoré @spaces.GPU : forcer le CPU (voir
577
+ # le commentaire dans train_mlp).
578
+ device = torch.device("cpu")
579
  model, meta = load_model(model_name, device, session_id)
580
 
581
  batch_size = int(meta["config"].get("batch_size", 16))