Search commited on
Commit
a367cb2
·
1 Parent(s): 3505a30

fix: conditional GPU decorator + 2h CPU timeout for overnight runs

Browse files
Files changed (1) hide show
  1. app.py +14 -2
app.py CHANGED
@@ -239,7 +239,18 @@ def _run_inprocess_cached(
239
  }
240
 
241
 
242
- @spaces.GPU(duration=600) # до 10 минут GPU на один вызов
 
 
 
 
 
 
 
 
 
 
 
243
  def run_experiment(request_json: str) -> str:
244
  """
245
  Запускает эксперимент на GPU. Принимает и возвращает JSON строки.
@@ -259,7 +270,8 @@ def run_experiment(request_json: str) -> str:
259
  script = req.get("script", "")
260
  args = dict(req.get("args", {}))
261
  model = req.get("model", "Qwen/Qwen3.5-4B")
262
- timeout = min(req.get("timeout", 580), 580) # ZeroGPU duration=600, keep margin
 
263
  args.setdefault("device", _default_device())
264
  os.environ.setdefault("ATTN_IMPL", "sdpa") # save VRAM on ZeroGPU
265
 
 
239
  }
240
 
241
 
242
+ def _gpu_decorator(fn):
243
+ """Apply @spaces.GPU only when ZeroGPU is available."""
244
+ try:
245
+ import torch
246
+ if torch.cuda.is_available() or os.environ.get("SPACES_ZERO_GPU"):
247
+ return spaces.GPU(duration=600)(fn)
248
+ except Exception:
249
+ pass
250
+ return fn
251
+
252
+
253
+ @_gpu_decorator
254
  def run_experiment(request_json: str) -> str:
255
  """
256
  Запускает эксперимент на GPU. Принимает и возвращает JSON строки.
 
270
  script = req.get("script", "")
271
  args = dict(req.get("args", {}))
272
  model = req.get("model", "Qwen/Qwen3.5-4B")
273
+ max_timeout = 580 if os.environ.get("SPACES_ZERO_GPU") else 7200 # 580s GPU, 2h CPU
274
+ timeout = min(req.get("timeout", max_timeout), max_timeout)
275
  args.setdefault("device", _default_device())
276
  os.environ.setdefault("ATTN_IMPL", "sdpa") # save VRAM on ZeroGPU
277