Заставки замість новин: тестую відкриті генеративні моделі на Kaggle

💡 Усі статті, обговорення, новини про AI — в одному місці. Приєднуйтесь до AI спільноти!

Коли над головою літають дрони і останнім часом таски не такі цікаві, потрібно щось на що можна відволіктися і перезавантажитися. Я не буду давати поради, що варто робити, а що ні — просто напишу, що мені допомагає, окрім донатів на русоріз. Я відволікаюся створенням заставок на робочий стіл, і чим вони різноманітніші — тим краще. Тому тут хочу поділитися результатом тестування декількох відкритих генеративних моделей:

  • Lykon/dreamshaper-xl-v2-turbo — файнтюн SDXL, «заточений» під швидку 8-кроквову генерацію (turbo-режим), ліцензія OpenRAIL++ дозволяє комерційне використання.
  • stabilityai/stable-diffusion-xl-base-1.0 — базова, «ванільна» SDXL від Stability AI без жодних файнтюнів, теж під OpenRAIL++. Цікаво було подивитися, що саме дає файнтюн DreamShaper порівняно з чистою базовою моделлю.
  • black-forest-labs/FLUX.1-schnell — новіша модель від Black Forest Labs на rectified-flow архітектурі, дистильована спеціально під 1–4 кроки генерації, ліцензія Apache-2.0. Репозиторій гейтований, тобто потрібно один раз прийняти умови на huggingface.co і мати HF API token, щоб завантажити модель.

Я запускав їх у Kaggle notebook, на одному й тому самому промпті, seed і з однаковим апскейлом — щоб порівняння було чесним. Нижче — як саме і що з цього вийшло.

Я вже якийсь час генерую заставки для робочого столу (природа, море, гори, ліси, небо) за допомогою DreamShaper XL v2 Turbo — швидка модель, 8 кроків, ліцензія OpenRAIL++, дозволяє комерційне використання. Готові результати я викладаю у своєму магазині на Ko-fi, частину можна забрати безкоштовно, частину — за донат.

Але в якийсь момент виникло питання: а чи справді DreamShaper — оптимальний вибір, чи інша відкрита модель впорається краще на тих самих промптах? Тому вирішив зробити чесне порівняння: один і той самий промпт, той самий seed, той самий апскейл — і подивитися, що вийде.

Я запускав їх у Kaggle notebook, на одному й тому самому промпті, seed і з однаковим апскейлом — щоб порівняння було чесним.

Ціль: порівняти швидкість і результат — візуально, суб’єктивно.

Нижче — як саме і що з цього вийшло.

Умови тесту

Усе крутиться на одному Kaggle GPU T4 (16GB) — моделі завантажуються по черзі й вивантажуються з пам’яті перед стартом наступної, інакше на 16GB усі три одночасно просто не влізуть.

Промпти взяв однакові для всіх моделей, з однаковим seed = 42 і роздільною здатністю 1024×1024:

Плюс єдиний негативний промпт, що прибирає людей, тварин, текст і артефакти — я його теж використовую в продакшні для всіх пейзажних заставок.

COMPARISON_PROMPTS = {
    "sea":       "A vast turquoise sea with gentle rolling waves under a clear blue sky, sunlight glittering on the water surface, aerial drone photograph, natural color grading.",
    "mountains": "A dramatic mountain range at sunrise, snow-capped peaks glowing pink and orange as the first light hits them, layered ridgelines fading into haze.",
    "forests":   "A dense old-growth forest with tall pine trees and shafts of golden sunlight breaking through the canopy, soft ground mist, cinematic nature photography.",
    "sky":       "A dramatic sunset sky with layered orange, pink, and purple clouds stretching to the horizon, unobstructed wide open view, vivid natural color.",
}

NEGATIVE_PROMPT = (
    "people, humans, person, man, woman, child, baby, crowd, face, hands, body, figure, silhouette of a person, portrait, selfie, "
    "animals, birds, fish, insects, bugs, butterflies, bees, pets, wildlife, creatures, livestock, horses, dogs, cats, "
    "cartoon, illustration, painting, drawing, anime, 3d render, cgi, artificial, fake, plastic looking, "
    "text, watermark, signature, logo, ugly, worst quality, low quality, blurry, "
    "error, cropped, lowres, overexposed, underexposed, oversaturated, deformed, distorted, "
    "duplicate, extra elements, generic stock photo look, flat lighting"
)

SEED = 42
WIDTH, HEIGHT = 1024, 1024

Крок 1. Підготовка середовища

Ставлю потрібні бібліотеки — diffusers, transformers, accelerate, xformers, realesrgan, bitsandbytes та інше:

!pip install -q diffusers transformers accelerate xformers realesrgan basicsr sentencepiece protobuf ftfy bitsandbytes

FLUX.1-schnell — гейтований репозиторій на Hugging Face, тому окремо потрібно один раз прийняти умови на huggingface.co і покласти токен у Kaggle Secrets (HF_TOKEN), щоб не світити його прямо в коді:

from huggingface_hub import login
from kaggle_secrets import UserSecretsClient

hf_token = UserSecretsClient().get_secret("HUGGINGFACE_TOKEN")
login(token=hf_token)

Крок 2. Однакові умови генерації для всіх моделей

Пишу одну спільну функцію run_prompts, яка для вже завантаженого пайплайна проганяє всі чотири промпти, зберігає «сирий» результат і одразу апскейлить його через Real-ESRGAN x4. Заодно функція міряє час генерації і час апскейлу окремо для кожного зображення — це знадобиться далі для порівняння швидкості.

Крок 3. Прогін кожної моделі

Для кожної моделі — окремий блок: завантаження, налаштування (свій scheduler, свій VAE за потреби, свої кроки/guidance), генерація, вивантаження з пам’яті.

DreamShaper XL v2 Turbo — DPM++ SDE Karras scheduler, 8 кроків, guidance 2.0, з негативним промптом.

SDXL 1.0 base — ванільна модель. Важливий нюанс: стоковий VAE SDXL у fp16 «пливе» і дає засвічені смугасті артефакти, тому підключаю виправлений VAE (madebyollin/sdxl-vae-fp16-fix). Параметри — 30 кроків, guidance 7.0, той самий негативний промпт.

FLUX.1-schnell — найважчий кандидат: 12B-параметрів трансформер + T5-XXL текстовий енкодер. У fp16 це близько 33GB, що не влазить у 16GB відеокарти й одразу валить ядро Kaggle. Рішення — квантизація в NF4 через bitsandbytes під час завантаження, для трансформера і текстового енкодера окремо. Схнелл — дистильована модель, тому їй достатньо 4 кроків і guidance 0.0, негативний промпт тут узагалі не використовується (архітектурно не потрібен).

Після кожної моделі — явне вивантаження пайплайна й torch.cuda.empty_cache(), інакше пам’яті на другу модель просто не залишиться.

Крок 4. Зведена таблиця результатів

Усі шляхи до файлів, час генерації і час апскейлу для кожної пари «модель + категорія» складаю в один results.json — щоб потім можна було і зображення звести в таблицю, і порахувати середню швидкість.

Крок 5. Грід-порівняння зображень

Рядки — категорія промпту (море/гори/ліс/небо), колонки — модель. Це фінальна «hero»-картинка порівняння: беру саме апскейлені версії, бо це те, що реально отримує людина, яка завантажує заставку з магазину.

image

Що впадає в очі на однакових промптах і seed:

  • Море. DreamShaper дає класичний «дрон-фото» ракурс з чіткими лініями хвиль. SDXL 1.0 — схожа композиція, але темніша й контрастніша, ближче до штормового настрою. FLUX — найяскравіша й найнасиченіша бірюза з трьох, картинка «ближча» до глядача.
  • Гори. У DreamShaper — теплий рожево-помаранчевий світанок, природні кольори. SDXL 1.0 витягує ту саму сцену в дуже насичений червоний — виглядає ефектно, але вже менш реалістично. FLUX іде в холодну сторону — сині й фіолетові відтінки, туманні хребти, взагалі інший настрій з того самого промпту.
  • Ліс. Усі три впорались із променями світла крізь крони непогано. DreamShaper — м’якший і туманніший. SDXL 1.0 — темніший і драматичніший. FLUX — найяскравіші й найчіткіші промені, трохи «глянцевіша» картинка.
  • Небо. DreamShaper — збалансований помаранчево-рожевий захід. SDXL 1.0 знову тягне у фіолетово-червону драму. FLUX — найяскравіші й найконтрастніші кольори з трьох, майже «постер»-ефект.

Загальна тенденція: SDXL 1.0 base послідовно перетягує кольори у драматичнішу, темнішу гаму (навіть із тим самим негативним промптом і guidance 7.0 — очевидно, дається взнаки відсутність файнтюну під конкретний стиль), FLUX.1-schnell — найнасиченіші й найконтрастніші кольори, ближче до «постерного» стилю, а DreamShaper XL Turbo тримається найближче до природних, фотореалістичних кольорів — що логічно, бо він і файнтюнений під такий стиль пейзажів.

Крок 6. Порівняння швидкості

Швидкість тут не другорядна метрика: по-перше, це реальний бюджет часу на Kaggle-сесію.

Рахую середній час генерації і середній час апскейлу окремо для кожної моделі та будую bar-чарт:

image

Середні значення по чотирьох промптах (генерація на GPU T4, 1024×1024, апскейл — Real-ESRGAN x4):

МодельГенерація, секАпскейл, секРазом, сек
dreamshaperxlturbo15.68.3~24
sdxl10_base36.19.0~45
flux1schnell35.19.0~44

Найцікавіше тут не те, що DreamShaper швидший — це очікувано, у нього вдвічі-втричі менше кроків. Цікаво, що FLUX.1-schnell з його 4 кроками генерується так само довго, як SDXL 1.0 base з 30 кроками. Дистиляція під малу кількість кроків не дала виграшу в реальному часі — весь час «з’їдає» сам розмір моделі: 12B-параметровий трансформер плюс T5-XXL текстовий енкодер, навіть у NF4-квантизації, обробляють один крок значно довше, ніж SDXL-шний UNet. На практиці для сценарію «генерація заставки на льоту» це означає, що FLUX не дає прискорення, яке від нього очікуєш на слабшому GPU типу T4 — виграш від малої кількості кроків з’являється тільки на потужнішому залізі, де вартість одного кроку не є боттлнеком.

Апскейл (Real-ESRGAN, той самий для всіх) займає майже однаковий час незалежно від моделі — це очікувано, бо на вхід іде однакове за розміром зображення 1024×1024.

Висновки

А висновків не буде. Побільше посміхайтеся і як кажуть в кінці все буде добре, якщо зараз не добре то це ще не кінець. Тримаймося.

Повний код, усі параметри та логи виконання — у Kaggle-ноутбуці. А готові заставки, можна знайти на Ko-fi.

👍ПодобаєтьсяСподобалось6
До обраногоВ обраному2
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

вже рік на кегл не заходив, треба зайти провідати — дякую за нагадування і статтю