Это исходный отчёт фазы как есть — со всеми таблицами и методикой. Живая версия: 🎨 Картинки по описанию.
Фаза 9: генерация картинок
Прогон: 22–23 октября 2026
Хост: UGREEN DXP4800 Pro, i3-1315U, 32 GB, iGPU Intel RPL-U (Xe-LP, 64 EU)
Что меряли: можно ли на встроенной графике NAS генерировать картинки по текстовому описанию, сколько это занимает и насколько картинки соответствуют промпту, в том числе русскому.
Коротко
- Генерировать картинки на этом iGPU можно, но медленно и только через SYCL. FLUX.2 Klein 4B рисует картинку 768×768 за ~3 мин, Z-Image Turbo — за ~6 мин, FLUX.3 Image Klein — за ~8 мин (вместе с ~1 мин на запуск процесса). Памяти — около 8 GiB.
- Качество у трёх современных моделей хорошее и почти одинаковое. Все три пишут текст на картинке («OPEN 24 HOURS», «25°C»), правильно считают и раскладывают цвета («три зелёных яблока и одно красное», «синий куб на жёлтом шаре») и понимают русские промпты: кот на подоконнике, деревянная церковь, матрёшки, трамвай. SigLIP2 по 8 общим английским промптам — 0.21 у всех трёх.
- Лучше всех по-русски — Z-Image Turbo: идеальная надпись «Булочная» и настоящий самовар. FLUX.3 тоже пишет «Булочная», но самовар у него — чайник, а борщ — фасолевый суп. FLUX.2 пишет «Булочна» и путает баранки с луком.
- Для дома разумный выбор — FLUX.2 Klein: вдвое быстрее Z-Image и почти не хуже.
- SD-Turbo — 10 секунд на картинку 512×512 на Vulkan, но это другой класс. Текст превращается в абракадабру («O PDFENN 20FOINULSS»), счёт и цвета путаются, русские промпты не понимает вовсе: «самовар», «матрёшки», «борщ» — европейские улицы (SigLIP2 на русских промптах −0.02, уровень шума).
- На Vulkan современные модели рисуют чистый шум. FLUX.2 Klein, Z-Image и FLUX.3 через stable-diffusion.cpp (
master-vulkan) на этом iGPU выдают цветной шум (SigLIP2 около −0.03). Ломается сама диффузионная модель: если вынести на CPU только её, картинка нормальная (но 6 минут на 512×512); текстовый энкодер на CPU и веса в f16 не помогают. - SYCL работает, но с двумя обходами.
sd-serverна SYCL зависает на втором запросе, поэтому каждая картинка рисуется в свежем процессеsd-cli(~1 мин на старт). А на 768 px VAE без--vae-tilingдекодирует только среднюю полосу кадра.
Как мерили
- Промпты (
prompts.jsonl): 24 английских (животные, еда, интерьеры, счёт и цвета — «три зелёных яблока и одно красное», «синий куб на жёлтом шаре», — текст на картинке — «OPEN 24 HOURS», «25°C», — стили) и 8 русских с английским переводом («Самовар на деревянном столе, рядом связка баранок», «Вывеска магазина с надписью «Булочная»» и т. п.). - Модели:
- SD-Turbo — 1 шаг, 512 px;
- FLUX.2 Klein 4B Q8_0 + Qwen3-4B как текстовый энкодер — 4 шага, 768 px;
- Z-Image Turbo Q4_K + Qwen3-4B-Instruct — 8 шагов, 768 px;
- FLUX.3 Image Klein Q4_K + Qwen3-VL-4B — 16 шагов, 768 px.
- Рантайм: stable-diffusion.cpp, образы
master-vulkanиmaster-sycl(22.10.2026),--cfg-scale 1.0, seed 42.- Vulkan —
sd-server, API/sdapi/v1/txt2img, картинки по одной (img_client.py). - SYCL —
sd-cli, свежий процесс на каждую картинку (img_cli.py).
- Vulkan —
- Соответствие промпту — SigLIP2 (
ViT-B-16-SigLIP2__webliчерез Immich ML,clip_score.py): косинус между картинкой и текстом промпта. Для русских промптов — и по самому промпту, и по переводу. - Ограничения выборки: FLUX.2 Klein — все 32 промпта; Z-Image и FLUX.3 (в 2–3 раза медленнее) — 16: счёт и цвета, текст, фэнтези-карта, пиксель-арт и все 8 русских.
- Воспроизведение: на NAS
run_img.sh fetch | gen | score,chain.sh,sd_diag.sh(диагностика),rerun_sycl.sh+img_cli.py(SYCL); таблицы генерируетpython3 make_report.py.
Скорость, память, соответствие промпту
«С/картинку» — медиана полного времени на картинку (у sd-cli с запуском процесса, ~1 мин на старт SYCL); «генерация» — время самой генерации по логу sd.cpp. SigLIP2 — косинус между картинкой и промптом (ViT-B-16-SigLIP2, та же модель, что для поиска в Immich), среднее; для русских промптов — по самому промпту и по его английскому переводу; «8 общих» — английские промпты, которые есть у всех моделей. У шума SigLIP2 около −0.03, у осмысленных картинок 0.15–0.22.
| Модель | Как запускали | Размер | Шагов | Картинок | С/картинку | Генерация, с | RAM, GiB | SigLIP2 en: все / 8 общих | SigLIP2 ru / ru→en | Результат |
|---|---|---|---|---|---|---|---|---|---|---|
| SD-Turbo | Vulkan, sd-server | 512 | 1 | 32 | 10.2 | — | 6.0 | 0.176 / 0.173 | -0.022 / -0.025 | картинки |
| FLUX.2 Klein 4B | Vulkan, sd-server | 768 | 4 | 32 | 105.4 | — | 12.4 | -0.020 / 0.021 | -0.014 / -0.037 | шум |
| Z-Image Turbo | Vulkan, sd-server | 768 | 8 | 32 | 234.1 | — | 12.2 | -0.038 / -0.004 | -0.026 / -0.057 | шум |
| FLUX.3 Image Klein | Vulkan, sd-server | 768 | 16 | 11 | 381.9 | — | 11.5 | -0.025 / 0.003 | — / — | шум |
| FLUX.2 Klein 4B | SYCL, sd-cli, --vae-tiling | 768 | 4 | 32 | 189.3 | 125.9 | 8.4 | 0.190 / 0.213 | 0.162 / 0.188 | картинки |
| Z-Image Turbo | SYCL, sd-cli, --vae-tiling | 768 | 8 | 16 | 349.3 | 285.8 | 8.1 | 0.208 / 0.208 | 0.161 / 0.185 | картинки |
| FLUX.3 Image Klein | SYCL, sd-cli, --vae-tiling | 768 | 16 | 16 | 471.9 | 408.6 | 8.2 | 0.209 / 0.209 | 0.140 / 0.159 | картинки |
Диагностика: где ломается Vulkan
Одна картинка 512×512 (промпт «A red fox sitting in fresh snow at sunrise»), каждый вариант в свежем процессе sd-cli. «Генерация» — по логу sd.cpp, без запуска процесса.
| Модель | Вариант | Результат | Генерация, с |
|---|---|---|---|
| FLUX.2 Klein | всё на Vulkan | шум | 103.0 |
| FLUX.2 Klein | текстовый энкодер на CPU | шум | 112.1 |
| FLUX.2 Klein | VAE на CPU | белый лист | 138.1 |
| FLUX.2 Klein | диффузия на CPU | нормальная картинка | 339.0 |
| FLUX.2 Klein | веса в f16 (--type f16) |
шум | 108.1 |
| FLUX.2 Klein | всё на CPU | нормальная картинка | 374.4 |
| FLUX.2 Klein | всё на SYCL | нормальная картинка | 58.6 |
| Z-Image Turbo | всё на Vulkan | шум | 188.6 |
| Z-Image Turbo | текстовый энкодер на CPU | шум | 185.4 |
| Z-Image Turbo | VAE на CPU | шум | 219.3 |
| Z-Image Turbo | всё на SYCL | нормальная картинка | 122.6 |
| FLUX.3 Image Klein | всё на SYCL | нормальная картинка | 178.4 |
Выводы и рекомендации
- Если нужна генерация картинок на NAS — FLUX.2 Klein 4B через
sd-cliна SYCL с--vae-tiling: ~3 мин на картинку 768×768, понимает русский, пишет текст. Это режим «заказал и пошёл пить чай», не интерактив. - Для быстрых черновиков — SD-Turbo на Vulkan (10 с), но только по-английски и без текста на картинке.
- iGPU занят целиком: во время генерации запускать LLM или VLM нельзя — в нашем случае параллельная модель на iGPU роняла генерацию («failed during weight preparation»). Если генерация нужна вместе с ассистентом, её надо ставить в очередь.
- SigLIP2 как метрика соответствия промпту отделяет шум и непонимание языка (около нуля) от осмысленных картинок (0.15–0.22), но тонкую разницу между хорошими моделями не видит: SD-Turbo с абракадаброй вместо текста получает 0.17 против 0.21. Качество в деталях оценено глазами.
Заметки для фреймворка
- stable-diffusion.cpp на Vulkan и этом iGPU: диффузионные модели FLUX.2/FLUX.3 Klein и Z-Image дают шум (проверено с текстовым энкодером и VAE на CPU, с
--type f16). В логе — «conv2d direct auto: Vulkan0 -> off (probe output check failed)», у устройстваbf16: 0. SD-Turbo (UNet) работает. - SYCL: работает, но
sd-serverзависает на втором запросе (100% одного ядра, ответа нет);sd-cliв свежем процессе — стабильно, ~1 мин на запуск. СSYCL_CACHE_PERSISTENT=1иSYCL_CACHE_DIRsd-cli падает с segfault сразу после поиска устройств. - VAE на CPU (Vulkan для остального) у FLUX.2 даёт белый лист — не путь.
- SYCL на 768 px портит декодирование VAE: правильной выходит только средняя полоса кадра, сверху — блёклая фиолетовая копия, снизу — ровный серый (у всех трёх моделей; на 512 px всё нормально). Похоже на лимит одного выделения памяти SYCL: буфер VAE на 768 px ~5.6 GB. Лечение —
--vae-tiling(декодирование кусками); картинки с полосами —raw/*-sycl.band768/.