Пять неправильных токенов и 245 картинок: как Krea 2 заработала на Swift и MLX

от автора

На момент снимка в локальной Gallery было 245 изображений. Пользовательские файлы в публичный репозиторий не входят.

На момент снимка в локальной Gallery было 245 изображений. Пользовательские файлы в публичный репозиторий не входят.

Всё это создала одна Krea 2 Turbo на Mac mini M4 с 32 ГБ объединённой памяти. Один квадрат 1024×1024 занимал примерно семь минут.

Для масштаба: в предыдущем эксперименте один рендер Ideogram 4 размером 2048×2048, в режиме Quality и с 48 шагами, занял на том же Mac 384 минуты 55 секунд. Это не сравнительный бенчмарк — всего один реальный запуск. Просто после такого ожидания семь минут действительно начинают ощущаться как Turbo.

Но самый опасный баг в новом проекте тоже создавал красивые картинки. Всего пять токенов из 512 получали неправильные позиции. Тест показывал почти идеальное совпадение, результат выглядел нормально, а после исправления тот же prompt и seed изменили 99,32% пикселей.

Так появилась Twisterminigen — нативная студия для Krea 2 на Swift, SwiftUI и MLX. Без Python внутри приложения, без облачного inference и без права считать красивую картинку доказательством правильной математики.

Это продолжение моих предыдущих экспериментов с локальными генераторами на Mac: FLUX.2 Klein, Typhoonminigen 2.0 и Ideogram 4

Почему Krea 2

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

Krea 2 меня зацепила диапазоном. Один Turbo-checkpoint может уйти в архитектуру, предметную фотографию, fashion, аниме или почти документальный пейзаж без постоянной смены моделей. По моему мнению Krea 2 хорошо отрабатывает на лицах, лучше чем Ideogram и Flux 2 Klien.

Официально семейство состоит из Raw и Turbo. Raw — недистиллированная база для fine-tuning и обучения LoRA. Turbo — версия для быстрого inference: восемь шагов и CFG 0. В Twisterminigen я сознательно оставил только Turbo и применение готовых LoRA. Превращать приложение ещё и в тренер не планировал.

Prompts можно писать обычным языком: что находится в кадре, из чего сделано, где стоит камера и откуда идёт свет. Есть и забавная техническая деталь: при штатном CFG 0 negative prompt математически не участвует в генерации. Поэтому пожелания вроде empty room, no people нужно писать в основном prompt, а не надеяться на отдельное поле.

Четыре направления одной Krea 2 Turbo. Fashion-art, интерьер, портрет и автомобильная сцена. Один Turbo-checkpoint, восемь шагов, CFG 0.

Четыре направления одной Krea 2 Turbo. Fashion-art, интерьер, портрет и автомобильная сцена. Один Turbo-checkpoint, восемь шагов, CFG 0.

Три темы, один интерфейс

Twisterminigen — нативное приложение на SwiftUI, а не WebView над Python-скриптом. В верхнем меню собраны восемь основных разделов: Generate, Queue, Gallery, Presets, Models, LoRA, System и Help. Внизу постоянно видна локальная телеметрия: загрузка CPU и GPU, расход общей памяти, состояние MLX и свободное место на диске.

Интерфейс можно переключать между тремя темами: Dark, Light и Glass. Glass выглядит так, будто северное сияние случайно попало внутрь окна macOS; для более спокойной работы остаются обычные тёмная и светлая темы. Меняется не только фон: под тему адаптируются холст, панели, границы и контраст элементов.

Glass — самая декоративная тема. Все вычисления и изображения при этом по-прежнему остаются локальными.

Glass — самая декоративная тема. Все вычисления и изображения при этом по-прежнему остаются локальными.
Dark — более спокойный вариант без яркого фонового изображения.

Dark — более спокойный вариант без яркого фонового изображения.
Light использует ту же структуру интерфейса, но полностью светлые панели и холст.

Light использует ту же структуру интерфейса, но полностью светлые панели и холст.

Картинка была красивой. Математика — нет

Упрощённо pipeline выглядит так:

prompt → Qwen3-VL-4B → 12,9B DiT → Qwen-Image VAE → PNG

Qwen превращает текст в conditioning. Diffusion transformer восемь раз уточняет latent, а VAE декодирует его в пиксели.

Официальная реализация Krea 2 написана на Python и PyTorch. В Twisterminigen каждый этап работает на Swift и MLX. Python оставался только oracle — проверочным калькулятором во время разработки: официальный код считает промежуточный тензор, Swift считает свой, тест сравнивает результаты. В самом приложении Python-процесса нет.

Я также не буду изображать, будто вручную набрал весь Swift-код. Большую часть изменений готовил Codex модель GPT‑5.6 Sol под моим управлением. Я задавал поведение, разбивал работу на проверяемые этапы, сверял математику и принимал или отклонял результат. Это важная оговорка: Codex очень быстро реализует не только правильные решения, но и убедительные ошибки.

Одна из них спряталась в text encoder. Упакованный вход Qwen выглядел примерно так:

[prefix | prompt | PAD в середине | 5 служебных токенов]
Padding не должен занимать позиционные номера RoPE — механизма, который сообщает трансформеру порядок токенов. Но последние пять полезных токенов получали позиции около 541…545 вместо продолжения prompt примерно с 41…45.

Старый тест этого не заметил. Он захватывал несколько PAD-токенов и одновременно выбрасывал те самые пять полезных токенов. Общая cosine similarity всё равно выглядела почти идеальной: ошибочны были только 5 из 512.

После исправления token IDs, attention mask и position IDs совпали с официальным oracle бит-в-бит. F32-представления Swift и PyTorch на всех 12 проверяемых выходах text encoder дали cosine similarity не ниже 0,9999999.

Но same-seed PNG после исправления изменился на 99,32% пикселей.

Обе картинки выглядели нормально. С этого момента красивый PNG остался приятным результатом, но перестал считаться доказательством правильного порта.

Как 31,18 ГиБ весов уместились в 32 ГБ памяти

Экран Models выглядит немного угрожающе: четыре проверенных файла занимают 31,18ГБ.
В Models доступны два варианта Krea 2 Turbo: более компактный Default mixed-4/8 и более тяжёлый Best Fidelity q8. Перед первой генерацией необходимо прочитать и принять Krea 2 Community License Agreement и Acceptable Use Policy. Пока приложение не сохранит актуальное подтверждение и не проверит все необходимые файлы по размеру и SHA-256, Generate, Queue и запуск пресетов остаются заблокированными. Если условия лицензии изменятся, их потребуется принять заново.

Все четыре компонента проверены, выбран Default mixed-4/8. Внизу показан статус лицензии Krea 2: без принятия условий и полного набора проверенных весов генерация не запускается.

Все четыре компонента проверены, выбран Default mixed-4/8. Внизу показан статус лицензии Krea 2: без принятия условий и полного набора проверенных весов генерация не запускается.

Но в эту цифру входят общие Qwen и VAE плюс два альтернативных DiT:

  • Default mixed-4/8;

  • Best Fidelity q8.

Для одного рендера выбирается только один. Второй просто лежит на диске.

И размер файлов нельзя напрямую вычитать из unified memory. Во время работы появляются активации, attention-буферы, латенты, деквантизация и кеш MLX. Плюс macOS почему-то тоже требовалась память.

Поэтому тяжёлые стадии заходят по очереди:

Qwen создаёт conditioning → освобождаетсяDiT выполняет 8 шагов     → освобождаетсяVAE декодирует PNG

Между этапами остаются только нужные тензоры. Единый inference-координатор не разрешает двум тяжёлым MLX-операциям одновременно бороться за GPU и память.

В same-seed тесте q8 потребовал примерно на 4,1 ГиБ больше памяти, но завершил 1024×1024 без нового swap и ухудшения memory pressure. Называть его быстрее я не стал: q8 запускался вторым и мог воспользоваться прогретым файловым кешем. Best Fidelity означает более точные веса, а не гарантированно более красивую картинку.

Одинаковый seed — не паспорт персонажа

Первая версия Character Sheet создавала три независимых задания: Front, Back и Portrait. Prompt и seed были одинаковыми, поэтому идея казалась логичной.

На практике модель могла нарисовать трёх слегка разных людей.

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

Теперь Character Sheet — это один prompt, один canvas 1280×720 и один inference job. Front, Back и Portrait рождаются внутри общего кадра, поэтому модель одновременно видит лицо, одежду и пропорции.

Однопроходный Character Sheet. Один рендер вместо трёх независимых попыток познакомить модель с одним человеком.

Однопроходный Character Sheet. Один рендер вместо трёх независимых попыток познакомить модель с одним человеком.

Regional Prompts работают по похожему принципу: на холсте можно разместить до восьми областей и дать каждой собственное описание. Это не восемь склеенных картинок и не маски Photoshop. Весь кадр рождается в одном денойзинге, поэтому области направляют композицию, но волосы, одежда или фон могут пересечь границу.

Две области для пожарного и парамедика

Две области для пожарного и парамедика
Результат двух региональных описаний. Персонажи заняли нужные стороны кадра. Это управление композицией, а не гарантия изоляции личности.

Результат двух региональных описаний. Персонажи заняли нужные стороны кадра. Это управление композицией, а не гарантия изоляции личности.
Результат четырёх региональных описаний: четыре эпохи развития вычислительной техники.

Результат четырёх региональных описаний: четыре эпохи развития вычислительной техники.

PNG без рецепта быстро превращается в мусор

Через неделю уже невозможно вспомнить, какой prompt, seed, tier модели, LoRA и размер дали удачный результат. Поэтому основной единицей Twisterminigen стал не PNG, а immutable recipe — неизменяемый снимок генерации.

Карточка готового изображения со всеми параметрами генерации.

Карточка готового изображения со всеми параметрами генерации.

Рядом с изображением сохраняются prompt, seed, размер, модель, шаги, LoRA, Regions и Remix-родословная. Настройки можно вернуть в Generate, сохранить как preset или отправить в Queue. Редактирование текущего prompt не меняет уже сохранённую задачу.

Именно здесь генератор превращается в приложение, а не в кнопку над моделью.

Пресеты вместо папки с prompt.txt

Начиналось всё с нескольких примеров, а закончилось небольшой локальной библиотекой: 243 карточки в 17 разделах — от интерьеров, архитектуры и предметной съёмки до аниме, спорта и Character Sheet. Пресет здесь не фильтр поверх готовой картинки, а полный recipe: prompt, seed, размер, модель, шаги, LoRA, Regions и Remix-зависимости. Его можно загрузить в Generate или сразу отправить в Queue. При этом встроенным каталогом пользователь не заперт: можно создавать собственные карточки и разделы, выбирать обложки из Gallery, редактировать их или навсегда удалять отдельные пресеты и целые категории — вплоть до полной замены встроенного каталога собственной библиотекой.

Готовые пресеты для интерьеров.

Готовые пресеты для интерьеров.
Готовые пресеты для архитектуры и экстерьеров.

Готовые пресеты для архитектуры и экстерьеров.
Готовые пресеты для селфи.

Готовые пресеты для селфи.
Готовые пресеты для предметной съёмки.

Готовые пресеты для предметной съёмки.

Когда одной кнопки Generate мало

Когда один кадр рендерится около семи минут, очередь быстро перестаёт быть приятным дополнением. Каждое задание сохраняется как отдельный неизменяемый recipe: с prompt, seed, моделью, LoRA, Regions и Remix-источником. Поэтому можно продолжать редактировать Generate, не меняя уже запланированные работы.

Ожидающие задания можно редактировать, дублировать, переставлять и удалять. Очередь переживает перезапуск приложения, а Stop after current завершает текущий рендер и оставляет остальные задания на месте. Отдельный Queue Lab собирает сетки экспериментов до 64 работ, меняя по одному параметру: seed, число шагов, Remix Strength или вес LoRA.

На скриншоте очередь пустая. Я решил не запускать 64 рендера только ради более убедительной фотографии.

На скриншоте очередь пустая. Я решил не запускать 64 рендера только ради более убедительной фотографии.

LoRA в Twisterminigen тоже является частью реального inference-пути, а не декоративным переключателем. Можно импортировать совместимые .safetensors, открыть каталог официальных Krea Styles, собрать стек до восьми адаптеров, изменить их порядок, силу влияния и trigger phrases. Выбранный стек сохраняется внутри recipe.

Обучения LoRA в приложении нет намеренно. Twisterminigen умеет импортировать и применять готовые адаптеры, а подготовку датасета и весь training workflow я сознательно оставил внешним инструментам. Иначе компактная локальная студия быстро превратилась бы в отдельный проект — и ещё несколько бессонных ночей или недель.

На снимке библиотека ещё пуста: адаптер можно перетащить в окно, импортировать вручную или выбрать из каталога Krea Styles.

На снимке библиотека ещё пуста: адаптер можно перетащить в окно, импортировать вручную или выбрать из каталога Krea Styles.

Раздел Help получился не страницей с двумя горячими клавишами, а встроенной документацией. Первый запуск сопровождает тур из 12 экранов: от лицензии и подключения весов до Remix, Regions, LoRA, Queue, Presets, Gallery, Storage Manager и приватности. После него остаются 15 справочных карточек с короткими правилами и ограничениями каждой функции.

Для source-only приложения это особенно важно: справка объясняет не только куда нажимать, но и почему Generate остаётся недоступной, пока пользователь не принял условия Krea 2 и приложение не проверило все необходимые веса.

Здесь собраны модели, генерация, Remix, Regions, LoRA, Queue, Gallery, инструменты изображения, хранилище, безопасность и горячие клавиши.

Здесь собраны модели, генерация, Remix, Regions, LoRA, Queue, Gallery, инструменты изображения, хранилище, безопасность и горячие клавиши.

Что получилось

Сильная сторона Krea 2 — широкий визуальный диапазон, нормальный естественный язык и восьмишаговый Turbo. На моём Mac это всё ещё минуты, а не облачные секунды, но уже вполне рабочий цикл для локальных экспериментов.

Ограничения никуда не исчезли. Текст на изображении не гарантирован. Character Sheet не фиксирует личность математически. Regional Prompts остаются мягкими. 2K заметно повышает требования к unified memory. Удачный seed всё ещё приходится искать.

Публичный релиз Twisterminigen получился source-only: без готового .app.dmg и модельных весов. Код приложения опубликован отдельно под MIT, а совместимые веса Krea 2 пользователь получает и лицензирует самостоятельно. После установки prompts, исходные изображения, recipes и генерации остаются на Mac.

В Twisterminigen самой простой частью оказалась кнопка Generate.

Самой дорогой — доказательство того, что за ней действительно работает тот pipeline, который я собирался перенести.

Исходники Twisterminigen на GitHub

ссылка на оригинал статьи https://habr.com/ru/articles/1064434/