Spaces:
Sleeping
Sleeping
functionNormally commited on
Commit ·
1d6e1d9
1
Parent(s): 41341d0
Forcer le CPU sur les chemins non decores @spaces.GPU
Browse filesSur 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().
- backbone_utils.py +4 -1
- predict_utils.py +7 -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 |
-
|
|
|
|
|
|
|
|
|
|
| 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,
|
| 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 |
-
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
| 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))
|