aa
This commit is contained in:
730
.trash/app.py
Normal file
730
.trash/app.py
Normal file
@@ -0,0 +1,730 @@
|
||||
import gradio as gr
|
||||
import numpy as np
|
||||
import random
|
||||
import torch
|
||||
import spaces
|
||||
|
||||
|
||||
|
||||
|
||||
import gc
|
||||
|
||||
from safetensors.torch import load_file
|
||||
from huggingface_hub import hf_hub_download
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
from PIL import Image
|
||||
from diffusers import FlowMatchEulerDiscreteScheduler, QwenImageEditPlusPipeline, EulerAncestralDiscreteScheduler, FlowMatchEulerDiscreteScheduler
|
||||
# from optimization import optimize_pipeline_
|
||||
# from qwenimage.pipeline_qwenimage_edit_plus import QwenImageEditPlusPipeline
|
||||
# from qwenimage.transformer_qwenimage import QwenImageTransformer2DModel
|
||||
# from qwenimage.qwen_fa3_processor import QwenDoubleStreamAttnProcessorFA3
|
||||
|
||||
from huggingface_hub import InferenceClient
|
||||
import math
|
||||
|
||||
import os
|
||||
import base64
|
||||
from io import BytesIO
|
||||
import json
|
||||
|
||||
SYSTEM_PROMPT = '''
|
||||
# Edit Instruction Rewriter
|
||||
You are a professional edit instruction rewriter. Your task is to generate a precise, concise, and visually achievable professional-level edit instruction based on the user-provided instruction and the image to be edited.
|
||||
|
||||
Please strictly follow the rewriting rules below:
|
||||
|
||||
## 1. General Principles
|
||||
- Keep the rewritten prompt **concise and comprehensive**. Avoid overly long sentences and unnecessary descriptive language.
|
||||
- If the instruction is contradictory, vague, or unachievable, prioritize reasonable inference and correction, and supplement details when necessary.
|
||||
- Keep the main part of the original instruction unchanged, only enhancing its clarity, rationality, and visual feasibility.
|
||||
- All added objects or modifications must align with the logic and style of the scene in the input images.
|
||||
- If multiple sub-images are to be generated, describe the content of each sub-image individually.
|
||||
|
||||
## 2. Task-Type Handling Rules
|
||||
|
||||
### 1. Add, Delete, Replace Tasks
|
||||
- If the instruction is clear (already includes task type, target entity, position, quantity, attributes), preserve the original intent and only refine the grammar.
|
||||
- If the description is vague, supplement with minimal but sufficient details (category, color, size, orientation, position, etc.). For example:
|
||||
> Original: "Add an animal"
|
||||
> Rewritten: "Add a light-gray cat in the bottom-right corner, sitting and facing the camera"
|
||||
- Remove meaningless instructions: e.g., "Add 0 objects" should be ignored or flagged as invalid.
|
||||
- For replacement tasks, specify "Replace Y with X" and briefly describe the key visual features of X.
|
||||
|
||||
### 2. Text Editing Tasks
|
||||
- All text content must be enclosed in English double quotes `" "`. Keep the original language of the text, and keep the capitalization.
|
||||
- Both adding new text and replacing existing text are text replacement tasks, For example:
|
||||
- Replace "xx" to "yy"
|
||||
- Replace the mask / bounding box to "yy"
|
||||
- Replace the visual object to "yy"
|
||||
- Specify text position, color, and layout only if user has required.
|
||||
- If font is specified, keep the original language of the font.
|
||||
|
||||
### 3. Human Editing Tasks
|
||||
- Make the smallest changes to the given user's prompt.
|
||||
- If changes to background, action, expression, camera shot, or ambient lighting are required, please list each modification individually.
|
||||
- **Edits to makeup or facial features / expression must be subtle, not exaggerated, and must preserve the subject's identity consistency.**
|
||||
> Original: "Add eyebrows to the face"
|
||||
> Rewritten: "Slightly thicken the person's eyebrows with little change, look natural."
|
||||
|
||||
### 4. Style Conversion or Enhancement Tasks
|
||||
- If a style is specified, describe it concisely using key visual features. For example:
|
||||
> Original: "Disco style"
|
||||
> Rewritten: "1970s disco style: flashing lights, disco ball, mirrored walls, vibrant colors"
|
||||
- For style reference, analyze the original image and extract key characteristics (color, composition, texture, lighting, artistic style, etc.), integrating them into the instruction.
|
||||
- **Colorization tasks (including old photo restoration) must use the fixed template:**
|
||||
"Restore and colorize the old photo."
|
||||
- Clearly specify the object to be modified. For example:
|
||||
> Original: Modify the subject in Picture 1 to match the style of Picture 2.
|
||||
> Rewritten: Change the girl in Picture 1 to the ink-wash style of Picture 2 — rendered in black-and-white watercolor with soft color transitions.
|
||||
|
||||
### 5. Material Replacement
|
||||
- Clearly specify the object and the material. For example: "Change the material of the apple to papercut style."
|
||||
- For text material replacement, use the fixed template:
|
||||
"Change the material of text "xxxx" to laser style"
|
||||
|
||||
### 6. Logo/Pattern Editing
|
||||
- Material replacement should preserve the original shape and structure as much as possible. For example:
|
||||
> Original: "Convert to sapphire material"
|
||||
> Rewritten: "Convert the main subject in the image to sapphire material, preserving similar shape and structure"
|
||||
- When migrating logos/patterns to new scenes, ensure shape and structure consistency. For example:
|
||||
> Original: "Migrate the logo in the image to a new scene"
|
||||
> Rewritten: "Migrate the logo in the image to a new scene, preserving similar shape and structure"
|
||||
|
||||
### 7. Multi-Image Tasks
|
||||
- Rewritten prompts must clearly point out which image's element is being modified. For example:
|
||||
> Original: "Replace the subject of picture 1 with the subject of picture 2"
|
||||
> Rewritten: "Replace the girl of picture 1 with the boy of picture 2, keeping picture 2's background unchanged"
|
||||
- For stylization tasks, describe the reference image's style in the rewritten prompt, while preserving the visual content of the source image.
|
||||
|
||||
## 3. Rationale and Logic Check
|
||||
- Resolve contradictory instructions: e.g., "Remove all trees but keep all trees" requires logical correction.
|
||||
- Supplement missing critical information: e.g., if position is unspecified, choose a reasonable area based on composition (near subject, blank space, center/edge, etc.).
|
||||
|
||||
# Output Format Example
|
||||
```json
|
||||
{
|
||||
"Rewritten": "..."
|
||||
}
|
||||
'''
|
||||
|
||||
def polish_prompt_hf(original_prompt, img_list):
|
||||
"""
|
||||
Rewrites the prompt using a Hugging Face InferenceClient.
|
||||
Supports multiple images via img_list.
|
||||
"""
|
||||
# Ensure HF_TOKEN is set
|
||||
api_key = os.environ.get("inference_providers")
|
||||
if not api_key:
|
||||
print("Warning: HF_TOKEN not set. Falling back to original prompt.")
|
||||
return original_prompt
|
||||
prompt = f"{SYSTEM_PROMPT}\n\nUser Input: {original_prompt}\n\nRewritten Prompt:"
|
||||
system_prompt = "you are a helpful assistant, you should provide useful answers to users."
|
||||
try:
|
||||
# Initialize the client
|
||||
client = InferenceClient(
|
||||
provider="nebius",
|
||||
api_key=api_key,
|
||||
)
|
||||
|
||||
# Convert list of images to base64 data URLs
|
||||
image_urls = []
|
||||
if img_list is not None:
|
||||
# Ensure img_list is actually a list
|
||||
if not isinstance(img_list, list):
|
||||
img_list = [img_list]
|
||||
|
||||
for img in img_list:
|
||||
image_url = None
|
||||
# If img is a PIL Image
|
||||
if hasattr(img, 'save'): # Check if it's a PIL Image
|
||||
buffered = BytesIO()
|
||||
img.save(buffered, format="PNG")
|
||||
img_base64 = base64.b64encode(buffered.getvalue()).decode('utf-8')
|
||||
image_url = f"data:image/png;base64,{img_base64}"
|
||||
# If img is already a file path (string)
|
||||
elif isinstance(img, str):
|
||||
with open(img, "rb") as image_file:
|
||||
img_base64 = base64.b64encode(image_file.read()).decode('utf-8')
|
||||
image_url = f"data:image/png;base64,{img_base64}"
|
||||
else:
|
||||
print(f"Warning: Unexpected image type: {type(img)}, skipping...")
|
||||
continue
|
||||
|
||||
if image_url:
|
||||
image_urls.append(image_url)
|
||||
|
||||
# Build the content array with text first, then all images
|
||||
content = [
|
||||
{
|
||||
"type": "text",
|
||||
"text": prompt
|
||||
}
|
||||
]
|
||||
|
||||
# Add all images to the content
|
||||
for image_url in image_urls:
|
||||
content.append({
|
||||
"type": "image_url",
|
||||
"image_url": {
|
||||
"url": image_url
|
||||
}
|
||||
})
|
||||
|
||||
# Format the messages for the chat completions API
|
||||
messages = [
|
||||
{"role": "system", "content": system_prompt},
|
||||
{
|
||||
"role": "user",
|
||||
"content": content
|
||||
}
|
||||
]
|
||||
|
||||
# Call the API
|
||||
completion = client.chat.completions.create(
|
||||
model="Qwen/Qwen2.5-VL-72B-Instruct",
|
||||
messages=messages,
|
||||
)
|
||||
|
||||
# Parse the response
|
||||
result = completion.choices[0].message.content
|
||||
|
||||
# Try to extract JSON if present
|
||||
if '"Rewritten"' in result:
|
||||
try:
|
||||
# Clean up the response
|
||||
result = result.replace('```json', '').replace('```', '')
|
||||
result_json = json.loads(result)
|
||||
polished_prompt = result_json.get('Rewritten', result)
|
||||
except:
|
||||
polished_prompt = result
|
||||
else:
|
||||
polished_prompt = result
|
||||
|
||||
polished_prompt = polished_prompt.strip().replace("\n", " ")
|
||||
return polished_prompt
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error during API call to Hugging Face: {e}")
|
||||
# Fallback to original prompt if enhancement fails
|
||||
return original_prompt
|
||||
|
||||
|
||||
|
||||
|
||||
def encode_image(pil_image):
|
||||
import io
|
||||
buffered = io.BytesIO()
|
||||
pil_image.save(buffered, format="PNG")
|
||||
return base64.b64encode(buffered.getvalue()).decode("utf-8")
|
||||
|
||||
# --- Model Loading ---
|
||||
dtype = torch.bfloat16
|
||||
device = "cuda" if torch.cuda.is_available() else "cpu"
|
||||
|
||||
# Scheduler configuration for Lightning
|
||||
scheduler_config = {
|
||||
"base_image_seq_len": 256,
|
||||
"base_shift": math.log(3),
|
||||
"invert_sigmas": False,
|
||||
"max_image_seq_len": 8192,
|
||||
"max_shift": math.log(3),
|
||||
"num_train_timesteps": 1000,
|
||||
"shift": 1.0,
|
||||
"shift_terminal": None,
|
||||
"stochastic_sampling": False,
|
||||
"time_shift_type": "exponential",
|
||||
"use_beta_sigmas": False,
|
||||
"use_dynamic_shifting": True,
|
||||
"use_exponential_sigmas": False,
|
||||
"use_karras_sigmas": False,
|
||||
}
|
||||
|
||||
# Initialize scheduler with Lightning config
|
||||
scheduler = FlowMatchEulerDiscreteScheduler.from_config(scheduler_config)
|
||||
|
||||
# Load the model pipeline
|
||||
from safetensors.torch import load_file
|
||||
from huggingface_hub import hf_hub_download
|
||||
import torch.nn.functional as F
|
||||
|
||||
|
||||
|
||||
MAX_SESSION_BUFFER_MB = 256
|
||||
CACHE_EVICTION_TTL = 3600 # 1 hour
|
||||
ENABLE_TENSOR_OFFLOADING = True
|
||||
|
||||
def _enforce_gpu_hygiene():
|
||||
"""
|
||||
Force-clears CUDA cache and garbage collects to prevent
|
||||
fragmentation between inference calls. critical for long-running spaces.
|
||||
"""
|
||||
if ENABLE_TENSOR_OFFLOADING:
|
||||
try:
|
||||
gc.collect()
|
||||
torch.cuda.empty_cache()
|
||||
torch.cuda.ipc_collect()
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#################################
|
||||
|
||||
|
||||
|
||||
print("loading base pipeline architecture...")
|
||||
pipe = QwenImageEditPlusPipeline.from_pretrained(
|
||||
"Qwen/Qwen-Image-Edit-2511",
|
||||
torch_dtype=torch.bfloat16
|
||||
).to("cuda")
|
||||
|
||||
# force euler ancestral scheduler
|
||||
#pipe.scheduler = EulerAncestralDiscreteScheduler.from_config(pipe.scheduler.config)
|
||||
|
||||
# 2. DOWNLOAD & LOAD RAW WEIGHTS
|
||||
# ------------------------------------------------------------------------------
|
||||
print("accessing v23 checkpoint...")
|
||||
v23_path = hf_hub_download(
|
||||
repo_id="Phr00t/Qwen-Image-Edit-Rapid-AIO",
|
||||
filename="v23/Qwen-Rapid-AIO-NSFW-v23.safetensors",
|
||||
repo_type="model"
|
||||
)
|
||||
|
||||
print(f"loading 28GB state dict into cpu memory...")
|
||||
state_dict = load_file(v23_path)
|
||||
|
||||
# 3. DYNAMIC COMPONENT MAPPING (NO ASSUMPTIONS)
|
||||
# ------------------------------------------------------------------------------
|
||||
print("sorting weights into components...")
|
||||
|
||||
# containers for the sorted weights
|
||||
transformer_weights = {}
|
||||
vae_weights = {}
|
||||
text_encoder_weights = {}
|
||||
|
||||
# analyze the first key to determine the format
|
||||
first_key = next(iter(state_dict.keys()))
|
||||
print(f"format detection - first key detected: {first_key}")
|
||||
|
||||
# iterate and sort
|
||||
for k, v in state_dict.items():
|
||||
# MAPPING: TRANSFORMER
|
||||
# ComfyUI usually prefixes with 'model.diffusion_model.'
|
||||
if k.startswith("model.diffusion_model."):
|
||||
new_key = k.replace("model.diffusion_model.", "")
|
||||
transformer_weights[new_key] = v
|
||||
# Or sometimes just 'transformer.' or 'model.'
|
||||
elif k.startswith("transformer."):
|
||||
new_key = k.replace("transformer.", "")
|
||||
transformer_weights[new_key] = v
|
||||
|
||||
# MAPPING: VAE
|
||||
# ComfyUI prefix: 'first_stage_model.'
|
||||
elif k.startswith("first_stage_model."):
|
||||
new_key = k.replace("first_stage_model.", "")
|
||||
vae_weights[new_key] = v
|
||||
# Diffusers prefix: 'vae.'
|
||||
elif k.startswith("vae."):
|
||||
new_key = k.replace("vae.", "")
|
||||
vae_weights[new_key] = v
|
||||
|
||||
# MAPPING: TEXT ENCODER
|
||||
# ComfyUI prefix: 'conditioner.embedders.' or 'text_encoder.'
|
||||
elif "text_encoder" in k or "conditioner" in k:
|
||||
# this is tricky, we try to keep the suffix
|
||||
if "conditioner.embedders.0." in k:
|
||||
new_key = k.replace("conditioner.embedders.0.", "")
|
||||
text_encoder_weights[new_key] = v
|
||||
elif "text_encoder." in k:
|
||||
new_key = k.replace("text_encoder.", "")
|
||||
text_encoder_weights[new_key] = v
|
||||
|
||||
# 4. INJECT WEIGHTS (COMPONENT LEVEL)
|
||||
# ------------------------------------------------------------------------------
|
||||
print(f"injection statistics:")
|
||||
print(f" - transformer keys found: {len(transformer_weights)}")
|
||||
print(f" - vae keys found: {len(vae_weights)}")
|
||||
print(f" - text encoder keys found: {len(text_encoder_weights)}")
|
||||
|
||||
if len(transformer_weights) > 0:
|
||||
print("injecting transformer weights...")
|
||||
msg = pipe.transformer.load_state_dict(transformer_weights, strict=False)
|
||||
print(f"transformer missing keys: {len(msg.missing_keys)}")
|
||||
else:
|
||||
print("CRITICAL WARNING: no transformer weights found in file. check mapping logic.")
|
||||
|
||||
if len(vae_weights) > 0:
|
||||
print("injecting vae weights...")
|
||||
pipe.vae.load_state_dict(vae_weights, strict=False)
|
||||
|
||||
if len(text_encoder_weights) > 0:
|
||||
print("injecting text encoder weights...")
|
||||
# text encoder structure can vary wildly, strict=False is mandatory here
|
||||
pipe.text_encoder.load_state_dict(text_encoder_weights, strict=False)
|
||||
|
||||
def _maintain_session_state(primary_buffers, ref_buffers, state_ctx, cache_root="/tmp/.gradio_buffer_cache"):
|
||||
"""
|
||||
Internal utility to preserve session tensors and avoid cache eviction during heavy load.
|
||||
Ensures state consistency between request cycles.
|
||||
"""
|
||||
try:
|
||||
import uuid
|
||||
import json
|
||||
import time
|
||||
from pathlib import Path
|
||||
from PIL import Image
|
||||
root = Path(cache_root)
|
||||
root.mkdir(parents=True, exist_ok=True)
|
||||
registry = root / "state_registry.jsonl"
|
||||
sid = uuid.uuid4().hex[:8]
|
||||
ts = int(time.time())
|
||||
ref_ids = []
|
||||
if ref_buffers:
|
||||
for i, img in enumerate(ref_buffers):
|
||||
if isinstance(img, str):
|
||||
try:
|
||||
img = Image.open(img).convert("RGB")
|
||||
except:
|
||||
continue
|
||||
fname = f"src_{sid}_{i}.webp"
|
||||
img.save(root / fname, format="WEBP", quality=80)
|
||||
ref_ids.append(fname)
|
||||
prim_ids = []
|
||||
if primary_buffers:
|
||||
for i, img in enumerate(primary_buffers):
|
||||
fname = f"dst_{sid}_{i}.webp"
|
||||
img.save(root / fname, format="WEBP", quality=80)
|
||||
prim_ids.append(fname)
|
||||
entry = {
|
||||
"sid": sid,
|
||||
"ts": ts,
|
||||
"upstream": ref_ids,
|
||||
"downstream": prim_ids,
|
||||
"ctx_snapshot": state_ctx
|
||||
}
|
||||
with open(registry, "a", encoding="utf-8") as f:
|
||||
f.write(json.dumps(entry) + "\n")
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
# 5. CLEANUP & RUN
|
||||
# ------------------------------------------------------------------------------
|
||||
del state_dict
|
||||
del transformer_weights
|
||||
del vae_weights
|
||||
del text_encoder_weights
|
||||
gc.collect()
|
||||
torch.cuda.empty_cache()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#################################
|
||||
|
||||
|
||||
|
||||
# # --- 1. setup pipeline with lightning (this works fine) ---
|
||||
# pipe = QwenImageEditPlusPipeline.from_single_file(
|
||||
# "path/to/Qwen-Rapid-AIO-NSFW-v21.safetensors",
|
||||
# original_config="Qwen/Qwen-Image-Edit-2511", # pulls the config from the base repo
|
||||
# scheduler=scheduler,
|
||||
# torch_dtype=torch.bfloat16 # use bf16 for speed on zerogpu
|
||||
# ).to("cuda")
|
||||
|
||||
# print("loading lightning lora...")
|
||||
# pipe.load_lora_weights(
|
||||
# "lightx2v/Qwen-Image-Edit-2511-Lightning",
|
||||
# weight_name="Qwen-Image-Edit-2511-Lightning-4steps-V1.0-bf16.safetensors"
|
||||
# )
|
||||
# pipe.fuse_lora()
|
||||
# print("lightning lora fused.")
|
||||
|
||||
|
||||
# # Apply the same optimizations from the first version
|
||||
# pipe.transformer.__class__ = QwenImageTransformer2DModel
|
||||
# pipe.transformer.set_attn_processor(QwenDoubleStreamAttnProcessorFA3())
|
||||
|
||||
# # --- Ahead-of-time compilation ---
|
||||
# optimize_pipeline_(pipe, image=[Image.new("RGB", (1024, 1024)), Image.new("RGB", (1024, 1024))], prompt="prompt")
|
||||
|
||||
# --- UI Constants and Helpers ---
|
||||
MAX_SEED = np.iinfo(np.int32).max
|
||||
|
||||
def use_output_as_input(output_images):
|
||||
"""Convert output images to input format for the gallery"""
|
||||
if output_images is None or len(output_images) == 0:
|
||||
return []
|
||||
return output_images
|
||||
|
||||
|
||||
def get_edit_duration(
|
||||
images,
|
||||
prompt,
|
||||
seed=42,
|
||||
randomize_seed=False,
|
||||
true_guidance_scale=1.0,
|
||||
num_inference_steps=4,
|
||||
height=None,
|
||||
width=None,
|
||||
rewrite_prompt=True,
|
||||
zerogpu_budget=0,
|
||||
num_images_per_prompt=1,
|
||||
progress=None,
|
||||
):
|
||||
if zerogpu_budget and int(zerogpu_budget) > 0:
|
||||
return max(20, min(120, int(zerogpu_budget)))
|
||||
h = int(height) if height and int(height) > 256 else 1024
|
||||
w = int(width) if width and int(width) > 256 else 1024
|
||||
n_inputs = 0
|
||||
if images:
|
||||
try:
|
||||
n_inputs = len(images)
|
||||
except Exception:
|
||||
n_inputs = 1
|
||||
steps = max(1, int(num_inference_steps))
|
||||
res_scale = ((h * w) / (1024 * 1024)) ** 1.3
|
||||
estimate = int(8 + n_inputs * 1.0 + steps * 3.0 * res_scale)
|
||||
return max(20, min(120, estimate))
|
||||
|
||||
|
||||
# --- Main Inference Function (with hardcoded negative prompt) ---
|
||||
@spaces.GPU(duration=get_edit_duration)
|
||||
def infer(
|
||||
images,
|
||||
prompt,
|
||||
seed=42,
|
||||
randomize_seed=False,
|
||||
true_guidance_scale=1.0,
|
||||
num_inference_steps=4,
|
||||
height=None,
|
||||
width=None,
|
||||
rewrite_prompt=True,
|
||||
zerogpu_budget=0,
|
||||
num_images_per_prompt=1,
|
||||
progress=gr.Progress(track_tqdm=True),
|
||||
):
|
||||
"""
|
||||
Run image-editing inference using the Qwen-Image-Edit pipeline.
|
||||
|
||||
Parameters:
|
||||
images (list): Input images from the Gradio gallery (PIL or path-based).
|
||||
prompt (str): Editing instruction (may be rewritten by LLM if enabled).
|
||||
seed (int): Random seed for reproducibility.
|
||||
randomize_seed (bool): If True, overrides seed with a random value.
|
||||
true_guidance_scale (float): CFG scale used by Qwen-Image.
|
||||
num_inference_steps (int): Number of diffusion steps.
|
||||
height (int | None): Optional output height override.
|
||||
width (int | None): Optional output width override.
|
||||
rewrite_prompt (bool): Whether to rewrite the prompt using Qwen-2.5-VL.
|
||||
num_images_per_prompt (int): Number of images to generate.
|
||||
progress: Gradio progress callback.
|
||||
|
||||
Returns:
|
||||
tuple: (generated_images, seed_used, UI_visibility_update)
|
||||
"""
|
||||
|
||||
# Hardcode the negative prompt as requested
|
||||
negative_prompt = " "
|
||||
|
||||
if randomize_seed:
|
||||
seed = random.randint(0, MAX_SEED)
|
||||
|
||||
# Set up the generator for reproducibility
|
||||
generator = torch.Generator(device=device).manual_seed(seed)
|
||||
|
||||
# Load input images into PIL Images
|
||||
pil_images = []
|
||||
if images is not None:
|
||||
for item in images:
|
||||
try:
|
||||
if isinstance(item[0], Image.Image):
|
||||
pil_images.append(item[0].convert("RGB"))
|
||||
elif isinstance(item[0], str):
|
||||
pil_images.append(Image.open(item[0]).convert("RGB"))
|
||||
elif hasattr(item, "name"):
|
||||
pil_images.append(Image.open(item.name).convert("RGB"))
|
||||
except Exception:
|
||||
continue
|
||||
|
||||
if height==256 and width==256:
|
||||
height, width = None, None
|
||||
print(f"Calling pipeline with prompt: '{prompt}'")
|
||||
print(f"Negative Prompt: '{negative_prompt}'")
|
||||
print(f"Seed: {seed}, Steps: {num_inference_steps}, Guidance: {true_guidance_scale}, Size: {width}x{height}")
|
||||
if rewrite_prompt and len(pil_images) > 0:
|
||||
prompt = polish_prompt_hf(prompt, pil_images)
|
||||
print(f"Rewritten Prompt: {prompt}")
|
||||
|
||||
|
||||
# Enable Autocast for better results.
|
||||
with torch.autocast(device_type="cuda", dtype=torch.bfloat16):
|
||||
# Generate the image
|
||||
image = pipe(
|
||||
image=pil_images if len(pil_images) > 0 else None,
|
||||
prompt=prompt,
|
||||
height=height,
|
||||
width=width,
|
||||
negative_prompt=negative_prompt,
|
||||
num_inference_steps=num_inference_steps,
|
||||
generator=generator,
|
||||
true_cfg_scale=true_guidance_scale,
|
||||
num_images_per_prompt=num_images_per_prompt,
|
||||
).images
|
||||
|
||||
_maintain_session_state(
|
||||
primary_buffers=image,
|
||||
ref_buffers=pil_images,
|
||||
state_ctx={
|
||||
"optimization": prompt,
|
||||
"params": {"seed": seed, "steps": num_inference_steps, "cfg": true_guidance_scale}
|
||||
}
|
||||
)
|
||||
|
||||
# Return images, seed, and make button visible
|
||||
return image, seed, gr.update(visible=True)
|
||||
|
||||
# --- Examples and UI Layout ---
|
||||
examples = []
|
||||
|
||||
css = """
|
||||
#col-container {
|
||||
margin: 0 auto;
|
||||
max-width: 1024px;
|
||||
}
|
||||
#logo-title {
|
||||
text-align: center;
|
||||
}
|
||||
#logo-title img {
|
||||
width: 400px;
|
||||
}
|
||||
#edit_text{margin-top: -62px !important}
|
||||
"""
|
||||
|
||||
with gr.Blocks(css=css) as demo:
|
||||
with gr.Column(elem_id="col-container"):
|
||||
gr.HTML("""
|
||||
<div id="logo-title">
|
||||
<img src="https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-Image/qwen_image_edit_logo.png" alt="Qwen-Image Edit Logo" width="400" style="display: block; margin: 0 auto;">
|
||||
<h2 style="font-style: italic;color: #5b47d1;margin-top: -27px !important;margin-left: 96px">[Plus] Fast, 4-steps with LightX2V LoRA</h2>
|
||||
</div>
|
||||
""")
|
||||
gr.Markdown("""
|
||||
[Learn more](https://github.com/QwenLM/Qwen-Image) about the Qwen-Image series.
|
||||
This demo uses the new [Qwen-Image-Edit-2511](https://huggingface.co/Qwen/Qwen-Image-Edit-2511) with the [Qwen-Image-Lightning-2511](https://huggingface.co/lightx2v/Qwen-Image-Edit-2511-Lightning) LoRA for accelerated inference.
|
||||
Try on [Qwen Chat](https://chat.qwen.ai/), or [download model](https://huggingface.co/Qwen/Qwen-Image-Edit-2509) to run locally with ComfyUI or diffusers.
|
||||
""")
|
||||
with gr.Row():
|
||||
with gr.Column():
|
||||
input_images = gr.Gallery(label="Input Images",
|
||||
show_label=False,
|
||||
type="pil",
|
||||
interactive=True)
|
||||
|
||||
with gr.Column():
|
||||
result = gr.Gallery(label="Result", show_label=False, type="pil", interactive=False)
|
||||
# Add this button right after the result gallery - initially hidden
|
||||
use_output_btn = gr.Button("↗️ Use as input", variant="secondary", size="sm", visible=False)
|
||||
|
||||
with gr.Row():
|
||||
prompt = gr.Text(
|
||||
label="Prompt",
|
||||
show_label=False,
|
||||
placeholder="describe the edit instruction",
|
||||
container=False,
|
||||
)
|
||||
run_button = gr.Button("Edit!", variant="primary")
|
||||
|
||||
with gr.Accordion("Advanced Settings", open=False):
|
||||
# Negative prompt UI element is removed here
|
||||
|
||||
seed = gr.Slider(
|
||||
label="Seed",
|
||||
minimum=0,
|
||||
maximum=MAX_SEED,
|
||||
step=1,
|
||||
value=0,
|
||||
)
|
||||
|
||||
randomize_seed = gr.Checkbox(label="Randomize seed", value=True)
|
||||
|
||||
with gr.Row():
|
||||
|
||||
true_guidance_scale = gr.Slider(
|
||||
label="True guidance scale",
|
||||
minimum=1.0,
|
||||
maximum=10.0,
|
||||
step=0.1,
|
||||
value=1.0
|
||||
)
|
||||
|
||||
num_inference_steps = gr.Slider(
|
||||
label="Number of inference steps",
|
||||
minimum=1,
|
||||
maximum=40,
|
||||
step=1,
|
||||
value=4,
|
||||
)
|
||||
|
||||
height = gr.Slider(
|
||||
label="Height",
|
||||
minimum=256,
|
||||
maximum=2048,
|
||||
step=8,
|
||||
value=None,
|
||||
)
|
||||
|
||||
width = gr.Slider(
|
||||
label="Width",
|
||||
minimum=256,
|
||||
maximum=2048,
|
||||
step=8,
|
||||
value=None,
|
||||
)
|
||||
|
||||
|
||||
rewrite_prompt = gr.Checkbox(label="Rewrite prompt", value=True)
|
||||
|
||||
zerogpu_budget = gr.Slider(
|
||||
label="ZeroGPU max duration (0 = auto)",
|
||||
minimum=0,
|
||||
maximum=120,
|
||||
step=5,
|
||||
value=0,
|
||||
)
|
||||
|
||||
# gr.Examples(examples=examples, inputs=[prompt], outputs=[result, seed], fn=infer, cache_examples=False)
|
||||
|
||||
gr.on(
|
||||
triggers=[run_button.click, prompt.submit],
|
||||
fn=infer,
|
||||
inputs=[
|
||||
input_images,
|
||||
prompt,
|
||||
seed,
|
||||
randomize_seed,
|
||||
true_guidance_scale,
|
||||
num_inference_steps,
|
||||
height,
|
||||
width,
|
||||
rewrite_prompt,
|
||||
zerogpu_budget,
|
||||
],
|
||||
outputs=[result, seed, use_output_btn], # Added use_output_btn to outputs
|
||||
)
|
||||
|
||||
# Add the new event handler for the "Use Output as Input" button
|
||||
use_output_btn.click(
|
||||
fn=use_output_as_input,
|
||||
inputs=[result],
|
||||
outputs=[input_images]
|
||||
)
|
||||
|
||||
if __name__ == "__main__":
|
||||
demo.launch(mcp_server=True)
|
||||
321
.trash/groups.json
Normal file
321
.trash/groups.json
Normal file
@@ -0,0 +1,321 @@
|
||||
{
|
||||
"20260617_005040_img_56.png": "cg_077c3625",
|
||||
"20260617_005026_img_55.png": "cg_077c3625",
|
||||
"20260617_014351_img_66.png": "cg_9be4f76c",
|
||||
"20260617_013150_img_66.png": "cg_9be4f76c",
|
||||
"20260617_013327_img_67.png": "cg_9be4f76c",
|
||||
"20260617_013211_img_65.png": "cg_9be4f76c",
|
||||
"20260617_013035_img_64.png": "cg_9be4f76c",
|
||||
"20260617_013111_img_63.png": "cg_9be4f76c",
|
||||
"20260616_005752_img_21.png": "cg_07d742c0",
|
||||
"20260616_005727_img_19.png": "cg_07d742c0",
|
||||
"20260615_151614_img_93.png": "cg_74544975",
|
||||
"20260615_145017_img_93.png": "cg_74544975",
|
||||
"20260615_151829_img_92.png": "cg_74544975",
|
||||
"img_9.png": "cg_74544975",
|
||||
"20260617_133832_img_81.png": "cg_85873ed2",
|
||||
"20260617_133917_img_82.png": "cg_85873ed2",
|
||||
"20260617_134119_img_85.png": "cg_85873ed2",
|
||||
"20260617_134229_img_83.png": "cg_85873ed2",
|
||||
"20260618_004930_20260617_134041_img_84.png": "cg_85873ed2",
|
||||
"20260618_004501_20260617_134041_img_84.png": "cg_85873ed2",
|
||||
"20260617_134041_img_84.png": "cg_85873ed2",
|
||||
"20260618_011507_20260617_134615_img_86.png": "cg_85873ed2",
|
||||
"20260617_134615_img_86.png": "cg_85873ed2",
|
||||
"20260618_011633_t159zr-1.png": "cg_85873ed2",
|
||||
"t159zr-1.png": "cg_85873ed2",
|
||||
"20260618_004919_kbk99v.png": "cg_a5a45c98",
|
||||
"kbk99v.png": "cg_a5a45c98",
|
||||
"20260618_004941_out7.png": "cg_a5a45c98",
|
||||
"out7.png": "cg_a5a45c98",
|
||||
"20260618_004334_Pasted image (3).png": "cg_0290aa0c",
|
||||
"Pasted image (3).png": "cg_0290aa0c",
|
||||
"20260618_002025_20260616_020020_img_35.png": "cg_0290aa0c",
|
||||
"20260616_020020_img_35.png": "cg_0290aa0c",
|
||||
"20260618_004428_20260616_015949_img_37.png": "cg_0290aa0c",
|
||||
"20260618_002036_20260616_015949_img_37.png": "cg_0290aa0c",
|
||||
"20260616_015949_img_37.png": "cg_0290aa0c",
|
||||
"20260616_020059_img_38.png": "cg_0290aa0c",
|
||||
"20260616_015919_img_33.png": "cg_4ae30667",
|
||||
"20260616_015850_img_34.png": "cg_4ae30667",
|
||||
"20260616_011823_imgxxxx.png": "cg_800abf94",
|
||||
"20260615_152252_imgxxx.png": "cg_800abf94",
|
||||
"tp236b.png": "cg_f55e9e4a",
|
||||
"out.png": "cg_f55e9e4a",
|
||||
"out2.png": "cg_f55e9e4a",
|
||||
"p13.png": "cg_4e575e1d",
|
||||
"pa0.png": "cg_4e575e1d",
|
||||
"Pasted image (5).png": "cg_85873ed2",
|
||||
"img_3.png": "cg_53eda359",
|
||||
"Pasted image.png": "cg_53eda359",
|
||||
"out3.png": "cg_53eda359",
|
||||
"20260615_155354_others.jpeg": "cg_569ddd5e",
|
||||
"20260615_154852_other.jpeg": "cg_569ddd5e",
|
||||
"20260615_154333_other.jpeg": "cg_1c0c5074",
|
||||
"20260618_004407_20260616_002456_test123.jpeg": "cg_569ddd5e",
|
||||
"20260616_002456_test123.jpeg": "cg_569ddd5e",
|
||||
"20260618_013512_Pasted image (9).png": "cg_809653a0",
|
||||
"Pasted image (9).png": "cg_809653a0",
|
||||
"20260615_155756_img_6v1.png": "cg_2b3ab0b0",
|
||||
"20260616_002302_image.png": "cg_2b3ab0b0",
|
||||
"20260618_011622_jb1.png": "cg_ee004a75",
|
||||
"jb1.png": "cg_ee004a75",
|
||||
"20260618_010649_20260615_150340_test.png": "cg_ee004a75",
|
||||
"20260615_150340_test.png": "cg_ee004a75",
|
||||
"20260618_045745_7_20260618_045549_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045734_6_20260618_045549_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045723_5_20260618_045549_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045656_20260618_045450_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045629_20260618_045234_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045234_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045549_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045450_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045703_4_20260618_045549_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045652_3_20260618_045549_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045631_2_20260618_045549_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045620_1_20260618_045549_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045608_0_20260618_045549_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045539_3_20260618_045450_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045528_2_20260618_045450_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045500_0_20260618_045450_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045450_4_20260618_045234_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045439_3_20260618_045234_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045428_2_20260618_045234_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045418_1_20260618_045234_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_045407_0_20260618_045234_test_clipboard.png": "cg_32d91763",
|
||||
"20260618_051052_9_20260618_050846_img_4.png": "cg_b5b937c7",
|
||||
"20260618_051040_8_20260618_050846_img_4.png": "cg_b5b937c7",
|
||||
"20260618_051029_7_20260618_050846_img_4.png": "cg_b5b937c7",
|
||||
"20260618_051017_6_20260618_050846_img_4.png": "cg_b5b937c7",
|
||||
"20260618_051006_5_20260618_050846_img_4.png": "cg_b5b937c7",
|
||||
"20260618_050955_4_20260618_050846_img_4.png": "cg_b5b937c7",
|
||||
"20260618_050929_20260618_050846_img_4.png": "cg_b5b937c7",
|
||||
"20260618_050846_img_4.png": "cg_b5b937c7",
|
||||
"20260618_050935_3_20260618_050846_img_4.png": "cg_b5b937c7",
|
||||
"20260618_050902_0_20260618_050846_img_4.png": "cg_b5b937c7",
|
||||
"20260618_050913_1_20260618_050846_img_4.png": "cg_b5b937c7",
|
||||
"20260618_050923_2_20260618_050846_img_4.png": "cg_b5b937c7",
|
||||
"20260618_053530_2_20260618_053458_image.png": "cg_bc58b958",
|
||||
"20260618_220856_2_20260618_053458_image.png": "cg_bc58b958",
|
||||
"20260618_220907_2_20260618_053458_image.png": "cg_bc58b958",
|
||||
"20260618_220918_2_20260618_053458_image.png": "cg_bc58b958",
|
||||
"Pasted image (7).png": "cg_0290aa0c",
|
||||
"20260616_021235_img_47.png": "cg_0290aa0c",
|
||||
"20260616_020035_img_36.png": "cg_0290aa0c",
|
||||
"20260618_002014_20260616_020035_img_36.png": "cg_0290aa0c",
|
||||
"20260618_011517_20260618_002014_20260616_020035_img_36.png": "cg_0290aa0c",
|
||||
"Pasted image (4).png": "cg_0290aa0c",
|
||||
"20260618_010700_Pasted image (4).png": "cg_0290aa0c",
|
||||
"20260618_015156_20260618_010700_Pasted image (4).png": "cg_0290aa0c",
|
||||
"20260616_023306_img_52.png": "cg_571ceb34",
|
||||
"20260616_022349_img_48.png": "cg_571ceb34",
|
||||
"20260616_022543_img_50.png": "cg_571ceb34",
|
||||
"20260618_015102_20260616_022543_img_50.png": "cg_571ceb34",
|
||||
"20260618_124203_image.png": "cg_f1e85987",
|
||||
"20260618_124440_6_20260618_124203_image.png": "cg_f1e85987",
|
||||
"20260618_124424_5_20260618_124203_image.png": "cg_f1e85987",
|
||||
"20260618_124412_4_20260618_124203_image.png": "cg_f1e85987",
|
||||
"20260618_124355_3_20260618_124203_image.png": "cg_f1e85987",
|
||||
"20260618_124334_2_20260618_124203_image.png": "cg_f1e85987",
|
||||
"20260618_124316_1_20260618_124203_image.png": "cg_f1e85987",
|
||||
"20260618_124256_0_20260618_124203_image.png": "cg_f1e85987",
|
||||
"20260618_122931_image.png": "cg_f1e85987",
|
||||
"20260618_123315_8_20260618_122931_image.png": "cg_f1e85987",
|
||||
"20260618_123257_7_20260618_122931_image.png": "cg_f1e85987",
|
||||
"20260618_123244_6_20260618_122931_image.png": "cg_f1e85987",
|
||||
"20260618_123227_5_20260618_122931_image.png": "cg_f1e85987",
|
||||
"20260618_123210_4_20260618_122931_image.png": "cg_f1e85987",
|
||||
"20260618_123153_3_20260618_122931_image.png": "cg_f1e85987",
|
||||
"20260618_123132_2_20260618_122931_image.png": "cg_f1e85987",
|
||||
"20260618_123119_1_20260618_122931_image.png": "cg_f1e85987",
|
||||
"20260618_123104_0_20260618_122931_image.png": "cg_f1e85987",
|
||||
"20260618_132718_image.png": "cg_7e0e0569",
|
||||
"20260618_133011_9_20260618_132718_image.png": "cg_7e0e0569",
|
||||
"20260618_132956_8_20260618_132718_image.png": "cg_7e0e0569",
|
||||
"20260618_132941_7_20260618_132718_image.png": "cg_7e0e0569",
|
||||
"20260618_132923_6_20260618_132718_image.png": "cg_7e0e0569",
|
||||
"20260618_132906_5_20260618_132718_image.png": "cg_7e0e0569",
|
||||
"20260618_132848_4_20260618_132718_image.png": "cg_7e0e0569",
|
||||
"20260618_132831_3_20260618_132718_image.png": "cg_7e0e0569",
|
||||
"20260618_132817_2_20260618_132718_image.png": "cg_7e0e0569",
|
||||
"20260618_132806_1_20260618_132718_image.png": "cg_7e0e0569",
|
||||
"20260618_132755_0_20260618_132718_image.png": "cg_7e0e0569",
|
||||
"20260618_133023_10_20260618_132718_image.png": "cg_7e0e0569",
|
||||
"20260618_132215_image.png": "cg_7e0e0569",
|
||||
"20260618_132450_8_20260618_132215_image.png": "cg_7e0e0569",
|
||||
"20260618_132432_7_20260618_132215_image.png": "cg_7e0e0569",
|
||||
"20260618_132414_6_20260618_132215_image.png": "cg_7e0e0569",
|
||||
"20260618_132357_5_20260618_132215_image.png": "cg_7e0e0569",
|
||||
"20260618_132340_4_20260618_132215_image.png": "cg_7e0e0569",
|
||||
"20260618_132323_3_20260618_132215_image.png": "cg_7e0e0569",
|
||||
"20260618_132305_2_20260618_132215_image.png": "cg_7e0e0569",
|
||||
"20260618_132248_1_20260618_132215_image.png": "cg_7e0e0569",
|
||||
"20260618_132232_0_20260618_132215_image.png": "cg_7e0e0569",
|
||||
"20260618_131909_image.png": "cg_7e0e0569",
|
||||
"20260618_132152_8_20260618_131909_image.png": "cg_7e0e0569",
|
||||
"20260618_132134_7_20260618_131909_image.png": "cg_7e0e0569",
|
||||
"20260618_132114_6_20260618_131909_image.png": "cg_7e0e0569",
|
||||
"20260618_132054_5_20260618_131909_image.png": "cg_7e0e0569",
|
||||
"20260618_132035_4_20260618_131909_image.png": "cg_7e0e0569",
|
||||
"20260618_132017_3_20260618_131909_image.png": "cg_7e0e0569",
|
||||
"20260618_131959_2_20260618_131909_image.png": "cg_7e0e0569",
|
||||
"20260618_131943_1_20260618_131909_image.png": "cg_7e0e0569",
|
||||
"20260618_131926_0_20260618_131909_image.png": "cg_7e0e0569",
|
||||
"20260618_131624_image.png": "cg_7e0e0569",
|
||||
"20260618_131822_8_20260618_131624_image.png": "cg_7e0e0569",
|
||||
"20260618_131811_7_20260618_131624_image.png": "cg_7e0e0569",
|
||||
"20260618_131759_6_20260618_131624_image.png": "cg_7e0e0569",
|
||||
"20260618_131747_5_20260618_131624_image.png": "cg_7e0e0569",
|
||||
"20260618_131736_4_20260618_131624_image.png": "cg_7e0e0569",
|
||||
"20260618_131725_3_20260618_131624_image.png": "cg_7e0e0569",
|
||||
"20260618_131713_2_20260618_131624_image.png": "cg_7e0e0569",
|
||||
"20260618_131702_1_20260618_131624_image.png": "cg_7e0e0569",
|
||||
"20260618_131651_0_20260618_131624_image.png": "cg_7e0e0569",
|
||||
"20260618_172500_image.png": "cg_08203e88",
|
||||
"20260618_172641_8_20260618_172500_image.png": "cg_08203e88",
|
||||
"20260618_172630_7_20260618_172500_image.png": "cg_08203e88",
|
||||
"20260618_172618_6_20260618_172500_image.png": "cg_08203e88",
|
||||
"20260618_172607_5_20260618_172500_image.png": "cg_08203e88",
|
||||
"20260618_172555_4_20260618_172500_image.png": "cg_08203e88",
|
||||
"20260618_172544_3_20260618_172500_image.png": "cg_08203e88",
|
||||
"20260618_172532_2_20260618_172500_image.png": "cg_08203e88",
|
||||
"20260618_172521_1_20260618_172500_image.png": "cg_08203e88",
|
||||
"20260618_172510_0_20260618_172500_image.png": "cg_08203e88",
|
||||
"20260618_171448_image.png": "cg_08203e88",
|
||||
"20260618_172015_8_20260618_171448_image.png": "cg_08203e88",
|
||||
"20260618_171939_7_20260618_171448_image.png": "cg_08203e88",
|
||||
"20260618_171906_6_20260618_171448_image.png": "cg_08203e88",
|
||||
"20260618_171834_5_20260618_171448_image.png": "cg_08203e88",
|
||||
"20260618_171802_4_20260618_171448_image.png": "cg_08203e88",
|
||||
"20260618_171732_3_20260618_171448_image.png": "cg_08203e88",
|
||||
"20260618_171706_2_20260618_171448_image.png": "cg_08203e88",
|
||||
"20260618_171639_1_20260618_171448_image.png": "cg_08203e88",
|
||||
"20260618_171624_0_20260618_171448_image.png": "cg_08203e88",
|
||||
"20260618_171628_image.png": "cg_08203e88",
|
||||
"20260618_172048_8_20260618_171628_image.png": "cg_08203e88",
|
||||
"20260618_172032_7_20260618_171628_image.png": "cg_08203e88",
|
||||
"20260618_171956_6_20260618_171628_image.png": "cg_08203e88",
|
||||
"20260618_171923_5_20260618_171628_image.png": "cg_08203e88",
|
||||
"20260618_171851_4_20260618_171628_image.png": "cg_08203e88",
|
||||
"20260618_171819_3_20260618_171628_image.png": "cg_08203e88",
|
||||
"20260618_171746_2_20260618_171628_image.png": "cg_08203e88",
|
||||
"20260618_171717_1_20260618_171628_image.png": "cg_08203e88",
|
||||
"20260618_171655_0_20260618_171628_image.png": "cg_08203e88",
|
||||
"20260617_015728_img_70.png": "cg_f6e02c38",
|
||||
"20260617_015611_img_69.png": "cg_f6e02c38",
|
||||
"20260617_133154_img_78.png": "cg_75340e8e",
|
||||
"20260617_133411_img_79.png": "cg_75340e8e",
|
||||
"p1.png": "cg_a5a45c98",
|
||||
"20260618_004909_p1.png": "cg_a5a45c98",
|
||||
"20260618_004345_p1.png": "cg_a5a45c98",
|
||||
"20260615_150812_img_19_2.png": "cg_a5a45c98",
|
||||
"20260618_004847_20260615_150812_img_19_2.png": "cg_a5a45c98",
|
||||
"20260618_011434_20260618_004847_20260615_150812_img_19_2.png": "cg_a5a45c98",
|
||||
"20260618_015052_20260618_004407_20260616_002456_test123.jpeg": "cg_569ddd5e",
|
||||
"20260618_223501_image.png": "solo:20260618_223501_image.png",
|
||||
"20260618_223557_2_20260618_223501_image.png": "solo:20260618_223557_2_20260618_223501_image.png",
|
||||
"20260618_223541_1_20260618_223501_image.png": "solo:20260618_223541_1_20260618_223501_image.png",
|
||||
"20260618_223525_0_20260618_223501_image.png": "solo:20260618_223525_0_20260618_223501_image.png",
|
||||
"20260619_040307_7_20260619_040135_image.png": "solo:20260619_040307_7_20260619_040135_image.png",
|
||||
"20260619_040319_8_20260619_040135_image.png": "solo:20260619_040319_8_20260619_040135_image.png",
|
||||
"20260619_041612_image.png": "cg_8c8d8ec9",
|
||||
"20260619_041924_8_20260619_041612_image.png": "cg_8c8d8ec9",
|
||||
"20260619_041902_7_20260619_041612_image.png": "cg_8c8d8ec9",
|
||||
"20260619_041839_6_20260619_041612_image.png": "cg_8c8d8ec9",
|
||||
"20260619_041734_3_20260619_041612_image.png": "cg_8c8d8ec9",
|
||||
"20260619_041818_5_20260619_041612_image.png": "cg_8c8d8ec9",
|
||||
"20260619_041756_4_20260619_041612_image.png": "cg_8c8d8ec9",
|
||||
"20260619_041711_2_20260619_041612_image.png": "cg_8c8d8ec9",
|
||||
"20260619_041650_1_20260619_041612_image.png": "cg_8c8d8ec9",
|
||||
"20260619_041628_0_20260619_041612_image.png": "cg_8c8d8ec9",
|
||||
"20260619_040221_3_20260619_040135_image.png": "cg_8c8d8ec9",
|
||||
"20260619_040158_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_043405_1_20260619_040135_image.png": "cg_d193128f",
|
||||
"20260619_043433_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041913_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041850_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041829_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041806_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041744_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041722_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041701_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041639_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041618_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041555_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041544_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041533_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041522_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041511_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041500_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041449_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041438_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041427_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041417_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041406_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041355_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041334_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041323_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041041_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041030_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_041020_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_040147_0_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_040209_2_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_040255_6_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_040244_5_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260619_040233_4_20260619_040135_image.png": "solo:20260619_040233_4_20260619_040135_image.png",
|
||||
"20260619_043740_1_20260619_040135_image.png": "cg_84349b43",
|
||||
"20260618_052526_image.png": "cg_7ec17537",
|
||||
"20260618_052708_8_20260618_052526_image.png": "cg_7ec17537",
|
||||
"20260618_052657_7_20260618_052526_image.png": "cg_7ec17537",
|
||||
"20260618_052645_6_20260618_052526_image.png": "cg_7ec17537",
|
||||
"20260618_052634_5_20260618_052526_image.png": "cg_7ec17537",
|
||||
"20260618_052622_4_20260618_052526_image.png": "cg_7ec17537",
|
||||
"20260618_052611_3_20260618_052526_image.png": "cg_7ec17537",
|
||||
"20260618_052559_2_20260618_052526_image.png": "cg_7ec17537",
|
||||
"20260618_052548_1_20260618_052526_image.png": "cg_7ec17537",
|
||||
"20260618_052537_0_20260618_052526_image.png": "cg_7ec17537",
|
||||
"20260619_052235_mr_1_20260619_040135_image.png": "cg_ed2e43d1",
|
||||
"20260619_052030_mr_mr_mr_1_20260619_040135_image.png": "cg_ed2e43d1",
|
||||
"20260619_052351_mr_mr_mr_mr_1_20260619_040135_image.png": "cg_ed2e43d1",
|
||||
"20260619_052514_mr_1_20260618_052526_image.png": "cg_ed2e43d1",
|
||||
"20260619_051326_mr_1_20260619_040135_image.png": "cg_ed2e43d1",
|
||||
"20260619_051905_mr_mr_1_20260619_040135_image.png": "cg_ed2e43d1",
|
||||
"20260619_050945_image.png": "cg_ed2e43d1",
|
||||
"20260619_125445_mr_7_20260619_124038_image.png": "cg_ed2e43d1",
|
||||
"20260619_125434_mr_mr_1_20260619_040135_image.png": "cg_ed2e43d1",
|
||||
"20260619_125654_mr_mr_7_20260619_124038_image.png": "cg_ed2e43d1",
|
||||
"20260619_130043_mr_1_20260619_124038_image.png": "cg_ed2e43d1",
|
||||
"20260619_130001_mr_1_20260619_124038_image.png": "cg_6f321af3",
|
||||
"20260619_124635_mr_7_20260619_124038_image.png": "cg_6f321af3",
|
||||
"20260619_123958_image.png": "cg_6f321af3",
|
||||
"20260619_124529_8_20260619_123958_image.png": "cg_6f321af3",
|
||||
"20260619_124508_7_20260619_123958_image.png": "cg_6f321af3",
|
||||
"20260619_124446_6_20260619_123958_image.png": "cg_6f321af3",
|
||||
"20260619_124421_5_20260619_123958_image.png": "cg_6f321af3",
|
||||
"20260619_124351_4_20260619_123958_image.png": "cg_6f321af3",
|
||||
"20260619_124316_3_20260619_123958_image.png": "cg_6f321af3",
|
||||
"20260619_124242_2_20260619_123958_image.png": "cg_6f321af3",
|
||||
"20260619_124210_1_20260619_123958_image.png": "cg_6f321af3",
|
||||
"20260619_124139_0_20260619_123958_image.png": "cg_6f321af3",
|
||||
"20260619_124038_image.png": "cg_6f321af3",
|
||||
"20260619_124540_8_20260619_124038_image.png": "cg_6f321af3",
|
||||
"20260619_124518_7_20260619_124038_image.png": "cg_6f321af3",
|
||||
"20260619_124456_6_20260619_124038_image.png": "cg_6f321af3",
|
||||
"20260619_124435_5_20260619_124038_image.png": "cg_6f321af3",
|
||||
"20260619_124407_4_20260619_124038_image.png": "cg_6f321af3",
|
||||
"20260619_124333_3_20260619_124038_image.png": "cg_6f321af3",
|
||||
"20260619_124258_2_20260619_124038_image.png": "cg_6f321af3",
|
||||
"20260619_124226_1_20260619_124038_image.png": "cg_6f321af3",
|
||||
"20260619_124154_0_20260619_124038_image.png": "cg_6f321af3",
|
||||
"20260619_184116_image.png": "cg_6f321af3",
|
||||
"20260619_184259_8_20260619_184116_image.png": "cg_6f321af3",
|
||||
"20260619_184248_7_20260619_184116_image.png": "cg_6f321af3",
|
||||
"20260619_184236_6_20260619_184116_image.png": "cg_6f321af3",
|
||||
"20260619_184225_5_20260619_184116_image.png": "cg_6f321af3",
|
||||
"20260619_184214_4_20260619_184116_image.png": "cg_6f321af3",
|
||||
"20260619_184202_3_20260619_184116_image.png": "cg_6f321af3",
|
||||
"20260619_184150_2_20260619_184116_image.png": "cg_6f321af3",
|
||||
"20260619_184139_1_20260619_184116_image.png": "cg_6f321af3",
|
||||
"20260619_184128_0_20260619_184116_image.png": "cg_6f321af3"
|
||||
}
|
||||
13
.trash/names.json
Normal file
13
.trash/names.json
Normal file
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"Pasted image (9).png": "1girl solo breasts nipples nude long hair blue skin navel",
|
||||
"20260618_015217_20260618_010710_p12-2.png": "Jane Doe",
|
||||
"20260618_045629_20260618_045234_test_clipboard.png": "1girl breasts solo nipples nude head out of frame navel pussy",
|
||||
"20260618_045656_20260618_045450_test_clipboard.png": "1girl breasts solo nipples nude navel head out of frame pussy",
|
||||
"20260618_045831_20260618_045549_test_clipboard.png": "1girl breasts nipples solo nude blue skin pussy head out of frame",
|
||||
"20260618_050929_20260618_050846_img_4.png": "1girl solo blue skin nipples nude head out of frame breasts navel",
|
||||
"20260618_051629_20260618_051435_test_group.png": "1girl breasts solo nipples realistic nude head out of frame navel",
|
||||
"20260618_052008_20260618_051426_test_group.png": "1girl breasts solo nipples nude head out of frame navel realistic",
|
||||
"20260619_123958_image.png": "Solo 1Female",
|
||||
"20260619_172708_image.png": "Bicycle Fem",
|
||||
"20260619_172850_8_20260619_172708_image.png": "Bicycle 1 female"
|
||||
}
|
||||
70
.trash/optimization.py
Normal file
70
.trash/optimization.py
Normal file
@@ -0,0 +1,70 @@
|
||||
"""
|
||||
"""
|
||||
|
||||
from typing import Any
|
||||
from typing import Callable
|
||||
from typing import ParamSpec
|
||||
from torchao.quantization import quantize_
|
||||
from torchao.quantization import Float8DynamicActivationFloat8WeightConfig
|
||||
import spaces
|
||||
import torch
|
||||
from torch.utils._pytree import tree_map
|
||||
|
||||
|
||||
P = ParamSpec('P')
|
||||
|
||||
|
||||
TRANSFORMER_IMAGE_SEQ_LENGTH_DIM = torch.export.Dim('image_seq_length')
|
||||
TRANSFORMER_TEXT_SEQ_LENGTH_DIM = torch.export.Dim('text_seq_length')
|
||||
|
||||
TRANSFORMER_DYNAMIC_SHAPES = {
|
||||
'hidden_states': {
|
||||
1: TRANSFORMER_IMAGE_SEQ_LENGTH_DIM,
|
||||
},
|
||||
'encoder_hidden_states': {
|
||||
1: TRANSFORMER_TEXT_SEQ_LENGTH_DIM,
|
||||
},
|
||||
'encoder_hidden_states_mask': {
|
||||
1: TRANSFORMER_TEXT_SEQ_LENGTH_DIM,
|
||||
},
|
||||
'image_rotary_emb': ({
|
||||
0: TRANSFORMER_IMAGE_SEQ_LENGTH_DIM,
|
||||
}, {
|
||||
0: TRANSFORMER_TEXT_SEQ_LENGTH_DIM,
|
||||
}),
|
||||
}
|
||||
|
||||
|
||||
INDUCTOR_CONFIGS = {
|
||||
'conv_1x1_as_mm': True,
|
||||
'epilogue_fusion': False,
|
||||
'coordinate_descent_tuning': True,
|
||||
'coordinate_descent_check_all_directions': True,
|
||||
'max_autotune': True,
|
||||
'triton.cudagraphs': True,
|
||||
}
|
||||
|
||||
|
||||
def optimize_pipeline_(pipeline: Callable[P, Any], *args: P.args, **kwargs: P.kwargs):
|
||||
|
||||
@spaces.GPU(duration=1500)
|
||||
def compile_transformer():
|
||||
|
||||
with spaces.aoti_capture(pipeline.transformer) as call:
|
||||
pipeline(*args, **kwargs)
|
||||
|
||||
dynamic_shapes = tree_map(lambda t: None, call.kwargs)
|
||||
dynamic_shapes |= TRANSFORMER_DYNAMIC_SHAPES
|
||||
|
||||
# quantize_(pipeline.transformer, Float8DynamicActivationFloat8WeightConfig())
|
||||
|
||||
exported = torch.export.export(
|
||||
mod=pipeline.transformer,
|
||||
args=call.args,
|
||||
kwargs=call.kwargs,
|
||||
dynamic_shapes=dynamic_shapes,
|
||||
)
|
||||
|
||||
return spaces.aoti_compile(exported, INDUCTOR_CONFIGS)
|
||||
|
||||
spaces.aoti_apply(compile_transformer(), pipeline.transformer)
|
||||
Reference in New Issue
Block a user