Дообучення Stable Diffusion методом LoRA

Fine-tuning Stable Diffusion через LoRA

Напрямки AI-розробки

Часті запитання

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1440
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    997
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1264
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    712
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    1002

Fine-tuning Stable Diffusion через LoRA

Ви витратили тижні на збір датасету з 200 зображень в унікальному стилі, але повний fine-tuning SDXL потребує 24 GB VRAM і займає години. LoRA (Low-Rank Adaptation) вирішує цю проблему: адаптер важить 10–150 MB, навчається за 30–120 хвилин на звичайній RTX 3090 і легко комбінується з іншими LoRA. Економія часу сягає 80%, а витрати на GPU знижуються до 90% — повний fine-tuning SDXL коштує $500-1000 за запуск, тоді як LoRA — $50-200. Ми використовуємо цей підхід у всіх проектах з персоналізації генерації зображень — від стилів художників до каталогів товарів. Навчання LoRA коштує від 50 до 200 доларів, що в 5-10 разів дешевше повного fine-tuning і забезпечує економію $450-800 на один запуск.

Чому LoRA є найкращим вибором для дообучення Stable Diffusion?

Метод fine-tuning lora змінює лише дельта-матриці ваг, а не всю модель, як описано в оригінальній роботі LoRA: Low-Rank Adaptation of Large Language Models. Завдяки низькоранговому розкладу (SVD) кількість параметрів, що навчаються, скорочується в 1000+ разів порівняно з повним fine-tuning. Це дає три ключові переваги: мінімальний розмір файлу (10–150 MB), швидке навчання (30–120 хв) і можливість комбінувати до 5 LoRA одночасно з різними вагами. LoRA краще DreamBooth в 2-3 рази за швидкістю навчання та в 10 разів менша за розміром. Для порівняння: DreamBooth вимагає зберігати повну модель (6–7 GB) і не підтримує композицію стилів. При комбінуванні кількох LoRA досягається якість, недоступна одній моделі. Використання LoRA для SD (Stable Diffusion) дозволяє швидко персоналізувати генерацію.

Параметр DreamBooth LoRA
Змінює Всю модель Тільки дельта-матриці
Розмір результату 6–7 GB 10–150 MB
Час навчання 30–60 хв 30–120 хв
Комбінування Ні До 5 LoRA одночасно
Застосування Одна модель Будь-яка сумісна

Як ми навчаємо LoRA для ваших завдань: покрокова інструкція

  1. Аналіз завдання та датасету. Визначаємо цільовий стиль або об'єкт, мінімальну кількість референсів (20–200 зображень). Оцінюємо якість: зображення мають бути різноманітними, щоб уникнути перенавчання (overfitting).
  2. Підготовка зображень. Очищення, кроп, автопідпис за допомогою BLIP captioning. Для підписів використовуємо тригерне слово, що прискорює підготовку в 5 разів. Важливо: датасет має містити не лише однотипні фото, інакше модель не зможе генералізувати.
  3. Налаштування гіперпараметрів. Встановлюємо rank (16–64) і alpha (половина rank), learning rate (1e-4), кількість епох (10–20). Rank 32 — універсальний вибір для більшості завдань. Для складних стилів збільшуємо rank до 64, для простих — 16. Ми також використовуємо градієнтне накопичення (gradient accumulation) для ефективного використання пам'яті при великих batch sizes та оптимізатор AdamW з планувальником швидкості навчання (cosine scheduler). Ці техніки підвищують стабільність навчання та якість LoRA-адаптерів.
  4. Навчання. Запускаємо процес на GPU з 10+ GB VRAM, використовуючи інструмент kohya lora — kohya-ss/sd-scripts. Навчання 1000 кроків на RTX 3090 займає 20–40 хвилин. Застосовуємо регуляризацію (weight decay) для запобігання перенавчанню.
  5. Тестування та ітерація. Генеруємо 50+ промптів, підбираємо ваги при комбінуванні кількох LoRA. При необхідності коригуємо датасет і перенавчаємо. Фіксуємо демо-приклади та документацію.

Приклад налаштування для kohya-ss/sd-scripts (конфігурація для навчання LoRA для SDXL):

# kohya-ss/sd-scripts — стандарт навчання LoRA git clone https://github.com/kohya-ss/sd-scripts cd sd-scripts pip install -r requirements.txt python train_network.py \ --pretrained_model_name_or_path="stabilityai/stable-diffusion-xl-base-1.0" \ --dataset_config="dataset.toml" \ --output_dir="./lora_output" \ --output_name="my_style_v1" \ --network_module="networks.lora" \ --network_dim=32 \ --network_alpha=16 \ --learning_rate=1e-4 \ --max_train_epochs=10 \ --train_batch_size=2 \ --save_every_n_epochs=2 \ --mixed_precision="fp16" \ --xformers 
dataset.toml (натисніть для перегляду)
[general] shuffle_caption = true caption_dropout_rate = 0.05 [[datasets]] resolution = 1024 batch_size = 2 [[datasets.subsets]] image_dir = "./training_images" caption_extension = ".txt" num_repeats = 10 

Автоматичний підпис зображень за допомогою BLIP captioning

from transformers import BlipProcessor, BlipForConditionalGeneration from PIL import Image import os processor = BlipProcessor.from_pretrained("Salesforce/blip-image-captioning-large") caption_model = BlipForConditionalGeneration.from_pretrained("Salesforce/blip-image-captioning-large") def auto_caption_dataset( images_dir: str, trigger_word: str = "mystyle", style_suffix: str = "in the style of mystyle" ) -> None: for img_file in os.listdir(images_dir): if not img_file.endswith((".jpg", ".png", ".webp")): continue img = Image.open(os.path.join(images_dir, img_file)).convert("RGB") inputs = processor(img, return_tensors="pt") caption = processor.decode( caption_model.generate(**inputs, max_new_tokens=50)[0], skip_special_tokens=True ) full_caption = f"{trigger_word}, {caption}, {style_suffix}" txt_path = os.path.join(images_dir, img_file.rsplit(".", 1)[0] + ".txt") with open(txt_path, "w", encoding="utf-8") as f: f.write(full_caption) 

Комбінування кількох LoRA для складних сцен

from diffusers import StableDiffusionXLPipeline import torch pipe = StableDiffusionXLPipeline.from_pretrained( "stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16 ).to("cuda") pipe.load_lora_weights("style_lora.safetensors", adapter_name="style") pipe.load_lora_weights("character_lora.safetensors", adapter_name="character") pipe.set_adapters(["style", "character"], adapter_weights=[0.7, 0.5]) image = pipe( "mystyle character, cinematic scene, detailed background", guidance_scale=7.5, num_inference_steps=30 ).images[0] 

Які типові приклади використання LoRA?

Для стилю LoRA художника потрібно 50–200 зображень в цільовому стилі — LoRA SD відтворює його на нових промптах. Наприклад, для стилю «кіберпанк-арт» достатньо 80 зображень з високим rank (64). Для конкретного продукту потрібно 20–50 фото товару з підписами — LoRA генерує товар в різних сценах. Ми застосовували такий підхід для каталогу меблів: одна LoRA замінила 3 години ручного фотозйомки. Для персонажа (аніме або гра) — 30–100 зображень персонажа, LoRA відтворює його в різних позах. Комбінуючи з LoRA стилю, створюємо унікальні арти.

Що входить в роботу з дообучення SD через LoRA

Етап Опис Результат
Аналіз завдання Визначаємо цільовий стиль/об'єкт, кількість референсів Технічне завдання
Підготовка датасету Очищення, кроп, автопідпис BLIP 20–200 розмічених зображень
Навчання LoRA rank 16–64, 500–2000 кроків на GPU .safetensors файл
Тестування Генерація 50+ промптів, підбір ваг Демо-приклади
Документація Інструкція з використання LoRA markdown-файл

Терміни і вартість

Орієнтовні терміни: навчання однієї LoRA (1000 кроків на RTX 3090) — 20–40 хвилин. Повноцінний сервіс з користувацьким навчанням — 3–4 тижні. Вартість розраховується індивідуально, орієнтовний діапазон — $300-1000 за одну LoRA. Зв'яжіться з нами, оцінимо ваш проект безкоштовно.

Наш досвід: понад 5 років в AI/ML, десятки успішних проектів з fine-tuning для різних галузей. Гарантуємо якість навчання та підтримку всіх популярних моделей: SDXL, SD 1.5, SD 3, FLUX.1. Отримайте консультацію — допоможемо підібрати оптимальні параметри навчання під ваш датасет.