Добро пожаловать в FLUX.3 Image Klein в Diffusers

Источник: Hugging Face•

Добро пожаловать в FLUX.3 Image Klein в Diffusers

Мы стремимся развивать и демократизировать искусственный интеллект с помощью открытого исходного кода и открытой науки.

Модель FLUX.3 Image Klein от Black Forest Labs уже здесь, и она работает в Diffusers с первого дня. Одна модель поддерживает генерацию текста в изображение и многоуровневое преобразование изображения в изображение по нескольким референсам, а также добавляет новую функцию — управление компоновкой. Вы можете прописывать ограничивающие рамки в промпте, чтобы указать, куда должна помещаться каждая часть изображения или какие части референсного изображения нужно переместить.

Обе открытые контрольные точки находятся в коллекции FLUX.3 Image Klein:

Вы можете перейти в пространство Hugging Face и сгенерировать несколько изображений прямо сейчас!

Кратко (TL;DR)

  • Одна модель для текста в изображение, редактирования по нескольким референсам и управления компоновкой с помощью ограничивающих рамок.
  • Дистиллированная контрольная точка создает изображение размером 1024 × 1024 примерно за 2 секунды на H100.
  • Веса NVFP4 и FP8 загружаются через from_single_file для слабых видеокарт.
  • Скрипты обучения LoRA как для генерации текста в изображение, так и для редактирования изображений.
  • Поставляется в виде модульного пайплайна Diffusers, что позволяет заменять блоки или добавлять собственные.

Содержание

  • С чего начать
  • Что умеет FLUX.3
  • Базовая модель и квантованные варианты
  • Тонкая настройка LoRA
  • Стоимость запуска
  • Архитектура
  • Модульные Diffusers
  • Попробуйте сами

С чего начать

Установите последние версии diffusers и transformers (для текстового энкодера Qwen3-VL):

Загрузите дистиллированную контрольную точку и сгенерируйте изображение:

Что умеет FLUX.3

Текст в изображение

FLUX.3 лучше всего реагирует на полное описание сцены, включающее объект, окружение, освещение, композицию и стиль. Больше советов вы найдете в официальном руководстве по составлению промптов от Black Forest Labs. Дистиллированная контрольная точка по умолчанию создает изображение 1024 × 1024 за 16 шагов. Передайте параметры height, width или num_inference_steps, чтобы изменить их.

Изображение в изображение

Передайте одно или несколько референсных изображений с помощью аргумента image. Напишите промпт как подпись к желаемому изображению с учетом внесенных изменений.

Если используется несколько референсов, ссылайтесь на них в промпте как <ref_image_0>, <ref_image_1> и т.д. в порядке их передачи в image:

Управление компоновкой

Добавьте список регионов в формате JSON после описания. Каждый регион имеет id, bbox и desc, а в описании он упоминается как <id>.

Рамки записываются как [y_min, x_min, y_max, x_max], сначала y, в масштабе 0–1000. Поскольку шкала нормализована, одна и та же рамка работает для изображений любого размера.

Рамки записываются как [y_min, x_min, y_max, x_max], сначала y, в масштабе 0–1000. Поскольку шкала нормализована, одна и та же рамка работает для изображений любого размера.

Размещение регионов на новом изображении

Перемещение регионов в пределах референсного изображения

При редактировании каждый регион указывает, откуда берется его контент (src_bbox на референсе) и куда он отправляется (tgt_bbox на выходе). Регион с одинаковыми рамками остается на своем месте.

В этом примере вязаный рыцарь перемещается вверх и влево, а фон, скала, игла, дракон и огонь фиксируются на месте:

Базовая модель и квантованные варианты

Базовая модель

Все описанное выше использует дистиллированную контрольную точку. Базовая контрольная точка выполняет 50 шагов с классификаторно-свободным наведением (CFG) и предназначена для тонкой настройки (см. «Тонкая настройка LoRA»).

Контрольные точки в формате одного файла

Black Forest Labs также поставляет трансформер в виде единого файла в форматах bf16 и двух квантованных: fp8r (построчный FP8) и nvfp4. Загрузите любой из них с помощью from_single_file, а затем загрузите остальные компоненты по имени, чтобы трансформер bf16 не скачивался повторно.

Для неквантованного файла используйте https://huggingface.co/{model_id}/blob/main/model.safetensors и удалите quantization_config.

Тонкая настройка LoRA

FLUX.3 поддерживает как текст-ин-изображение, так и редактирование изображений, что делает ее отличной базой для кастомных LoRA. В diffusers есть скрипты обучения DreamBooth LoRA для обеих задач (вы также можете обучать с помощью AI Toolkit от Ostris).

Вот пример генерации текста в изображение, который изучает стиль карт Таро из датасета multimodalart/1920-raider-waite-tarot-public-domain, активируемый по ключевому слову trtcrd:

Чтобы снизить потребление памяти, добавьте несколько флагов оптимизации: --gradient_checkpointing \ --cache_latents \ --use_8bit_adam --gradient_checkpointing пересчитывает активации на этапе обратного прохода (меньше VRAM, чуть медленнее), --cache_latents предварительно кодирует изображения и освобождает VAE, а --use_8bit_adam сохраняет состояния оптимизатора в 8-битном формате.

Чтобы снизить потребление памяти, добавьте несколько флагов оптимизации:

--gradient_checkpointing пересчитывает активации на этапе обратного прохода (меньше VRAM, чуть медленнее), --cache_latents предварительно кодирует изображения и освобождает VAE, а --use_8bit_adam сохраняет состояния оптимизатора в 8-битном формате.

Стоит поэкспериментировать с парой параметров. В сетке ниже тот же стиль Таро обучается с разными рангами LoRA и оптимизаторами; адаптеры находятся на Хабе по адресу diffusers-modular/flux3-tarot-lora. Дополнительные параметры обучения и конфигурации описаны в DreamBooth FLUX.3 README.

Для редактирования на основе инструкций скрипт image-to-image (train_dreambooth_lora_flux3_klein_img2img.py) обучается на триплетах (референсное изображение, целевое изображение, инструкция), где на референс ссылаются в промпте как <ref_image_0>.

См. для ознакомления со всеми опциями и полным примером image-to-image.

Стоимость запуска

В этом разделе мы поговорим об энергопотреблении памяти и скорости генерации моделей.

Память

Если у вас мало памяти:

  • Загрузите квантованный трансформер.
  • Запустите текстовый энкодер отдельно и выгрузите его. Он запускается только один раз для каждого изображения, перед шумоподавлением (см. «Кодирование один раз, генерация много раз»).
  • Включите автоматическую выгрузку на CPU, которая перемещает каждый компонент на GPU только во время его работы (мы не тестировали этот бенчмарк).

Скорость

Время сквозной обработки для дистиллированной контрольной точки (16 шагов), усредненное по трем запускам после прогрева:

Один NVIDIA H100 80GB, без выгрузки, бэкенд внимания по умолчанию.

Один NVIDIA H100 80GB, без выгрузки, бэкенд внимания по умолчанию.

Референсное изображение примерно удваивает время. Токены референса объединяются в ту же последовательность, что и текст с генерируемым изображением, поэтому референс 1024 × 1024 добавляет 4096 токенов к каждому вызову трансформера.

Архитектура

Давайте откроем модель и рассмотрим ее по частям. Модель принимает три типа токенов:

  • текст
  • шумное изображение, которое генерируется
  • и опциональные референсные изображения

От пикселей к токенам

FLUX.3 — это потоковая модель в латентном пространстве для генерации изображений. Это означает, что шумоподавитель принимает скрытые состояния (латенты) на входе и выдает их на выходе. Мы используем VAE для декодирования латентов обратно в пиксели. В FLUX.3 используется та же архитектура VAE, что и в Flux.2.

VAE в Flux.2 сжимает изображение в 8 раз в каждом направлении до 32 каналов, а затем каждый патч 2 × 2 этого латента упаковывается в один токен с 128 каналами.

Таким образом, один токен охватывает патч размером 16 × 16 пикселей, а изображение 1024 × 1024 превращается в сетку 64 × 64 из 4096 токенов. Шумное изображение начинается как случайный шум ровно такой же формы. Референсный энкодер VAE и упаковка проходят через тот же процесс и сохраняют собственный размер.

От промпта к токенам

Текстовый энкодер — это Qwen3-VL, зряче-языковая модель. FLUX.3 берет не просто ее последний слой. Она считывает скрытые состояния восьми из 36 ее слоев (слои 4, 8, …, 32) и объединяет их, так что каждый текстовый токен становится вектором размерности 8 × 2560 = 20 480 перед тем, как линейный слой спроецирует его до ширины трансформера в 3072.

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

Два этапа

Трансформер обрабатывает токены в два этапа:

  • Этап 1: блоки для каждого режима. Каждый поток проходит через 5 блоков с собственными весами. У текста свои блоки, у зашумленного изображения — свои, а у референсных изображений — свои.
  • Этап 2: совместные блоки. Потоки объединяются в одну последовательность [текст | изображение | референс], которая проходит через 28 блоков, использующих один набор весов.

Два этапа различаются тем, кто может обращать внимание на кого.

На этапе 1 каждый поток обращает внимание только на себя, поэтому каждый тип токенов сначала уточняется на своих условиях. На этапе 2 всё обращает внимание на всё, где изображение обучается на тексте и референсах. Для сравнения, двухпотоковые блоки FLUX.2 также дают тексту и изображению отдельные веса, но позволяют им обращать внимание друг на друга с самого начала. FLUX.3 сначала полностью разделяет потоки, а затем объединяет их.

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

Внутри одного блока

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

Каждый блок начинается с LayerNorm, у которого нет собственного обучаемого масштаба или сдвига. Масштаб, сдвиг и гейт вместо этого берутся из эмбеддинга временного шага (это называется модуляцией). Внутри механизма внимания запросы (queries) и ключи (keys) проходят RMS-нормализацию и получают ротационные позиционные эмбеддинги (RoPE), которые мы рассмотрим ниже.

В совместном блоке все токены разделяют одни и те же веса, но текст, изображение и референсные токены получают каждый свой масштаб, сдвиг и гейт.

Каждый токен получает свой собственный временной шаг

В FLUX.1 и FLUX.2 один эмбеддинг временного шага модулирует каждый токен. В FLUX.3 модуляция зависит от типа токена.

Токены зашумленного изображения модулируются текущим временным шагом t. Текстовые и референсные токены всегда модулируются временным шагом 0, что означает «чисто, здесь нечего очищать от шума». Таким образом, даже референс, который выглядит почти так же, как результат, помечается как заданный контекст, а не как что-то, что нужно генерировать.

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

Позиции в четырех измерениях

Механизм внимания сам по себе не знает, где находится токен (это явление называется перестановочной эквивариантностью). RoPE исправляет это, поворачивая каждый запрос и ключ на величину, зависящую от позиции токена. FLUX.3 использует четыре оси позиций (t, h, w, l) (временной шаг, высота, ширина, длина последовательности) и выделяет каждой из них четверть (32 измерения) от каждого 128-мерного блока внимания:

Текстовые токены выстраиваются вдоль l, как слова в предложении. Изображение и референсы представляют собой 2D-сетки в (h, w), отделенные друг от друга вдоль l. Поскольку референс использует те же координаты (h, w), что и результат, «одно и то же место в референсе» имеет точное значение для модели, на чем и основано редактирование src_bbox / tgt_bbox.

Цикл удаления шума

FLUX.3 — это модель сопоставления потоков (flow-matching). Генерация начинается с чистого шума, и на каждом из 50 шагов трансформер предсказывает скорость. Это направление от шума к чистому изображению. Планировщик делает один шаг вдоль него.

На каждом шаге вы также можете считать текущее предположение модели о конечном изображении. Декодирование этого предположения на нескольких шагах показывает, как формируется изображение:

Лиса, ее поза и свет уже на месте к 10-му шагу, в то время как уровень шума все еще составляет 0.97. Заснеженные ветви и текстура меха появляются только на последних нескольких шагах. Планировщик FLUX.3 использует большой временной сдвиг (6.93), который поддерживает высокий уровень шума на протяжении большей части процесса: 44 из 50 шагов происходят выше σ = 0.5. Мы создали этот рисунок, добавив один небольшой блок в конвейер, что подводит нас к Modular Diffusers.

Если вы новичок в flow matching, у нас есть удобное руководство для начинающих и видео, чтобы вы поняли, как это работает.

Если вы новичок в flow matching, у нас есть удобное руководство для начинающих и видео, чтобы вы поняли, как это работает.

Modular Diffusers

FLUX.3 поставляется как конвейер Modular Diffusers.

Посмотреть рабочие процессы

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

get_workflow() разрешает автоматические ветки и выдает вам простую последовательность шагов, которые будут выполнены. print(blocks.get_workflow("image_conditioned").doc) выводит компоненты, входные данные, значения по умолчанию и выходные данные этого рабочего процесса.

Кодируйте один раз, генерируйте много

Извлеките текстовый энкодер, закодируйте промпт один раз, освободите его и генерируйте из кэшированных эмбеддингов.

Добавьте шаг внутрь цикла

Приведенный выше рисунок удаления шума был получен с помощью одного дополнительного блока, который записывает предположение модели о чистом изображении на каждом шаге:

Попробуйте

  • Модели: FLUX.3 Image Klein collection
  • Документация: FLUX.3 в Diffusers
  • Fine-tune: Скрипты DreamBooth LoRA
  • Промпты: Руководство по промптам Black Forest Labs

Создали что-то на FLUX.3? Поделитесь своими LoRA и конвейерами в Hub. Мы будем рады их увидеть! 😎

О чём эта статья

Ещё в разделе «AI и машинное обучение»

Все →

Ещё от Hugging Face