Spaces:
Runtime error
Runtime error
| import os | |
| import time | |
| from datetime import datetime | |
| import pytz | |
| import spaces | |
| import torch | |
| import gradio as gr | |
| import traceback | |
| import threading | |
| from transformers import pipeline | |
| from huggingface_hub import login | |
| from diffusers import FluxPipeline | |
| from aura_sr import AuraSR | |
| from deep_translator import GoogleTranslator | |
| def log(*args, **kwargs): | |
| tid = threading.get_ident() | |
| tz = pytz.timezone(kwargs.pop('timezone', 'Europe/Moscow')) | |
| time_fmt = kwargs.pop('time_format', '%Y-%m-%d %H:%M:%S') | |
| separator = kwargs.pop('sep', ' - ') | |
| moscow_time = datetime.now(tz).strftime(time_fmt) | |
| message = separator.join(str(arg) for arg in args) | |
| print(f"[{moscow_time}]{separator}[tid={tid}]{separator}{message}", **kwargs) | |
| log("Старт сервиса") | |
| login(token=os.getenv('HF_TOKEN')) | |
| log("=" * 50) | |
| log(f"PyTorch version: {torch.__version__}") | |
| log(f"CUDA available: {torch.cuda.is_available()}") | |
| log(f"GPU count: {torch.cuda.device_count()}") | |
| if torch.cuda.is_available(): | |
| log(f"Current device: {torch.cuda.current_device()}") | |
| log(f"Device name: {torch.cuda.get_device_name(0)}") | |
| log("=" * 50) | |
| def clear_cuda(): | |
| if torch.cuda.is_available(): | |
| log(f"Используется VRAM: {torch.cuda.memory_allocated() / 1024 ** 3:.2f} GB") | |
| log(f"Доступно VRAM: {torch.cuda.memory_reserved() / 1024 ** 3:.2f} GB") | |
| log(f"Пиковое использование VRAM: {torch.cuda.max_memory_allocated() / 1024 ** 3:.2f} GB") | |
| log(f"Очистка кеша CUDA...") | |
| torch.cuda.empty_cache() | |
| torch.cuda.reset_peak_memory_stats() | |
| log(f"Очистка кеша CUDA завершена.") | |
| log(f"Используется VRAM: {torch.cuda.memory_allocated() / 1024 ** 3:.2f} GB") | |
| log(f"Доступно VRAM: {torch.cuda.memory_reserved() / 1024 ** 3:.2f} GB") | |
| log(f"Пиковое использование VRAM: {torch.cuda.max_memory_allocated() / 1024 ** 3:.2f} GB") | |
| device = "cuda" if torch.cuda.is_available() else "cpu" | |
| start_full_time = time.time() | |
| start_time = time.time() | |
| log(f"Загрузка модели FLUX.1-dev") | |
| pipe = FluxPipeline.from_pretrained( | |
| # pretrained_model_name_or_path = local_path, | |
| "black-forest-labs/FLUX.1-dev", | |
| torch_dtype=torch.bfloat16, # Используем bfloat16 для A100 | |
| # low_cpu_mem_usage=True, # Экономия памяти | |
| # device_map="balanced", | |
| # local_files_only=True | |
| # variant="fp16", | |
| use_safetensors=True | |
| ) | |
| log(f"Загрузка модели FLUX.1-dev завершена за {time.time() - start_time:.2f} секунд") | |
| start_time = time.time() | |
| log(f"Загрузка LoRA") | |
| pipe.load_lora_weights("Shakker-Labs/FLUX.1-dev-LoRA-add-details", weight_name="FLUX-dev-lora-add_details.safetensors") | |
| log(f"Загрузка LoRA завершена за {time.time() - start_time:.2f} секунд") | |
| pipe.fuse_lora(lora_scale=0.5) | |
| pipe.to(device) | |
| start_time = time.time() | |
| log(f"Загрузка модели fal/AuraSR-v2") | |
| aura_sr = AuraSR.from_pretrained("fal/AuraSR-v2") | |
| log(f"Загрузка модели fal/AuraSR-v2 завершена за {time.time() - start_time:.2f} секунд") | |
| start_time = time.time() | |
| log(f"Загрузка модели briaai/RMBG-1.4") | |
| bg_remover = pipeline("image-segmentation", "briaai/RMBG-1.4", trust_remote_code=True) | |
| log(f"Загрузка модели briaai/RMBG-1.4 завершена за {time.time() - start_time:.2f} секунд") | |
| log(f"Загрузка всех моделей завершена за {time.time() - start_full_time:.2f} секунд") | |
| def generate_image(object_name, remove_bg=True, upscale=True): | |
| try: | |
| log("Формирование промпта") | |
| object_name = translate_ru_en(object_name) | |
| prompt = create_template_prompt(object_name) | |
| # Для имитации генерации (можно заменить на реальный вызов ComfyUI API) | |
| log(f"Генерация иконки для объекта: {object_name}") | |
| log(f"Промпт: {prompt[:100]}...") | |
| # print(f"Параметры: seed={seed}, steps={steps}, размер={width}x{height}") | |
| log(f"Опции: remove_bg={remove_bg}") | |
| steps = int(os.getenv('STEPS')) if os.getenv('STEPS') is not None else 10 | |
| log(f"Шаги: {steps}") | |
| clear_cuda() | |
| start_time = time.time() | |
| log("Старт генерации изображения...") | |
| image = generate_image_stable(prompt, steps) | |
| log(f"Генерация завершена за {time.time() - start_time:.2f} секунд") | |
| if upscale: | |
| clear_cuda() | |
| start_time = time.time() | |
| log(f"Старт апскейлера...") | |
| image = aura_sr.upscale_4x_overlapped(image) | |
| log(f"Апскейлинг завершен за {time.time() - start_time:.2f} секунд") | |
| if remove_bg: | |
| clear_cuda() | |
| start_time = time.time() | |
| log(f"Старт удаления фона...") | |
| image = bg_remover(image) | |
| log(f"Фон удален за {time.time() - start_time:.2f} секунд") | |
| log(f"Генерация успешно завершена для запроса: {prompt}") | |
| clear_cuda() | |
| log(f"Отдаем готовое изображение для запроса: {prompt}") | |
| return image | |
| except Exception as e: | |
| log(f"Ошибка при генерации изображения: {e}") | |
| traceback.print_exc() | |
| clear_cuda() | |
| return None | |
| def generate_image_stable(prompt, steps): | |
| return pipe( | |
| prompt, | |
| height=1024, | |
| width=1024, | |
| guidance_scale=3.5, | |
| num_inference_steps=steps, | |
| generator=torch.Generator(device).manual_seed(0), | |
| num_images_per_prompt=1 | |
| ).images[0] | |
| def create_template_prompt(object_name): | |
| template = load_text("prompt.txt") | |
| return template.format(object_name=object_name) | |
| def translate_ru_en(text: str): | |
| try: | |
| # Проверка на кириллицу (если включено) | |
| if not any('\u0400' <= char <= '\u04FF' for char in text): | |
| return text | |
| # Создаем переводчик | |
| translator = GoogleTranslator(source="ru", target="en") | |
| # Выполняем перевод | |
| return translator.translate(text) | |
| except Exception as e: | |
| log(f"Ошибка перевода: {e}") | |
| traceback.print_exc() | |
| return text | |
| def load_text(file_name): | |
| with open(file_name, 'r', encoding='utf-8') as f: | |
| return f.read() | |
| custom_css = load_text("style.css") | |
| # Создание интерфейса Gradio | |
| with gr.Blocks(title="3D Icon Generator", css=custom_css, theme=gr.themes.Soft()) as app: | |
| gr.Markdown("# iconDDDzilla") | |
| gr.Markdown("### Create 3d icons with transparent background in one click!") | |
| with gr.Row(): | |
| with gr.Column(): | |
| # Входные параметры | |
| object_input = gr.Textbox(label="Object name", | |
| placeholder="Type object name (for example: calendar, phone, camera)") | |
| remove_bg_checkbox = gr.Checkbox(label="Remove background", value=True) | |
| upscale = gr.Checkbox(label="Upscale", value=True) | |
| # with gr.Accordion("Расширенные настройки", open=False): | |
| # custom_prompt = gr.Textbox(label="Пользовательский промпт", placeholder="Оставьте пустым для использования шаблона", lines=3) | |
| # | |
| # with gr.Row(): | |
| # seed = gr.Number(label="Seed", value=276789180904019, precision=0) | |
| # steps = gr.Slider(minimum=1, maximum=5, value=5, step=1, label="Шаги") | |
| # | |
| # with gr.Row(): | |
| # width = gr.Slider(minimum=512, maximum=2048, value=1024, step=64, label="Ширина") | |
| # height = gr.Slider(minimum=512, maximum=2048, value=1024, step=64, label="Высота") | |
| # | |
| # with gr.Row(): | |
| # #upscale_checkbox = gr.Checkbox(label="Применить апскейл", value=True) | |
| # remove_bg_checkbox = gr.Checkbox(label="Удалить фон", value=False) | |
| # Кнопка генерации | |
| generate_btn = gr.Button("Run") | |
| with gr.Column(): | |
| # Выходное изображение | |
| output_image = gr.Image(label="Image") | |
| # Примеры использования | |
| # examples = gr.Examples( | |
| # examples=[ | |
| # ["calendar", "", 276789180904019, 5, 1024, 1024, True], | |
| # ["camera", "", 391847529184, 5, 1024, 1024, True], | |
| # ["smartphone", "", 654321987654, 5, 1024, 1024, True], | |
| # ["headphones", "", 123456789012, 5, 1024, 1024, True], | |
| # ], | |
| # inputs=[ | |
| # object_input, | |
| # custom_prompt, | |
| # seed, | |
| # steps, | |
| # width, | |
| # height, | |
| # #upscale_checkbox, | |
| # remove_bg_checkbox | |
| # ], | |
| # outputs=[output_image], | |
| # fn=generate_image, | |
| # ) | |
| # Информация о моделях | |
| # with gr.Accordion("Информация о используемых моделях", open=False): | |
| # gr.Markdown(""" | |
| # ## Используемые модели | |
| # | |
| # - **Основная модель:** [flux1-dev-fp8.safetensors](https://huggingface.co/lllyasviel/flux1_dev/blob/main/flux1-dev-fp8.safetensors) от Stability AI | |
| # - **Модель апскейла:** [4x_NMKD-Superscale-SP_178000_G.pth](https://huggingface.co/gemasai/4x_NMKD-Superscale-SP_178000_G) для улучшения качества изображения | |
| # - **Модель удаления фона:** [RMBG-1.4](https://huggingface.co/briaai/RMBG-1.4) для качественного удаления фона | |
| # | |
| # Все модели автоматически загружаются при первом запуске приложения. | |
| # """) | |
| # Привязка функции к нажатию кнопки | |
| generate_btn.click( | |
| fn=generate_image, | |
| inputs=[ | |
| object_input, | |
| # custom_prompt, | |
| # seed, | |
| # steps, | |
| # width, | |
| # height, | |
| remove_bg_checkbox, | |
| upscale | |
| ], | |
| outputs=[output_image] | |
| ) | |
| # Запуск приложения | |
| if __name__ == "__main__": | |
| app.launch() |