thankfulcarp commited on
Commit
5821d1b
·
1 Parent(s): ecf2c6b

Fix lora mem issue with large res

Browse files
Files changed (1) hide show
  1. app.py +53 -24
app.py CHANGED
@@ -94,6 +94,7 @@ MOD_VALUE = 8
94
  DEFAULT_H_SLIDER_VALUE = 512
95
  DEFAULT_W_SLIDER_VALUE = 768
96
  NEW_FORMULA_MAX_AREA = 768.0 * 512.0
 
97
 
98
  SLIDER_MIN_H, SLIDER_MAX_H = 128, 896
99
  SLIDER_MIN_W, SLIDER_MAX_W = 128, 896
@@ -126,43 +127,56 @@ def parse_lset_prompt(lset_prompt):
126
 
127
  return resolved_prompt
128
 
129
- def handle_lora_selection_change(preset_name, current_prompt):
130
  """
131
  When a preset is selected, this function finds the corresponding .lset file,
132
- parses it, and appends the generated prompt to the current prompt.
133
  """
 
 
 
 
 
134
  if not preset_name or preset_name == "None":
135
- return gr.update() # No preset selected, do not change the prompt.
136
 
 
137
  try:
138
- # The preset_name is the filename without extension
139
  lset_filename = f"{preset_name}.lset"
140
-
141
- # Download the .lset file from the same subfolder as the LoRA
142
  lset_path = hf_hub_download(
143
- repo_id=I2V_LORA_REPO_ID,
144
- filename=lset_filename,
145
- subfolder=I2V_LORA_SUBFOLDER,
146
- repo_type='model'
147
  )
148
-
149
  with open(lset_path, 'r', encoding='utf-8') as f:
150
  lset_data = json.load(f)
151
 
152
- lset_prompt_raw = lset_data.get("prompt")
153
- if not lset_prompt_raw:
154
- return gr.update()
155
-
156
- resolved_prompt = parse_lset_prompt(lset_prompt_raw)
157
- # Append with newlines for separation. If current prompt is empty, strip() handles it.
158
- new_prompt = f"{current_prompt}\n\n{resolved_prompt}".strip()
159
- gr.Info(f"✅ Appended prompt from '{lset_filename}'. Replace highlighted text like __this__.")
160
- return gr.update(value=new_prompt)
161
  except Exception as e:
162
- # This should be less common now, but good to keep for safety.
163
  print(f"Info: Could not process .lset for '{preset_name}'. Reason: {e}")
164
  gr.Info(f"ℹ️ Error processing preset '{preset_name}'.")
165
- return gr.update()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
166
 
167
  # --- Helper Functions ---
168
  def sanitize_prompt_for_filename(prompt: str, max_len: int = 60) -> str:
@@ -259,6 +273,21 @@ def generate_i2v_video(input_image, prompt, height, width,
259
  target_h = max(MOD_VALUE, (int(height) // MOD_VALUE) * MOD_VALUE)
260
  target_w = max(MOD_VALUE, (int(width) // MOD_VALUE) * MOD_VALUE)
261
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
262
  # Calculate and adjust num_frames to be compatible with video codecs
263
  target_frames = int(round(duration_seconds * FIXED_FPS))
264
  adjusted_frames = 4 * round((target_frames - 1) / 4) + 1
@@ -393,8 +422,8 @@ with gr.Blocks() as demo:
393
  # I2V Handlers
394
  i2v_preset_name.change(
395
  fn=handle_lora_selection_change,
396
- inputs=[i2v_preset_name, i2v_prompt],
397
- outputs=[i2v_prompt]
398
  )
399
  i2v_input_image.upload(
400
  fn=handle_image_upload_for_dims_wan,
 
94
  DEFAULT_H_SLIDER_VALUE = 512
95
  DEFAULT_W_SLIDER_VALUE = 768
96
  NEW_FORMULA_MAX_AREA = 768.0 * 512.0
97
+ LORA_MAX_AREA = 640.0 * 480.0 # Max pixel area when a LoRA is active
98
 
99
  SLIDER_MIN_H, SLIDER_MAX_H = 128, 896
100
  SLIDER_MIN_W, SLIDER_MAX_W = 128, 896
 
127
 
128
  return resolved_prompt
129
 
130
+ def handle_lora_selection_change(preset_name, current_prompt, current_h, current_w, aspect_ratio):
131
  """
132
  When a preset is selected, this function finds the corresponding .lset file,
133
+ parses it, appends the prompt, and resizes dimensions if they are too large.
134
  """
135
+ # Initialize updates to avoid changing UI elements unnecessarily
136
+ prompt_update = gr.update()
137
+ h_update = gr.update()
138
+ w_update = gr.update()
139
+
140
  if not preset_name or preset_name == "None":
141
+ return prompt_update, h_update, w_update
142
 
143
+ # --- Handle Prompt ---
144
  try:
 
145
  lset_filename = f"{preset_name}.lset"
 
 
146
  lset_path = hf_hub_download(
147
+ repo_id=I2V_LORA_REPO_ID, filename=lset_filename,
148
+ subfolder=I2V_LORA_SUBFOLDER, repo_type='model'
 
 
149
  )
 
150
  with open(lset_path, 'r', encoding='utf-8') as f:
151
  lset_data = json.load(f)
152
 
153
+ if lset_prompt_raw := lset_data.get("prompt"):
154
+ resolved_prompt = parse_lset_prompt(lset_prompt_raw)
155
+ new_prompt = f"{current_prompt}\n\n{resolved_prompt}".strip()
156
+ gr.Info(f"✅ Appended prompt from '{lset_filename}'. Replace highlighted text like __this__.")
157
+ prompt_update = gr.update(value=new_prompt)
 
 
 
 
158
  except Exception as e:
 
159
  print(f"Info: Could not process .lset for '{preset_name}'. Reason: {e}")
160
  gr.Info(f"ℹ️ Error processing preset '{preset_name}'.")
161
+
162
+ # --- Handle Resolution ---
163
+ if current_h * current_w > LORA_MAX_AREA:
164
+ gr.Info(f"Resolution too high for LoRA. Scaling down to a 640x480 equivalent area.")
165
+ # aspect_ratio is W/H
166
+ if aspect_ratio > 0:
167
+ calc_w = round(np.sqrt(LORA_MAX_AREA * aspect_ratio))
168
+ calc_h = round(np.sqrt(LORA_MAX_AREA / aspect_ratio))
169
+
170
+ new_h = max(MOD_VALUE, (calc_h // MOD_VALUE) * MOD_VALUE)
171
+ new_w = max(MOD_VALUE, (calc_w // MOD_VALUE) * MOD_VALUE)
172
+
173
+ h_update = gr.update(value=new_h)
174
+ w_update = gr.update(value=new_w)
175
+ else: # Fallback if aspect ratio is invalid
176
+ h_update = gr.update(value=480)
177
+ w_update = gr.update(value=640)
178
+
179
+ return prompt_update, h_update, w_update
180
 
181
  # --- Helper Functions ---
182
  def sanitize_prompt_for_filename(prompt: str, max_len: int = 60) -> str:
 
273
  target_h = max(MOD_VALUE, (int(height) // MOD_VALUE) * MOD_VALUE)
274
  target_w = max(MOD_VALUE, (int(width) // MOD_VALUE) * MOD_VALUE)
275
 
276
+ # If a LoRA is used, enforce max resolution as a safety net
277
+ if preset_name and preset_name != "None":
278
+ if target_h * target_w > LORA_MAX_AREA:
279
+ print(f"⚠️ Warning: Resolution {target_w}x{target_h} is too high for LoRA. Rescaling to fit max area.")
280
+ aspect_ratio = target_w / target_h if target_h > 0 else 1.0
281
+
282
+ # Re-calculate w and h based on max area
283
+ target_w = round(np.sqrt(LORA_MAX_AREA * aspect_ratio))
284
+ target_h = round(np.sqrt(LORA_MAX_AREA / aspect_ratio))
285
+
286
+ # Snap to MOD_VALUE
287
+ target_h = max(MOD_VALUE, (target_h // MOD_VALUE) * MOD_VALUE)
288
+ target_w = max(MOD_VALUE, (target_w // MOD_VALUE) * MOD_VALUE)
289
+ print(f" - Rescaled to: {target_w}x{target_h}")
290
+
291
  # Calculate and adjust num_frames to be compatible with video codecs
292
  target_frames = int(round(duration_seconds * FIXED_FPS))
293
  adjusted_frames = 4 * round((target_frames - 1) / 4) + 1
 
422
  # I2V Handlers
423
  i2v_preset_name.change(
424
  fn=handle_lora_selection_change,
425
+ inputs=[i2v_preset_name, i2v_prompt, i2v_height, i2v_width, i2v_aspect_ratio],
426
+ outputs=[i2v_prompt, i2v_height, i2v_width]
427
  )
428
  i2v_input_image.upload(
429
  fn=handle_image_upload_for_dims_wan,