Text-to-Images / app.py
ruslanmv's picture
Update app.py
5c6f84b verified
raw
history blame
38.3 kB
import gradio as gr
import numpy as np
import random
import spaces
import torch
from diffusers import DiffusionPipeline, FluxPipeline, AutoencoderTiny, AutoencoderKL
from transformers import CLIPTextModel, CLIPTokenizer, T5EncoderModel, T5TokenizerFast
from live_preview_helpers import calculate_shift, retrieve_timesteps, flux_pipe_call_that_returns_an_iterable_of_images
from download import download_all_models, models, download_vaes
# Call the download function at the start of the app
download_all_models()
download_vaes()
dtype = torch.bfloat16
device = "cuda" if torch.cuda.is_available() else "cpu"
# Load VAEs - these can be reused across models
taef1 = AutoencoderTiny.from_pretrained("madebyollin/taef1", torch_dtype=dtype).to(device)
good_vae = AutoencoderKL.from_pretrained("black-forest-labs/FLUX.1-dev", subfolder="vae", torch_dtype=dtype).to(device)
def load_model(model_name):
model_info = models[model_name]
pipeline_class = model_info["pipeline_class"]
model_id = model_info["model_id"]
config = model_info["config"]
pipeline = pipeline_class.from_pretrained(model_id, **config, vae=taef1).to(device)
# Assign the custom function for live preview if it's a FluxPipeline or DiffusionPipeline
if pipeline_class in (FluxPipeline, DiffusionPipeline):
pipeline.flux_pipe_call_that_returns_an_iterable_of_images = flux_pipe_call_that_returns_an_iterable_of_images.__get__(pipeline)
return pipeline, model_info.get("description", "No description available.")
# Initialize with default model
current_model_name = "FLUX.1-dev"
pipe, model_description = load_model(current_model_name)
torch.cuda.empty_cache()
MAX_SEED = np.iinfo(np.int32).max
MAX_IMAGE_SIZE = 2048
@spaces.GPU(duration=75)
def infer(model_name, prompt, seed=42, randomize_seed=False, width=1024, height=1024, guidance_scale=3.5, num_inference_steps=28, progress=gr.Progress(track_tqdm=True)):
global pipe, current_model_name # Access the global pipe and model name
if randomize_seed:
seed = random.randint(0, MAX_SEED)
generator = torch.Generator().manual_seed(seed)
# Only reload the model if a different one is selected
if model_name != current_model_name:
pipe, _ = load_model(model_name)
current_model_name = model_name
for img in pipe.flux_pipe_call_that_returns_an_iterable_of_images(
prompt=prompt,
guidance_scale=guidance_scale,
num_inference_steps=num_inference_steps,
width=width,
height=height,
generator=generator,
output_type="pil",
good_vae=good_vae,
):
yield img, seed
examples = [
["FLUX.1-dev", "a tiny astronaut hatching from an egg on the moon"],
["FLUX.1-schnell", "a cat holding a sign that says hello world"],
["Flux.1-lite-8B-alpha", "an anime illustration of a wiener schnitzel"],
]
css="""
#col-container {
margin: 0 auto;
max-width: 520px;
}
"""
with gr.Blocks(css=css) as demo:
with gr.Column(elem_id="col-container"):
gr.Markdown(f"""# FLUX.1 Model Selector
Select a model to generate images using the FLUX pipeline.
""")
model_selector = gr.Dropdown(
choices=list(models.keys()),
value=current_model_name,
label="Select Model",
)
model_description_box = gr.Markdown(model_description)
with gr.Row():
prompt = gr.Text(
label="Prompt",
show_label=False,
max_lines=1,
placeholder="Enter your prompt",
container=False,
)
run_button = gr.Button("Run", scale=0)
result = gr.Image(label="Result", show_label=False)
with gr.Accordion("Advanced Settings", open=False):
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():
width = gr.Slider(
label="Width",
minimum=256,
maximum=MAX_IMAGE_SIZE,
step=32,
value=1024,
)
height = gr.Slider(
label="Height",
minimum=256,
maximum=MAX_IMAGE_SIZE,
step=32,
value=1024,
)
with gr.Row():
guidance_scale = gr.Slider(
label="Guidance Scale",
minimum=1,
maximum=15,
step=0.1,
value=3.5,
)
num_inference_steps = gr.Slider(
label="Number of inference steps",
minimum=1,
maximum=50,
step=1,
value=28,
)
def update_description(selected_model):
return models[selected_model]["description"]
model_selector.change(
fn=update_description,
inputs=[model_selector],
outputs=[model_description_box],
)
gr.Examples(
examples=examples,
fn=infer,
inputs=[model_selector, prompt], # Correct order of inputs
outputs=[result, seed],
cache_examples=False,
)
gr.on(
triggers=[run_button.click, prompt.submit],
fn=infer,
inputs=[model_selector, prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps],
outputs=[result, seed],
)
demo.launch()
#working1
''''
import gradio as gr
import numpy as np
import random
import spaces
import torch
from diffusers import DiffusionPipeline, FluxPipeline, AutoencoderTiny, AutoencoderKL
from transformers import CLIPTextModel, CLIPTokenizer, T5EncoderModel, T5TokenizerFast
from live_preview_helpers import calculate_shift, retrieve_timesteps, flux_pipe_call_that_returns_an_iterable_of_images
# Define models and their configurations
models = {
"FLUX.1-schnell": {
"pipeline_class": FluxPipeline,
"model_id": "black-forest-labs/FLUX.1-schnell",
"config": {"torch_dtype": torch.bfloat16},
"description": "**FLUX.1-schnell** is a fast and efficient model designed for quick image generation. It excels at producing high-quality images rapidly, making it ideal for applications where speed is crucial. However, its rapid generation may slightly compromise on the level of detail compared to slower, more meticulous models.",
},
"FLUX.1-dev": {
"pipeline_class": DiffusionPipeline,
"model_id": "black-forest-labs/FLUX.1-dev",
"config": {"torch_dtype": torch.bfloat16},
"description": "**FLUX.1-dev** is a development model that focuses on delivering highly detailed and artistically rich images.",
},
"Flux.1-lite-8B-alpha": {
"pipeline_class": FluxPipeline,
"model_id": "Freepik/flux.1-lite-8B-alpha",
"config": {"torch_dtype": torch.bfloat16},
"description": "**Flux.1-lite-8B-alpha** is a lightweight model optimized for efficiency and ease of use.",
},
}
dtype = torch.bfloat16
device = "cuda" if torch.cuda.is_available() else "cpu"
# Load VAEs - these can be reused across models
taef1 = AutoencoderTiny.from_pretrained("madebyollin/taef1", torch_dtype=dtype).to(device)
good_vae = AutoencoderKL.from_pretrained("black-forest-labs/FLUX.1-dev", subfolder="vae", torch_dtype=dtype).to(device)
def load_model(model_name):
model_info = models[model_name]
pipeline_class = model_info["pipeline_class"]
model_id = model_info["model_id"]
config = model_info["config"]
pipeline = pipeline_class.from_pretrained(model_id, **config, vae=taef1).to(device)
# Assign the custom function for live preview if it's a FluxPipeline or DiffusionPipeline
if pipeline_class in (FluxPipeline, DiffusionPipeline):
pipeline.flux_pipe_call_that_returns_an_iterable_of_images = flux_pipe_call_that_returns_an_iterable_of_images.__get__(pipeline)
return pipeline, model_info.get("description", "No description available.")
# Initialize with default model
current_model_name = "FLUX.1-dev"
pipe, model_description = load_model(current_model_name)
torch.cuda.empty_cache()
MAX_SEED = np.iinfo(np.int32).max
MAX_IMAGE_SIZE = 2048
@spaces.GPU(duration=75)
def infer(model_name, prompt, seed=42, randomize_seed=False, width=1024, height=1024, guidance_scale=3.5, num_inference_steps=28, progress=gr.Progress(track_tqdm=True)):
global pipe, current_model_name # Access the global pipe and model name
if randomize_seed:
seed = random.randint(0, MAX_SEED)
generator = torch.Generator().manual_seed(seed)
# Only reload the model if a different one is selected
if model_name != current_model_name:
pipe, _ = load_model(model_name)
current_model_name = model_name
for img in pipe.flux_pipe_call_that_returns_an_iterable_of_images(
prompt=prompt,
guidance_scale=guidance_scale,
num_inference_steps=num_inference_steps,
width=width,
height=height,
generator=generator,
output_type="pil",
good_vae=good_vae,
):
yield img, seed
examples = [
["FLUX.1-dev", "a tiny astronaut hatching from an egg on the moon"],
["FLUX.1-schnell", "a cat holding a sign that says hello world"],
["Flux.1-lite-8B-alpha", "an anime illustration of a wiener schnitzel"],
]
css="""
#col-container {
margin: 0 auto;
max-width: 520px;
}
"""
with gr.Blocks(css=css) as demo:
with gr.Column(elem_id="col-container"):
gr.Markdown(f"""# FLUX.1 Model Selector
Select a model to generate images using the FLUX pipeline.
""")
model_selector = gr.Dropdown(
choices=list(models.keys()),
value=current_model_name,
label="Select Model",
)
model_description_box = gr.Markdown(model_description)
with gr.Row():
prompt = gr.Text(
label="Prompt",
show_label=False,
max_lines=1,
placeholder="Enter your prompt",
container=False,
)
run_button = gr.Button("Run", scale=0)
result = gr.Image(label="Result", show_label=False)
with gr.Accordion("Advanced Settings", open=False):
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():
width = gr.Slider(
label="Width",
minimum=256,
maximum=MAX_IMAGE_SIZE,
step=32,
value=1024,
)
height = gr.Slider(
label="Height",
minimum=256,
maximum=MAX_IMAGE_SIZE,
step=32,
value=1024,
)
with gr.Row():
guidance_scale = gr.Slider(
label="Guidance Scale",
minimum=1,
maximum=15,
step=0.1,
value=3.5,
)
num_inference_steps = gr.Slider(
label="Number of inference steps",
minimum=1,
maximum=50,
step=1,
value=28,
)
def update_description(selected_model):
return models[selected_model]["description"]
model_selector.change(
fn=update_description,
inputs=[model_selector],
outputs=[model_description_box],
)
gr.Examples(
examples=examples,
fn=infer,
inputs=[model_selector, prompt], # Correct order of inputs
outputs=[result, seed],
cache_examples=False,
)
gr.on(
triggers=[run_button.click, prompt.submit],
fn=infer,
inputs=[model_selector, prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps],
outputs=[result, seed],
)
demo.launch()
'''
#orginal
'''
import gradio as gr
import numpy as np
import random
import spaces
import torch
from diffusers import DiffusionPipeline, FlowMatchEulerDiscreteScheduler, AutoencoderTiny, AutoencoderKL
from transformers import CLIPTextModel, CLIPTokenizer,T5EncoderModel, T5TokenizerFast
from live_preview_helpers import calculate_shift, retrieve_timesteps, flux_pipe_call_that_returns_an_iterable_of_images
dtype = torch.bfloat16
device = "cuda" if torch.cuda.is_available() else "cpu"
taef1 = AutoencoderTiny.from_pretrained("madebyollin/taef1", torch_dtype=dtype).to(device)
good_vae = AutoencoderKL.from_pretrained("black-forest-labs/FLUX.1-dev", subfolder="vae", torch_dtype=dtype).to(device)
pipe = DiffusionPipeline.from_pretrained("black-forest-labs/FLUX.1-dev", torch_dtype=dtype, vae=taef1).to(device)
torch.cuda.empty_cache()
MAX_SEED = np.iinfo(np.int32).max
MAX_IMAGE_SIZE = 2048
pipe.flux_pipe_call_that_returns_an_iterable_of_images = flux_pipe_call_that_returns_an_iterable_of_images.__get__(pipe)
@spaces.GPU(duration=75)
def infer(prompt, seed=42, randomize_seed=False, width=1024, height=1024, guidance_scale=3.5, num_inference_steps=28, progress=gr.Progress(track_tqdm=True)):
if randomize_seed:
seed = random.randint(0, MAX_SEED)
generator = torch.Generator().manual_seed(seed)
for img in pipe.flux_pipe_call_that_returns_an_iterable_of_images(
prompt=prompt,
guidance_scale=guidance_scale,
num_inference_steps=num_inference_steps,
width=width,
height=height,
generator=generator,
output_type="pil",
good_vae=good_vae,
):
yield img, seed
examples = [
"a tiny astronaut hatching from an egg on the moon",
"a cat holding a sign that says hello world",
"an anime illustration of a wiener schnitzel",
]
css="""
#col-container {
margin: 0 auto;
max-width: 520px;
}
"""
with gr.Blocks(css=css) as demo:
with gr.Column(elem_id="col-container"):
gr.Markdown(f"""# FLUX.1 [dev]
12B param rectified flow transformer guidance-distilled from [FLUX.1 [pro]](https://blackforestlabs.ai/)
[[non-commercial license](https://huggingface.co./black-forest-labs/FLUX.1-dev/blob/main/LICENSE.md)] [[blog](https://blackforestlabs.ai/announcing-black-forest-labs/)] [[model](https://huggingface.co./black-forest-labs/FLUX.1-dev)]
""")
with gr.Row():
prompt = gr.Text(
label="Prompt",
show_label=False,
max_lines=1,
placeholder="Enter your prompt",
container=False,
)
run_button = gr.Button("Run", scale=0)
result = gr.Image(label="Result", show_label=False)
with gr.Accordion("Advanced Settings", open=False):
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():
width = gr.Slider(
label="Width",
minimum=256,
maximum=MAX_IMAGE_SIZE,
step=32,
value=1024,
)
height = gr.Slider(
label="Height",
minimum=256,
maximum=MAX_IMAGE_SIZE,
step=32,
value=1024,
)
with gr.Row():
guidance_scale = gr.Slider(
label="Guidance Scale",
minimum=1,
maximum=15,
step=0.1,
value=3.5,
)
num_inference_steps = gr.Slider(
label="Number of inference steps",
minimum=1,
maximum=50,
step=1,
value=28,
)
gr.Examples(
examples = examples,
fn = infer,
inputs = [prompt],
outputs = [result, seed],
cache_examples="lazy"
)
gr.on(
triggers=[run_button.click, prompt.submit],
fn = infer,
inputs = [prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps],
outputs = [result, seed]
)
demo.launch()
'''
'''
import os
import torch
import gradio as gr
from diffusers import FluxPipeline, DiffusionPipeline
import spaces
# Helper function to get the Hugging Face token securely
def get_hf_token():
try:
from google.colab import userdata
hf_token = userdata.get('HF_TOKEN')
if hf_token:
return hf_token
else:
raise RuntimeError("HF_TOKEN not found in Colab secrets.")
except ImportError:
return os.getenv("HF_TOKEN", None)
# Securely get the token
_HF_TOKEN = get_hf_token()
if not _HF_TOKEN:
raise ValueError("HF_TOKEN is not available. Please set it in Colab secrets or environment variables.")
# Define models and their configurations
models = {
"FLUX.1-schnell": {
"pipeline_class": FluxPipeline,
"model_id": "black-forest-labs/FLUX.1-schnell",
"config": {"torch_dtype": torch.bfloat16},
"description": "**FLUX.1-schnell** is a fast and efficient model designed for quick image generation. It excels at producing high-quality images rapidly, making it ideal for applications where speed is crucial. However, its rapid generation may slightly compromise on the level of detail compared to slower, more meticulous models.",
},
"FLUX.1-dev": {
"pipeline_class": DiffusionPipeline,
"model_id": "black-forest-labs/FLUX.1-dev",
"lora": {
"repo": "strangerzonehf/Flux-Enrich-Art-LoRA",
"trigger_word": "enrich art",
},
"config": {"torch_dtype": torch.bfloat16},
"description": "**FLUX.1-dev** is a development model that focuses on delivering highly detailed and artistically rich images.",
},
"Flux.1-lite-8B-alpha": {
"pipeline_class": FluxPipeline,
"model_id": "Freepik/flux.1-lite-8B-alpha",
"config": {"torch_dtype": torch.bfloat16},
"description": "**Flux.1-lite-8B-alpha** is a lightweight model optimized for efficiency and ease of use.",
},
}
models = {
"FLUX.1-schnell": {
"pipeline_class": FluxPipeline,
"model_id": "black-forest-labs/FLUX.1-schnell",
"config": {"torch_dtype": torch.bfloat16},
"description": "**FLUX.1-schnell** is a fast and efficient model designed for quick image generation. It excels at producing high-quality images rapidly, making it ideal for applications where speed is crucial. However, its rapid generation may slightly compromise on the level of detail compared to slower, more meticulous models.",
},
}
# Function to pre-download models
def download_all_models():
print("Downloading all models...")
for model_key, config in models.items():
try:
pipeline_class = config["pipeline_class"]
model_id = config["model_id"]
# Attempt to download the pipeline without loading it into memory
pipeline_class.from_pretrained(model_id, token=_HF_TOKEN, **config.get("config", {}))
if "lora" in config:
pipeline_class.download_lora_weights(config["lora"]["repo"],token=_HF_TOKEN,)
print(f"Model '{model_key}' downloaded successfully.")
except Exception as e:
print(f"Error downloading model '{model_key}': {e}")
print("Model download process complete.")
loaded_models = {}
model_load_status = {} # Dictionary to track model load status
def clear_gpu_memory():
"""Clears GPU memory. Keeps model status information."""
global loaded_models
try:
for model_key in list(loaded_models.keys()): # Iterate over a copy to allow deletion
del loaded_models[model_key]
if torch.cuda.is_available():
torch.cuda.empty_cache()
torch.cuda.ipc_collect()
print("GPU memory cleared.")
return "GPU memory cleared."
except Exception as e:
print(f"Error clearing GPU memory: {e}")
return f"Error clearing GPU memory: {e}"
def load_model(model_key):
"""Loads a model, clearing GPU memory first if a different model was loaded."""
global model_load_status
if model_key not in models:
model_load_status[model_key] = "Model not found."
return f"Model '{model_key}' not found in the available models."
# Clear GPU memory only if a different model is already loaded
if loaded_models and list(loaded_models.keys())[0] != model_key:
clear_gpu_memory()
try:
config = models[model_key]
pipeline_class = config["pipeline_class"]
model_id = config["model_id"]
pipe = pipeline_class.from_pretrained(model_id, token=_HF_TOKEN, **config.get("config", {}))
if "lora" in config:
lora_config = config["lora"]
pipe.load_lora_weights(lora_config["repo"], token=_HF_TOKEN)
if torch.cuda.is_available():
pipe.to("cuda")
loaded_models[model_key] = pipe
model_load_status[model_key] = "Loaded" # Update load status
return f"Model '{model_key}' loaded successfully."
except Exception as e:
model_load_status[model_key] = "Failed" # Update load status on error
return f"Error loading model '{model_key}': {e}"
@spaces.GPU()
def generate_image(model, prompt, seed=-1):
generator = torch.Generator(device="cuda" if torch.cuda.is_available() else "cpu")
if seed != -1:
generator = generator.manual_seed(seed)
with torch.no_grad():
image = model(prompt=prompt, generator=generator).images[0]
return image
def gradio_generate(selected_model, prompt, seed):
if selected_model not in loaded_models:
if selected_model in model_load_status and model_load_status[selected_model] == "Loaded":
# Model should be loaded but isn't in loaded_models, clear it from the status
del model_load_status[selected_model]
if selected_model not in model_load_status or model_load_status[selected_model] != "Loaded":
# Attempt to load the model if not already attempted or failed
load_model(selected_model)
if selected_model not in loaded_models:
# If still not loaded after attempt, return an error
return f"Model not loaded. Load status: {model_load_status.get(selected_model, 'Not attempted')}.", None
model = loaded_models[selected_model]
image = generate_image(model, prompt, seed)
runtime_info = f"Model: {selected_model}\nSeed: {seed}"
output_path = "generated_image.png"
image.save(output_path)
return output_path, runtime_info
def gradio_load_model(selected_model):
if not selected_model:
return "No model selected. Please select a model to load."
return load_model(selected_model)
import gradio as gr
with gr.Blocks(
css="""
.container {
max-width: 800px;
margin: auto;
padding: 20px;
background-color: #ffffff; /* Pure white for a clean background */
border-radius: 10px; /* Smooth rounded corners */
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05); /* Subtle shadow for a lighter feel */
color: #333333; /* Dark gray text for good contrast and readability */
}
"""
) as interface:
with gr.Tab("Image Generator"):
with gr.Column():
gr.Markdown("# Text-to-Image Generator")
model_dropdown = gr.Dropdown(choices=list(models.keys()), label="Select Model")
prompt_textbox = gr.Textbox(label="Enter Text Prompt")
seed_slider = gr.Slider(minimum=-1, maximum=1000, step=1, value=-1, label="Random Seed (-1 for random)")
generate_button = gr.Button("Generate Image")
output_image = gr.Image(label="Generated Image")
runtime_info_textbox = gr.Textbox(label="Runtime Information", lines=2, interactive=False)
# Add example prompts at the bottom
gr.Markdown("### Example Prompts")
examples = gr.Examples(
examples=[
[list(models.keys())[0], "Sexy Woman", "sample2.png"],
# [list(models.keys())[2], "Sexy girl", "sample3.png"],
# [list(models.keys())[1], "Future City", "sample1.png"]
],
inputs=[model_dropdown, prompt_textbox, output_image],
)
generate_button.click(gradio_generate, inputs=[model_dropdown, prompt_textbox, seed_slider], outputs=[output_image, runtime_info_textbox])
with gr.Tab("Model Information"):
for model_key, model_info in models.items():
gr.Markdown(f"## {model_key}")
gr.Markdown(model_info["description"])
gr.Markdown("""---
**Credits**: Created by Ruslan Magana Vsevolodovna. For more information, visit [https://ruslanmv.com/](https://ruslanmv.com/).""")
if __name__ == "__main__":
# Pre-download all models at startup
download_all_models()
interface.launch(debug=True)
'''
'''
import os
import torch
import gradio as gr
from diffusers import FluxPipeline, DiffusionPipeline
import spaces
# Helper function to get the Hugging Face token securely
def get_hf_token():
try:
from google.colab import userdata
hf_token = userdata.get('HF_TOKEN')
if hf_token:
return hf_token
else:
raise RuntimeError("HF_TOKEN not found in Colab secrets.")
except ImportError:
return os.getenv("HF_TOKEN", None)
# Securely get the token
_HF_TOKEN = get_hf_token()
if not _HF_TOKEN:
raise ValueError("HF_TOKEN is not available. Please set it in Colab secrets or environment variables.")
# Define models and their configurations
models = {
"FLUX.1-schnell": {
"pipeline_class": FluxPipeline,
"model_id": "black-forest-labs/FLUX.1-schnell",
"config": {"torch_dtype": torch.bfloat16},
"description": "**FLUX.1-schnell** is a fast and efficient model designed for quick image generation. It excels at producing high-quality images rapidly, making it ideal for applications where speed is crucial. However, its rapid generation may slightly compromise on the level of detail compared to slower, more meticulous models.",
},
"FLUX.1-dev": {
"pipeline_class": DiffusionPipeline,
"model_id": "black-forest-labs/FLUX.1-dev",
"lora": {
"repo": "strangerzonehf/Flux-Enrich-Art-LoRA",
"trigger_word": "enrich art",
},
"config": {"torch_dtype": torch.bfloat16},
"description": "**FLUX.1-dev** is a development model that focuses on delivering highly detailed and artistically rich images.",
},
"Flux.1-lite-8B-alpha": {
"pipeline_class": FluxPipeline,
"model_id": "Freepik/flux.1-lite-8B-alpha",
"config": {"torch_dtype": torch.bfloat16},
"description": "**Flux.1-lite-8B-alpha** is a lightweight model optimized for efficiency and ease of use.",
},
}
# Function to pre-download models
def download_all_models():
print("Downloading all models...")
for model_key, config in models.items():
try:
pipeline_class = config["pipeline_class"]
model_id = config["model_id"]
# Attempt to download the pipeline without loading it into memory
pipeline_class.from_pretrained(model_id, token=_HF_TOKEN, **config.get("config", {}))
if "lora" in config:
pipeline_class.download_lora_weights(config["lora"]["repo"],token=_HF_TOKEN,)
print(f"Model '{model_key}' downloaded successfully.")
except Exception as e:
print(f"Error downloading model '{model_key}': {e}")
print("Model download process complete.")
loaded_models = {}
model_load_status = {} # Dictionary to track model load status
def clear_gpu_memory():
"""Clears GPU memory. Keeps model status information."""
global loaded_models
try:
for model_key in list(loaded_models.keys()): # Iterate over a copy to allow deletion
del loaded_models[model_key]
if torch.cuda.is_available():
torch.cuda.empty_cache()
torch.cuda.ipc_collect()
print("GPU memory cleared.")
return "GPU memory cleared."
except Exception as e:
print(f"Error clearing GPU memory: {e}")
return f"Error clearing GPU memory: {e}"
def load_model(model_key):
"""Loads a model, clearing GPU memory first if a different model was loaded."""
global model_load_status
if model_key not in models:
model_load_status[model_key] = "Model not found."
return f"Model '{model_key}' not found in the available models."
# Clear GPU memory only if a different model is already loaded
if loaded_models and list(loaded_models.keys())[0] != model_key:
clear_gpu_memory()
try:
config = models[model_key]
pipeline_class = config["pipeline_class"]
model_id = config["model_id"]
pipe = pipeline_class.from_pretrained(model_id, token=_HF_TOKEN, **config.get("config", {}))
if "lora" in config:
lora_config = config["lora"]
pipe.load_lora_weights(lora_config["repo"], token=_HF_TOKEN)
if torch.cuda.is_available():
pipe.to("cuda")
loaded_models[model_key] = pipe
model_load_status[model_key] = "Loaded" # Update load status
return f"Model '{model_key}' loaded successfully."
except Exception as e:
model_load_status[model_key] = "Failed" # Update load status on error
return f"Error loading model '{model_key}': {e}"
@spaces.GPU()
def generate_image(model, prompt, seed=-1):
generator = torch.Generator(device="cuda" if torch.cuda.is_available() else "cpu")
if seed != -1:
generator = generator.manual_seed(seed)
with torch.no_grad():
image = model(prompt=prompt, generator=generator).images[0]
return image
def gradio_generate(selected_model, prompt, seed):
if selected_model not in loaded_models:
if selected_model in model_load_status and model_load_status[selected_model] == "Loaded":
# Model should be loaded but isn't in loaded_models, clear it from the status
del model_load_status[selected_model]
if selected_model not in model_load_status or model_load_status[selected_model] != "Loaded":
# Attempt to load the model if not already attempted or failed
load_model(selected_model)
if selected_model not in loaded_models:
# If still not loaded after attempt, return an error
return f"Model not loaded. Load status: {model_load_status.get(selected_model, 'Not attempted')}.", None
model = loaded_models[selected_model]
image = generate_image(model, prompt, seed)
runtime_info = f"Model: {selected_model}\nSeed: {seed}"
output_path = "generated_image.png"
image.save(output_path)
return output_path, runtime_info
def gradio_load_model(selected_model):
if not selected_model:
return "No model selected. Please select a model to load."
return load_model(selected_model)
with gr.Blocks(
css="""
.container {
max-width: 800px;
margin: auto;
padding: 20px;
background-color: #f8f8f8;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
"""
) as interface:
with gr.Tab("Image Generator"):
with gr.Column():
gr.Markdown("# Text-to-Image Generator")
model_dropdown = gr.Dropdown(choices=list(models.keys()), label="Select Model")
prompt_textbox = gr.Textbox(label="Enter Text Prompt")
seed_slider = gr.Slider(minimum=-1, maximum=1000, step=1, value=-1, label="Random Seed (-1 for random)")
generate_button = gr.Button("Generate Image")
output_image = gr.Image(label="Generated Image")
runtime_info_textbox = gr.Textbox(label="Runtime Information", lines=2, interactive=False)
# Add example prompts at the bottom
gr.Markdown("### Example Prompts")
examples = gr.Examples(
examples=[
[list(models.keys())[0], "Sexy Woman", "sample2.png"],
[list(models.keys())[2], "Sexy girl", "sample3.png"],
[list(models.keys())[1], "Future City", "sample1.png"]
],
inputs=[model_dropdown, prompt_textbox, output_image],
)
generate_button.click(gradio_generate, inputs=[model_dropdown, prompt_textbox, seed_slider], outputs=[output_image, runtime_info_textbox])
with gr.Tab("Model Information"):
for model_key, model_info in models.items():
gr.Markdown(f"## {model_key}")
gr.Markdown(model_info["description"])
gr.Markdown("""---
**Credits**: Created by Ruslan Magana Vsevolodovna. For more information, visit [https://ruslanmv.com/](https://ruslanmv.com/).""")
if __name__ == "__main__":
# Pre-download all models at startup
download_all_models()
# Load only the first model
load_model(list(models.keys())[0])
interface.launch(debug=True)
'''
'''
with gr.Blocks(
css="""
.container {
max-width: 800px;
margin: auto;
padding: 20px;
background-color: #f8f8f8;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
"""
) as interface:
with gr.Tab("Image Generator"):
with gr.Column():
gr.Markdown("# Text-to-Image Generator")
model_dropdown = gr.Dropdown(choices=list(models.keys()), label="Select Model")
prompt_textbox = gr.Textbox(label="Enter Text Prompt")
seed_slider = gr.Slider(minimum=-1, maximum=1000, step=1, value=-1, label="Random Seed (-1 for random)")
generate_button = gr.Button("Generate Image")
output_image = gr.Image(label="Generated Image")
runtime_info_textbox = gr.Textbox(label="Runtime Information", lines=2, interactive=False)
# Add example prompts at the bottom
gr.Markdown("### Example Prompts")
examples = gr.Examples(
examples=[
[list(models.keys())[0], "Sexy girl"],
[list(models.keys())[0], "Beautiful Woman"],
[list(models.keys())[0], "Future City"]
],
inputs=[model_dropdown, prompt_textbox],
)
generate_button.click(gradio_generate, inputs=[model_dropdown, prompt_textbox, seed_slider], outputs=[output_image, runtime_info_textbox])
with gr.Tab("Model Information"):
for model_key, model_info in models.items():
gr.Markdown(f"## {model_key}")
gr.Markdown(model_info["description"])
gr.Markdown("""---
**Credits**: Created by Ruslan Magana Vsevolodovna. For more information, visit [https://ruslanmv.com/](https://ruslanmv.com/).""")
if __name__ == "__main__":
interface.launch(debug=True)
'''
'''
with gr.Blocks(
css="""
.container {
max-width: 800px;
margin: auto;
padding: 20px;
background-color: #f8f8f8;
border-radius: 10px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
}
"""
) as interface:
with gr.Tab("Image Generator"):
with gr.Column():
gr.Markdown("# Text-to-Image Generator")
model_dropdown = gr.Dropdown(choices=list(models.keys()), label="Select Model")
#with gr.Row():
#load_button = gr.Button("Load Model")
# clear_button = gr.Button("Clear GPU Memory") # Removed clear button
#load_status = gr.Textbox(label="Model Load Status", interactive=False) # Removed load button
prompt_textbox = gr.Textbox(label="Enter Text Prompt")
seed_slider = gr.Slider(minimum=-1, maximum=1000, step=1, value=-1, label="Random Seed (-1 for random)")
generate_button = gr.Button("Generate Image")
output_image = gr.Image(label="Generated Image")
runtime_info_textbox = gr.Textbox(label="Runtime Information", lines=2, interactive=False)
#load_button.click(gradio_load_model, inputs=[model_dropdown], outputs=[load_status]) # Removed load button click action
# clear_button.click(clear_gpu_memory, outputs=[load_status]) # Removed clear button click action
generate_button.click(gradio_generate, inputs=[model_dropdown, prompt_textbox, seed_slider], outputs=[output_image, runtime_info_textbox])
with gr.Tab("Model Information"):
for model_key, model_info in models.items():
gr.Markdown(f"## {model_key}")
gr.Markdown(model_info["description"])
gr.Markdown("""---
**Credits**: Created by Ruslan Magana Vsevolodovna. For more information, visit [https://ruslanmv.com/](https://ruslanmv.com/).""")
if __name__ == "__main__":
interface.launch(debug=True)
'''