Заставки замість новин: тестую відкриті генеративні моделі на Kaggle
Коли над головою літають дрони і останнім часом таски не такі цікаві, потрібно щось на що можна відволіктися і перезавантажитися. Я не буду давати поради, що варто робити, а що ні — просто напишу, що мені допомагає, окрім донатів на русоріз. Я відволікаюся створенням заставок на робочий стіл, і чим вони різноманітніші — тим краще. Тому тут хочу поділитися результатом тестування декількох відкритих генеративних моделей:
- 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»-картинка порівняння: беру саме апскейлені версії, бо це те, що реально отримує людина, яка завантажує заставку з магазину.

Що впадає в очі на однакових промптах і 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-чарт:

Середні значення по чотирьох промптах (генерація на GPU T4, 1024×1024, апскейл — Real-ESRGAN x4):
| Модель | Генерація, сек | Апскейл, сек | Разом, сек |
|---|---|---|---|
| dreamshaperxlturbo | 15.6 | 8.3 | ~24 |
| sdxl10_base | 36.1 | 9.0 | ~45 |
| flux1schnell | 35.1 | 9.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.
1 коментар
Додати коментар Підписатись на коментаріВідписатись від коментаріввже рік на кегл не заходив, треба зайти провідати — дякую за нагадування і статтю