Picture / app.py
G-Rost's picture
Update app.py
3e10b33 verified
raw
history blame
5.21 kB
import gradio as gr
import numpy as np
import random
from diffusers import DiffusionPipeline
import torch
import time
import psutil
from huggingface_hub import snapshot_download
def load_pipeline(model_id):
if model_id in PIPELINES:
return PIPELINES[model_id]
else:
# Download model using snapshot_download to handle LFS files
model_path = snapshot_download(repo_id=model_id, local_dir="./models") # Download and cache models
pipe = DiffusionPipeline.from_pretrained(model_path, torch_dtype=torch.float32)
pipe.to(DEVICE)
PIPELINES[model_id] = pipe
return pipe
# Get the number of physical CPU cores (excluding hyperthreads)
NUM_CPU_CORES = psutil.cpu_count(logical=True)
# Cap the number of threads to the available physical cores
MAX_THREADS = min(8, NUM_CPU_CORES)
# Device and hardware configuration
DEVICE = "cpu"
# Model Options (optimized for CPU and memory constraints)
MODEL_OPTIONS = {
"Модель штучного інтелекту середня (Більше часу на виконання-краща якість)": "CompVis/stable-diffusion-v1-4",
"Модель штучного інтелекту мала (Швидше-середня якість)": "hf-internal-testing/tiny-stable-diffusion-pipe",
}
# Default to fastest model and lower image size for limited resources
DEFAULT_MODEL_ID = MODEL_OPTIONS["Модель штучного інтелекту мала (Швидше-середня якість)"]
DEFAULT_IMAGE_SIZE = 512 # Lower default resolution
# Cache models to avoid reloading
PIPELINES = {}
def load_pipeline(model_id):
if model_id in PIPELINES:
return PIPELINES[model_id]
else:
pipe = DiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.float32)
pipe.to(DEVICE)
PIPELINES[model_id] = pipe
return pipe
def generate_image(prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps, num_images, model_choice):
if not prompt:
raise gr.Error("Будь ласка, введіть опис для зображення.")
torch.set_num_threads(MAX_THREADS)
pipe = load_pipeline(MODEL_OPTIONS[model_choice])
# Adjust memory usage based on available RAM
torch.cuda.empty_cache()
generator = torch.Generator(device=DEVICE)
if not randomize_seed:
generator = generator.manual_seed(seed)
start_time = time.time()
images = pipe(
prompt,
negative_prompt=negative_prompt,
width=width,
height=height,
guidance_scale=guidance_scale,
num_inference_steps=num_inference_steps,
num_images_per_prompt=num_images,
generator=generator,
).images
end_time = time.time()
generation_time = end_time - start_time
return images, f"Час генерації: {generation_time:.2f} секунд"
with gr.Blocks() as demo:
with gr.Column(elem_id="col-container"):
gr.Markdown(f"""
## Демоверсія. Працює на обмежених ресурсах, в хмарному середовищі, без CUDA-ядер.
З питань та пропозицій пишіть на [[email protected]]
""")
with gr.Row():
with gr.Column(scale=5):
prompt = gr.Textbox(label="Опис зображення")
negative_prompt = gr.Textbox(label="Не показувати", value="cloned, lowres, bad quality, watermark")
with gr.Column(scale=1):
model_choice = gr.Radio(
choices=list(MODEL_OPTIONS.keys()),
label="Моделі",
value=list(MODEL_OPTIONS.keys())[0],
)
with gr.Row():
seed = gr.Slider(label="Генератор", minimum=0, maximum=1000000, step=1, value=42)
randomize_seed = gr.Checkbox(label="Створити нове", value=True)
with gr.Row():
width = gr.Slider(label="Ширина", minimum=512, maximum=512, step=64, value=DEFAULT_IMAGE_SIZE)
height = gr.Slider(label="Висота", minimum=512, maximum=512, step=64, value=DEFAULT_IMAGE_SIZE)
with gr.Row():
guidance_scale = gr.Slider(label="Шкала відповідності опису", minimum=0, maximum=10, step=0.5, value=10)
num_inference_steps = gr.Slider(label="Покрокова пікселізація (більше кроків-краща деталізація, більше часу на виконання)", minimum=20, maximum=20, step=5, value=20)
with gr.Row():
num_images = gr.Slider(label="Кількість зображень", minimum=1, maximum=1, step=1, value=1)
run_button = gr.Button("Згенерувати")
gallery = gr.Gallery(label="Створені зображення")
status_text = gr.Textbox(label="Виконання")
run_button.click(
fn=generate_image,
inputs=[prompt, negative_prompt, seed, randomize_seed, width, height, guidance_scale, num_inference_steps, num_images, model_choice],
outputs=[gallery, status_text],
)
demo.launch(share=True)