Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -6,7 +6,8 @@ import gc
|
|
| 6 |
import traceback
|
| 7 |
|
| 8 |
MODEL_ID = "ali-vilab/i2vgen-xl"
|
| 9 |
-
|
|
|
|
| 10 |
|
| 11 |
pipe = None
|
| 12 |
|
|
@@ -16,6 +17,7 @@ def load_model_safely():
|
|
| 16 |
return pipe, "Modell bereits geladen."
|
| 17 |
|
| 18 |
log = "Lade Modell...\n"
|
|
|
|
| 19 |
|
| 20 |
try:
|
| 21 |
# 1. Basis Modell laden
|
|
@@ -25,20 +27,23 @@ def load_model_safely():
|
|
| 25 |
variant="fp16"
|
| 26 |
)
|
| 27 |
|
| 28 |
-
# 2. TURBO
|
| 29 |
-
log += "
|
| 30 |
try:
|
| 31 |
-
#
|
| 32 |
-
pipe.load_lora_weights(LORA_ID
|
| 33 |
-
pipe.fuse_lora() # Verschmilzt LoRA mit Modell für Speed
|
| 34 |
|
| 35 |
-
# WICHTIG:
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
|
| 37 |
-
log += "✅ Turbo aktiviert (
|
| 38 |
except Exception as e:
|
| 39 |
-
log += f"⚠️
|
| 40 |
|
| 41 |
-
# 3. Speicher
|
| 42 |
try:
|
| 43 |
pipe.enable_model_cpu_offload()
|
| 44 |
log += "✅ Model Offloading aktiv.\n"
|
|
@@ -47,7 +52,7 @@ def load_model_safely():
|
|
| 47 |
pipe.enable_sequential_cpu_offload()
|
| 48 |
log += "✅ Sequential Offloading aktiv.\n"
|
| 49 |
except:
|
| 50 |
-
log += "❌ RAM
|
| 51 |
|
| 52 |
pipe.enable_vae_slicing()
|
| 53 |
pipe.enable_vae_tiling()
|
|
@@ -55,7 +60,7 @@ def load_model_safely():
|
|
| 55 |
return pipe, log
|
| 56 |
|
| 57 |
except Exception as e:
|
| 58 |
-
return None, f"Absturz beim Laden: {e}"
|
| 59 |
|
| 60 |
def generate_video(image_in, prompt, negative_prompt):
|
| 61 |
global pipe
|
|
@@ -75,12 +80,16 @@ def generate_video(image_in, prompt, negative_prompt):
|
|
| 75 |
gc.collect()
|
| 76 |
|
| 77 |
try:
|
| 78 |
-
#
|
| 79 |
-
|
| 80 |
-
|
| 81 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 82 |
|
| 83 |
-
log_messages += f"Generiere
|
| 84 |
|
| 85 |
image_in = image_in.resize((target_size, target_size))
|
| 86 |
|
|
@@ -92,7 +101,7 @@ def generate_video(image_in, prompt, negative_prompt):
|
|
| 92 |
negative_prompt=negative_prompt,
|
| 93 |
num_frames=16,
|
| 94 |
num_inference_steps=steps,
|
| 95 |
-
guidance_scale=guidance,
|
| 96 |
height=target_size,
|
| 97 |
width=target_size,
|
| 98 |
generator=generator
|
|
@@ -108,15 +117,15 @@ def generate_video(image_in, prompt, negative_prompt):
|
|
| 108 |
return None, log_messages + f"\n❌ Fehler: {e}"
|
| 109 |
|
| 110 |
with gr.Blocks() as demo:
|
| 111 |
-
gr.Markdown("# I2VGen-XL ⚡ TURBO
|
| 112 |
-
gr.Markdown("
|
| 113 |
|
| 114 |
with gr.Row():
|
| 115 |
with gr.Column():
|
| 116 |
img = gr.Image(type="pil", label="Bild")
|
| 117 |
txt = gr.Textbox(label="Prompt", value="clouds moving, cinematic")
|
| 118 |
neg = gr.Textbox(value="distortion, blurry", label="Negative")
|
| 119 |
-
btn = gr.Button("Turbo Start (
|
| 120 |
|
| 121 |
with gr.Row():
|
| 122 |
vid = gr.Video(label="Video")
|
|
|
|
| 6 |
import traceback
|
| 7 |
|
| 8 |
MODEL_ID = "ali-vilab/i2vgen-xl"
|
| 9 |
+
# Das ist der Turbo-Booster für SDXL-basierte Modelle (wie I2VGen-XL)
|
| 10 |
+
LORA_ID = "latent-consistency/lcm-lora-sdxl"
|
| 11 |
|
| 12 |
pipe = None
|
| 13 |
|
|
|
|
| 17 |
return pipe, "Modell bereits geladen."
|
| 18 |
|
| 19 |
log = "Lade Modell...\n"
|
| 20 |
+
print("Starte Ladevorgang...")
|
| 21 |
|
| 22 |
try:
|
| 23 |
# 1. Basis Modell laden
|
|
|
|
| 27 |
variant="fp16"
|
| 28 |
)
|
| 29 |
|
| 30 |
+
# 2. LCM TURBO ZÜNDEN
|
| 31 |
+
log += "🚀 Lade LCM LoRA...\n"
|
| 32 |
try:
|
| 33 |
+
# LoRA laden
|
| 34 |
+
pipe.load_lora_weights(LORA_ID)
|
|
|
|
| 35 |
|
| 36 |
+
# WICHTIG: fuse_lora() verschmilzt die Gewichte.
|
| 37 |
+
# Das verhindert, dass wir doppelten RAM für Modell + LoRA brauchen.
|
| 38 |
+
pipe.fuse_lora()
|
| 39 |
+
|
| 40 |
+
# Scheduler austauschen gegen LCM
|
| 41 |
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
|
| 42 |
+
log += "✅ LCM Turbo aktiviert! (Steps reduziert auf 4-8)\n"
|
| 43 |
except Exception as e:
|
| 44 |
+
log += f"⚠️ LoRA Fehler: {e}\nEs geht ohne Turbo weiter (langsam).\n"
|
| 45 |
|
| 46 |
+
# 3. Speicher-Optimierung
|
| 47 |
try:
|
| 48 |
pipe.enable_model_cpu_offload()
|
| 49 |
log += "✅ Model Offloading aktiv.\n"
|
|
|
|
| 52 |
pipe.enable_sequential_cpu_offload()
|
| 53 |
log += "✅ Sequential Offloading aktiv.\n"
|
| 54 |
except:
|
| 55 |
+
log += "❌ RAM Warnung: Kein Offloading.\n"
|
| 56 |
|
| 57 |
pipe.enable_vae_slicing()
|
| 58 |
pipe.enable_vae_tiling()
|
|
|
|
| 60 |
return pipe, log
|
| 61 |
|
| 62 |
except Exception as e:
|
| 63 |
+
return None, f"Absturz beim Laden: {e}\n{traceback.format_exc()}"
|
| 64 |
|
| 65 |
def generate_video(image_in, prompt, negative_prompt):
|
| 66 |
global pipe
|
|
|
|
| 80 |
gc.collect()
|
| 81 |
|
| 82 |
try:
|
| 83 |
+
# LCM EINSTELLUNGEN
|
| 84 |
+
# Steps: 6 (statt 20-50)
|
| 85 |
+
# Guidance: 1.5 (LCM braucht sehr niedrige Werte, sonst Bildmatsch)
|
| 86 |
+
steps = 6
|
| 87 |
+
guidance = 1.5
|
| 88 |
+
|
| 89 |
+
# Auflösung: Wir bleiben bei 448px für Stabilität
|
| 90 |
+
target_size = 448
|
| 91 |
|
| 92 |
+
log_messages += f"Generiere mit {steps} Steps (Turbo Modus)...\n"
|
| 93 |
|
| 94 |
image_in = image_in.resize((target_size, target_size))
|
| 95 |
|
|
|
|
| 101 |
negative_prompt=negative_prompt,
|
| 102 |
num_frames=16,
|
| 103 |
num_inference_steps=steps,
|
| 104 |
+
guidance_scale=guidance, # WICHTIG: Niedrig halten bei LCM!
|
| 105 |
height=target_size,
|
| 106 |
width=target_size,
|
| 107 |
generator=generator
|
|
|
|
| 117 |
return None, log_messages + f"\n❌ Fehler: {e}"
|
| 118 |
|
| 119 |
with gr.Blocks() as demo:
|
| 120 |
+
gr.Markdown("# I2VGen-XL ⚡ LCM TURBO")
|
| 121 |
+
gr.Markdown("Nutzt LCM LoRA für extreme Geschwindigkeit (6 Steps).")
|
| 122 |
|
| 123 |
with gr.Row():
|
| 124 |
with gr.Column():
|
| 125 |
img = gr.Image(type="pil", label="Bild")
|
| 126 |
txt = gr.Textbox(label="Prompt", value="clouds moving, cinematic")
|
| 127 |
neg = gr.Textbox(value="distortion, blurry", label="Negative")
|
| 128 |
+
btn = gr.Button("Turbo Start (ca. 2-3 Min)")
|
| 129 |
|
| 130 |
with gr.Row():
|
| 131 |
vid = gr.Video(label="Video")
|