LucanDerLurch commited on
Commit
eff5802
·
verified ·
1 Parent(s): c561608

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +27 -30
app.py CHANGED
@@ -6,7 +6,6 @@ import gc
6
  import traceback
7
 
8
  MODEL_ID = "ali-vilab/i2vgen-xl"
9
- # Turbo LoRA für SDXL (funktioniert mit I2VGen-XL)
10
  LORA_ID = "latent-consistency/lcm-lora-sdxl"
11
 
12
  pipe = None
@@ -14,36 +13,27 @@ pipe = None
14
  def load_model_safely():
15
  global pipe
16
  if pipe is not None:
17
- return pipe, "Modell ist schon da."
18
 
19
  log = "System Start...\n"
20
  print("Lade Modell...")
21
 
22
  try:
23
- # 1. Pipeline laden (Standard float32 für CPU)
24
  pipe = I2VGenXLPipeline.from_pretrained(
25
  MODEL_ID,
26
  torch_dtype=torch.float32,
27
  variant="fp16"
28
  )
29
 
30
- # 2. LCM TURBO ZÜNDEN
31
  log += "🚀 Lade LCM Turbo LoRA...\n"
32
  try:
33
- # LoRA laden
34
  pipe.load_lora_weights(LORA_ID)
35
-
36
- # WICHTIG: fuse_lora() verschmilzt die LoRA mit dem Modell.
37
- # Das spart RAM, weil wir keine separaten Gewichte halten müssen.
38
  pipe.fuse_lora()
39
-
40
- # Scheduler auf LCM ändern (das macht es schnell)
41
  pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
42
- log += "✅ LCM Turbo ist AKTIV! (Nutze 6 Steps)\n"
43
  except Exception as e:
44
- log += f"⚠️ Turbo Fehler: {e}\n(Mache langsam weiter...)\n"
45
 
46
- # 3. RAM sparen (Offloading)
47
  try:
48
  pipe.enable_model_cpu_offload()
49
  log += "✅ Model Offloading aktiv.\n"
@@ -52,7 +42,7 @@ def load_model_safely():
52
  pipe.enable_sequential_cpu_offload()
53
  log += "✅ Sequential Offloading aktiv.\n"
54
  except:
55
- log += "❌ RAM WARNUNG: Kein Offloading möglich.\n"
56
 
57
  pipe.enable_vae_slicing()
58
  pipe.enable_vae_tiling()
@@ -62,14 +52,17 @@ def load_model_safely():
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
67
  log_messages = ""
68
 
69
  if image_in is None:
70
  return None, "Kein Bild!"
71
 
72
- # Lade Modell erst beim Klick
 
 
73
  if pipe is None:
74
  model, msg = load_model_safely()
75
  log_messages += msg
@@ -81,18 +74,24 @@ def generate_video(image_in, prompt, negative_prompt):
81
  gc.collect()
82
 
83
  try:
84
- # TURBO SETUP
85
- steps = 6 # LCM braucht extrem wenig Steps
86
- guidance = 1.2 # LCM braucht WENIG Guidance (1.0 - 1.5). Nicht höher!
87
- target_size = 448 # 448px ist das Minimum für I2VGen
88
 
89
- log_messages += f"Generiere mit {steps} Steps (Turbo)... Bitte warten.\n"
90
 
91
- # Bild skalieren
92
  image_in = image_in.resize((target_size, target_size))
93
-
94
  generator = torch.manual_seed(42)
95
 
 
 
 
 
 
 
 
 
 
96
  output = pipe(
97
  prompt=prompt,
98
  image=image_in,
@@ -102,7 +101,8 @@ def generate_video(image_in, prompt, negative_prompt):
102
  guidance_scale=guidance,
103
  height=target_size,
104
  width=target_size,
105
- generator=generator
 
106
  ).frames[0]
107
 
108
  video_path = "turbo_output.mp4"
@@ -112,21 +112,18 @@ def generate_video(image_in, prompt, negative_prompt):
112
  return video_path, log_messages
113
 
114
  except Exception as e:
115
- err = str(e)
116
- if "Out of memory" in err or "Killed" in err:
117
- return None, log_messages + "\n❌ RAM ABSTURZ: Die LoRA war der Tropfen zu viel für die 16GB."
118
- return None, log_messages + f"\n❌ Fehler: {err}"
119
 
120
  with gr.Blocks() as demo:
121
  gr.Markdown("# I2VGen-XL ⚡ LCM TURBO")
122
- gr.Markdown("Nur 6 Steps statt 20. Wenn es klappt: Mega schnell. Wenn RAM voll: Absturz.")
123
 
124
  with gr.Row():
125
  with gr.Column():
126
  img = gr.Image(type="pil", label="Bild")
127
  txt = gr.Textbox(label="Prompt", value="fireworks in the sky")
128
  neg = gr.Textbox(value="distortion, blurry", label="Negative")
129
- btn = gr.Button("Turbo Start (ca. 2 Min)")
130
 
131
  with gr.Row():
132
  vid = gr.Video(label="Video")
 
6
  import traceback
7
 
8
  MODEL_ID = "ali-vilab/i2vgen-xl"
 
9
  LORA_ID = "latent-consistency/lcm-lora-sdxl"
10
 
11
  pipe = None
 
13
  def load_model_safely():
14
  global pipe
15
  if pipe is not None:
16
+ return pipe, "Modell ist bereit."
17
 
18
  log = "System Start...\n"
19
  print("Lade Modell...")
20
 
21
  try:
 
22
  pipe = I2VGenXLPipeline.from_pretrained(
23
  MODEL_ID,
24
  torch_dtype=torch.float32,
25
  variant="fp16"
26
  )
27
 
 
28
  log += "🚀 Lade LCM Turbo LoRA...\n"
29
  try:
 
30
  pipe.load_lora_weights(LORA_ID)
 
 
 
31
  pipe.fuse_lora()
 
 
32
  pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)
33
+ log += "✅ LCM Turbo ist AKTIV!\n"
34
  except Exception as e:
35
+ log += f"⚠️ Turbo Fehler: {e}\n"
36
 
 
37
  try:
38
  pipe.enable_model_cpu_offload()
39
  log += "✅ Model Offloading aktiv.\n"
 
42
  pipe.enable_sequential_cpu_offload()
43
  log += "✅ Sequential Offloading aktiv.\n"
44
  except:
45
+ log += "❌ RAM WARNUNG: Kein Offloading.\n"
46
 
47
  pipe.enable_vae_slicing()
48
  pipe.enable_vae_tiling()
 
52
  except Exception as e:
53
  return None, f"Absturz beim Laden: {e}\n{traceback.format_exc()}"
54
 
55
+ # HIER IST DIE MAGIE: Das Argument "progress=gr.Progress()"
56
+ def generate_video(image_in, prompt, negative_prompt, progress=gr.Progress()):
57
  global pipe
58
  log_messages = ""
59
 
60
  if image_in is None:
61
  return None, "Kein Bild!"
62
 
63
+ # Initialisierung des Balkens
64
+ progress(0, desc="Lade Modell (kann dauern)...")
65
+
66
  if pipe is None:
67
  model, msg = load_model_safely()
68
  log_messages += msg
 
74
  gc.collect()
75
 
76
  try:
77
+ steps = 6
78
+ guidance = 1.2
79
+ target_size = 448
 
80
 
81
+ log_messages += f"Starte Generierung ({steps} Steps)...\n"
82
 
 
83
  image_in = image_in.resize((target_size, target_size))
 
84
  generator = torch.manual_seed(42)
85
 
86
+ # --- DER FORTSCHRITTS-SPION ---
87
+ # Diese Funktion wird NACH JEDEM STEP aufgerufen
88
+ def callback_fn(pipe, step_index, timestep, callback_kwargs):
89
+ current = step_index + 1
90
+ # Aktualisiert den Balken oben im Bild
91
+ progress((current, steps), desc=f"Step {current} von {steps} fertig...")
92
+ return callback_kwargs
93
+ # ------------------------------
94
+
95
  output = pipe(
96
  prompt=prompt,
97
  image=image_in,
 
101
  guidance_scale=guidance,
102
  height=target_size,
103
  width=target_size,
104
+ generator=generator,
105
+ callback_on_step_end=callback_fn # Hier binden wir den Spion ein
106
  ).frames[0]
107
 
108
  video_path = "turbo_output.mp4"
 
112
  return video_path, log_messages
113
 
114
  except Exception as e:
115
+ return None, log_messages + f"\n❌ Fehler: {e}"
 
 
 
116
 
117
  with gr.Blocks() as demo:
118
  gr.Markdown("# I2VGen-XL ⚡ LCM TURBO")
119
+ gr.Markdown("Jetzt mit Live-Fortschrittsanzeige!")
120
 
121
  with gr.Row():
122
  with gr.Column():
123
  img = gr.Image(type="pil", label="Bild")
124
  txt = gr.Textbox(label="Prompt", value="fireworks in the sky")
125
  neg = gr.Textbox(value="distortion, blurry", label="Negative")
126
+ btn = gr.Button("Turbo Start")
127
 
128
  with gr.Row():
129
  vid = gr.Video(label="Video")