🧠NAS как ИИ-сервер
🎨
Фаза 9 · генерацияС оговорками

Картинки по описанию

Пишешь «рыжий кот спит на подоконнике, за окном идёт снег», и через пару минут NAS выдаёт картинку. Проверили четыре модели — от старенькой SD-Turbo до свежих FLUX.2/FLUX.3 Klein и Z-Image. По пути выяснили, что встроенная графика Intel умеет удивлять, причём не всегда приятно.

Берём FLUX.2 Klein 4B на SYCL — ~3 минуты на картинку 768×768, понимает русский и пишет текст
Сухие цифры и методика →

Генерацией картинок занимается stable-diffusion.cpp: он запускает те же модели, что и большие сервисы, но на обычном железе. Промптов было 32: 24 английских и 8 русских. Среди них есть ловушки — надписи («OPEN 24 HOURS»), счёт («три зелёных яблока и одно красное»), расположение («синий куб на жёлтом шаре») и очень русские вещи: самовар, матрёшки, «Булочная».

~3 минFLUX.2 Klein на картинку 768×768
10 сSD-Turbo на 512×512, но без русского
8 ГБпамяти на генерацию
3 из 4моделей рисовали шум — пока не нашли обход

Сравни сам

Слева направо: SD-Turbo, FLUX.2 Klein, Z-Image Turbo и FLUX.3 Klein. Нажми на картинку, чтобы рассмотреть.

SD-Turbo
FLUX.2 Klein
Z-Image
FLUX.3 Klein
«A street sign that says "OPEN 24 HOURS"»
SD-TurboFLUX.2 KleinZ-ImageFLUX.3 Klein
«Three green apples and one red apple on a wooden table»
SD-TurboFLUX.2 KleinZ-ImageFLUX.3 Klein
«A blue cube on top of a yellow sphere, plain grey background»
SD-TurboFLUX.2 KleinZ-ImageFLUX.3 Klein
«A smartphone screen showing a weather app with a big sun icon and "25°C"»
SD-TurboFLUX.2 KleinZ-ImageFLUX.3 Klein
«Вывеска магазина с надписью «Булочная»»A shop sign with the word "Bulochnaya" in Cyrillic
SD-TurboFLUX.2 KleinZ-ImageFLUX.3 Klein
«Самовар на деревянном столе, рядом связка баранок»A samovar on a wooden table next to a bunch of bagels
SD-TurboFLUX.2 KleinZ-ImageFLUX.3 Klein
«Матрёшки разных размеров стоят в ряд на полке»Matryoshka dolls of different sizes standing in a row on a shelf
SD-TurboFLUX.2 KleinZ-ImageFLUX.3 Klein
«Тарелка борща со сметаной и кусок чёрного хлеба»A plate of borscht with sour cream and a slice of black bread
SD-TurboFLUX.2 KleinZ-ImageFLUX.3 Klein
«Трамвай едет по заснеженной улице вечернего города»A tram driving down a snowy street in the city at evening
SD-TurboFLUX.2 KleinZ-ImageFLUX.3 Klein
«Рыжий кот спит на подоконнике, за окном идёт снег»A ginger cat sleeping on a windowsill, snow falling outside
SD-TurboFLUX.2 KleinZ-ImageFLUX.3 Klein
«Деревянная церковь на берегу озера на закате»A wooden church on a lake shore at sunset
SD-TurboFLUX.2 KleinZ-ImageFLUX.3 Klein
«Pixel art of a small spaceship flying past a planet»
SD-TurboFLUX.2 KleinZ-ImageFLUX.3 Klein

Что видно:

Сколько ждать

SD-Turbo делает картинку за один шаг на 512 px, остальные — 4–16 шагов на 768 px.

Минута из этого времени — запуск процесса. Почему мы не держим модель загруженной, как LLM, — ниже, в истории с подвохом. FLUX.2 Klein вдвое быстрее остальных при почти том же качестве, поэтому для дома выбор очевиден.

Около нуля и ниже — картинка не имеет отношения к промпту: шум, или модель не поняла язык. Тонкую разницу между хорошими моделями эта метрика не видит — смотри глазами.

История с подвохом

Сначала мы запустили всё через Vulkan, как и LLM, и получили вот это:

Детективная часть:

  1. На Vulkan FLUX и Z-Image рисуют цветной шум. SD-Turbo при этом работает нормально. Перенос на CPU текстового энкодера ничего не дал, f16-веса тоже. Перенос на CPU VAE дал белый лист.
  2. Если вынести на CPU саму диффузионную модель, получается нормальная лиса, но за 6 минут на маленькой картинке. Значит, на Vulkan ломается именно диффузия.
  3. У Intel есть второй путь к iGPU — SYCL (oneAPI). На нём всё заработало, причём в 6 раз быстрее, чем на CPU.
  4. Но сервер на SYCL зависает на второй картинке. Поэтому каждая картинка рисуется в свежем процессе, и минута уходит на запуск.
  5. На 768 px SYCL декодировал только полосу посередине кадра. Сверху выходила блёклая фиолетовая копия, снизу ровный серый. Вылечилось флагом --vae-tiling: картинка декодируется по кусочкам.

iGPU — один на всех

Пока идёт генерация, встроенная графика занята целиком. Когда параллельно работала языковая модель, генерация падала с нехваткой памяти. Если ставить генерацию рядом с ассистентом, ей нужна своя очередь.

Все картинки FLUX.2 Klein

Все 32 промпта — и простые, и с подвохом: