Combine image+video into single GPU session to fix ZeroGPU token expiry
Browse files
app.py
CHANGED
|
@@ -39,34 +39,34 @@ INPUT_DIR.mkdir(exist_ok=True)
|
|
| 39 |
# GPU-accelerated steps (decorated only on Spaces)
|
| 40 |
# ---------------------------------------------------------------------------
|
| 41 |
|
| 42 |
-
def
|
| 43 |
-
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
if IS_SPACES:
|
| 45 |
from src.image_generator_hf import run as gen_images
|
| 46 |
else:
|
| 47 |
from src.image_generator_api import run as gen_images
|
| 48 |
-
gen_images(run_dir, style_name=style_name
|
| 49 |
-
# Free VRAM for the video model
|
| 50 |
torch.cuda.empty_cache()
|
| 51 |
|
| 52 |
-
|
| 53 |
-
def _generate_videos(run_dir, progress_callback=None):
|
| 54 |
-
"""Load Wan 2.1 pipeline, generate all video clips, then unload."""
|
| 55 |
if IS_SPACES:
|
| 56 |
from src.video_generator_hf import run as gen_videos
|
| 57 |
-
gen_videos(run_dir
|
| 58 |
-
# Unload Wan 2.1 to free VRAM
|
| 59 |
from src.video_generator_hf import unload
|
| 60 |
unload()
|
| 61 |
else:
|
| 62 |
from src.video_generator_api import run as gen_videos
|
| 63 |
-
gen_videos(run_dir
|
| 64 |
|
| 65 |
|
| 66 |
# Apply @spaces.GPU decorator on Spaces
|
| 67 |
if IS_SPACES:
|
| 68 |
-
|
| 69 |
-
_generate_videos = spaces.GPU(duration=3600)(_generate_videos) # up to 1h for ~12 clips
|
| 70 |
|
| 71 |
|
| 72 |
# ---------------------------------------------------------------------------
|
|
@@ -323,15 +323,10 @@ def generate(audio_file: str, style_name: str, cover_art: str | None,
|
|
| 323 |
image_prompt_guidance=style.get("image_prompt_guidance", ""),
|
| 324 |
quality_suffix=style.get("quality_suffix", ""))
|
| 325 |
|
| 326 |
-
# ---
|
| 327 |
-
if step_num <= 6:
|
| 328 |
-
progress(0.50, desc="Generating images...")
|
| 329 |
-
_generate_images(run_dir, style_name)
|
| 330 |
-
|
| 331 |
-
# --- Step 7: Video Generation ---
|
| 332 |
if step_num <= 7:
|
| 333 |
-
progress(0.
|
| 334 |
-
|
| 335 |
|
| 336 |
# --- Step 8: Assembly ---
|
| 337 |
progress(0.90, desc="Assembling final video...")
|
|
|
|
| 39 |
# GPU-accelerated steps (decorated only on Spaces)
|
| 40 |
# ---------------------------------------------------------------------------
|
| 41 |
|
| 42 |
+
def _generate_images_and_videos(run_dir, style_name):
|
| 43 |
+
"""GPU phase: generate all images, then all video clips.
|
| 44 |
+
|
| 45 |
+
Combined into one @spaces.GPU call so the GPU token stays valid
|
| 46 |
+
for both steps (acquiring a GPU after long CPU work expires the token).
|
| 47 |
+
"""
|
| 48 |
+
# --- Images ---
|
| 49 |
if IS_SPACES:
|
| 50 |
from src.image_generator_hf import run as gen_images
|
| 51 |
else:
|
| 52 |
from src.image_generator_api import run as gen_images
|
| 53 |
+
gen_images(run_dir, style_name=style_name)
|
|
|
|
| 54 |
torch.cuda.empty_cache()
|
| 55 |
|
| 56 |
+
# --- Videos ---
|
|
|
|
|
|
|
| 57 |
if IS_SPACES:
|
| 58 |
from src.video_generator_hf import run as gen_videos
|
| 59 |
+
gen_videos(run_dir)
|
|
|
|
| 60 |
from src.video_generator_hf import unload
|
| 61 |
unload()
|
| 62 |
else:
|
| 63 |
from src.video_generator_api import run as gen_videos
|
| 64 |
+
gen_videos(run_dir)
|
| 65 |
|
| 66 |
|
| 67 |
# Apply @spaces.GPU decorator on Spaces
|
| 68 |
if IS_SPACES:
|
| 69 |
+
_generate_images_and_videos = spaces.GPU(duration=3600)(_generate_images_and_videos)
|
|
|
|
| 70 |
|
| 71 |
|
| 72 |
# ---------------------------------------------------------------------------
|
|
|
|
| 323 |
image_prompt_guidance=style.get("image_prompt_guidance", ""),
|
| 324 |
quality_suffix=style.get("quality_suffix", ""))
|
| 325 |
|
| 326 |
+
# --- Steps 6 & 7: Image + Video Generation (single GPU session) ---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 327 |
if step_num <= 7:
|
| 328 |
+
progress(0.50, desc="Generating images & video clips...")
|
| 329 |
+
_generate_images_and_videos(str(run_dir), style_name)
|
| 330 |
|
| 331 |
# --- Step 8: Assembly ---
|
| 332 |
progress(0.90, desc="Assembling final video...")
|