FLUX.3 Image Klein теперь в Diffusers
Обе открытые контрольные точки доступны в коллекции FLUX.3 Image Klein:
| Контрольная точка | Описание | Параметры по умолчанию |
|---|---|---|
black-forest-labs/flux-3-image-klein |
Дистиллированная по временным шагам, для быстрого вывода | 16 шагов, без CFG |
black-forest-labs/flux-3-image-klein-base |
Базовая модель | 50 шагов, с CFG |
Перейдите в пространство Hugging Face и создайте изображения прямо сейчас!
Кратко
- Одна модель для преобразования текста в изображение, преобразования изображения в изображение с несколькими референсами и управления компоновкой с помощью ограничивающих рамок.
- Дистиллированная контрольная точка создаёт изображение 1024 × 1024 примерно за 2 секунды на H100.
- Веса NVFP4 и FP8 загружаются с помощью
from_single_file, что позволяет использовать менее мощные графические процессоры. - Скрипты обучения LoRA для преобразования текста в изображение и редактирования изображений.
- Поставляется как модульный конвейер Diffusers, поэтому блоки можно извлекать или добавлять собственные.
Содержание
- Начало работы
- Возможности FLUX.3
- Базовая модель и квантованные варианты
- Дообучение LoRA
- Стоимость запуска
- Архитектура
- Модульный Diffusers
- Попробовать
Начало работы
Установите последние версии diffusers и transformers (для текстового кодировщика Qwen3-VL):
pip install -U diffusers transformers
Загрузите дистиллированную контрольную точку и создайте изображение:
import torch
from diffusers import ModularPipeline
pipe = ModularPipeline.from_pretrained("black-forest-labs/flux-3-image-klein")
pipe.load_components(dtype=torch.bfloat16)
pipe.to("cuda")
pipe(prompt="a red fox", output="images")[0].save("fox.png")
Возможности FLUX.3
Текст в изображение
FLUX.3 лучше всего реагирует на подробное описание сцены с указанием объекта, окружения, освещения, композиции и стиля. В официальном руководстве по составлению запросов от Black Forest Labs приведено больше советов. Дистиллированная контрольная точка по умолчанию создаёт изображение 1024 × 1024 за 16 шагов. Передайте height, width или num_inference_steps, чтобы изменить эти параметры.
prompt = (
"A wide-angle wildlife photograph of a red fox standing alert in a snow-covered forest clearing at golden hour. "
"The fox is centered in the frame, its thick orange winter coat contrasting with the fresh white snow, breath "
"visible in the cold air. Snow-laden pine trees fill the softly blurred background, and low warm sunlight rakes "
"across the scene from the left, casting long blue shadows."
)
fox = pipe(
prompt=prompt,
generator=torch.Generator().manual_seed(0),
output="images"
)[0]
fox.save("fox.png")
Изображение в изображение
Передайте референсное изображение (или несколько) с помощью аргумента image. Сформулируйте запрос как подпись к изображению, которое вы хотите получить, включив в него описание изменения.
prompt = (
"The same red fox in the same snow-covered forest clearing, now at night under a full moon: cool blue "
"moonlight, deep shadows, stars visible through the pine branches, the fox's eyes catching the light."
)
night = pipe(
prompt=prompt,
image=fox,
generator=torch.Generator().manual_seed(0),
output="images",
)[0]
night.save("night.png")
При использовании нескольких референсов ссылайтесь на них в запросе как на <ref_image_0>, <ref_image_1> и т. д. в порядке их передачи в image:
red_fox = pipe(prompt="a red fox", generator=torch.Generator().manual_seed(0), output="images")[0]
bench = pipe(prompt="a wooden bench", generator=torch.Generator().manual_seed(0), output="images")[0]
combined = pipe(
prompt="The fox from <ref_image_0> sitting on the wooden bench from <ref_image_1> in a snowy setting.",
image=[red_fox, bench],
output="images",
)[0]
combined.save("combined.png")
Управление компоновкой
Добавьте список регионов в формате JSON после описания. Каждый регион содержит id, bbox и desc, а в описании на него нужно сослаться как на <id>.
Рамки записываются как
[y_min, x_min, y_max, x_max]— сначала координата y — в масштабе от 0 до 1000. Поскольку масштаб нормализован, одна и та же рамка работает при любом размере изображения.
Размещение регионов в новом изображении
layout_prompt = (
"Minimalist graphic illustration featuring a black silhouette of a person <silhouette_1> centered against a "
"solid, vibrant chartreuse background <background_1>. The figure is captured in a dynamic, mid-stride running "
"pose, facing toward the left side of the frame. "
'[{"id": "background_1", "bbox": [0, 0, 1000, 1000], "desc": "A flat field of neon yellow-green with a subtle '
'paper texture and fine, organic grain."}, {"id": "silhouette_1", "bbox": [150, 150, 850, 850], "desc": "A '
"black silhouette of a person in motion, made of dense stippled ink. The leading edges are solid; the trailing "
'arm and leg dissolve into coarse square pixels and scattered dots."}]'
)
runner = pipe(prompt=layout_prompt, generator=torch.Generator().manual_seed(0), output="images")[0]
Перемещение регионов в референсном изображении
При редактировании каждый регион указывает, откуда берётся его содержимое (src_bbox в референсе) и куда оно перемещается (tgt_bbox в результате). Регион с одинаковыми рамками остаётся на месте.
В этом примере вязаный рыцарь перемещается вверх и влево, а фон, утёс, игла, дракон и огонь фиксируются:
from diffusers.utils import load_image
knight_image = load_image("knight_orig.png")
edit_prompt = (
"In <ref_image_0>, move the miniature grey amigurumi knight figure <knight_1> upwards and to the left along the "
"yarn cliff <cliff_1>. Keep the rest of the image completely unchanged, preserving the blurred yarn backdrop "
"<backdrop_1>, the large knitted dragon <dragon_1>, and the fiery orange thread <fire_1>. "
'[{"id": "knight_1", "from": "ref_image_0", "src_bbox": [500, 150, 850, 350], "tgt_bbox": [194, 55, 544, 255], '
'"desc": "A miniature amigurumi knight crocheted from thick grey woolen yarn."}, '
'{"id": "backdrop_1", "from": "ref_image_0", "src_bbox": [0, 0, 1000, 1000], "tgt_bbox": [0, 0, 1000, 1000], '
'"desc": "A soft, out-of-focus backdrop of cream and indigo knitted yarn."}, '
'{"id": "cliff_1", "from": "ref_image_0", "src_bbox": [300, 0, 1000, 450], "tgt_bbox": [300, 0, 1000, 450], '
'"desc": "A steep cliff of stacked yarn skeins in mustard, terracotta, and indigo."}, '
'{"id": "needle_1", "from": "ref_image_0", "src_bbox": [420, 250, 550, 450], "tgt_bbox": [420, 250, 550, 450], '
'"desc": "An oversized polished steel tapestry needle."}, '
'{"id": "dragon_1", "from": "ref_image_0", "src_bbox": [100, 600, 950, 1000], "tgt_bbox": [100, 600, 950, 1000], '
'"desc": "A large, fluffy knitted dragon in terracotta and mustard yarn."}, '
'{"id": "fire_1", "from": "ref_image_0", "src_bbox": [350, 400, 650, 650], "tgt_bbox": [350, 400, 650, 650], '
'"desc": "Curled puffs of fiery orange angora thread suspended in mid-air."}]'
)
moved = pipe(prompt=edit_prompt, image=knight_image, generator=torch.Generator().manual_seed(0), output="images")[0]
Базовая модель и квантованные варианты
Базовая модель
Во всём описанном выше используется дистиллированная контрольная точка. Базовая контрольная точка выполняет 50 шагов с classifier-free guidance и предназначена для дообучения (см. раздел «Дообучение LoRA»).
Контрольные точки в формате одного файла
Black Forest Labs также поставляет трансформер в виде одного файла — в формате bf16 и двух квантованных форматах: fp8r (построчный FP8) и nvfp4. Загрузите любой из них с помощью from_single_file, а затем загрузите остальные компоненты по имени, чтобы трансформер bf16 не скачивался повторно.
Дообучение LoRA
FLUX.3 поддерживает как преобразование текста в изображение, так и преобразование изображения в изображение, что делает её отличной базой для пользовательских LoRA. В diffusers есть скрипты обучения DreamBooth LoRA для обеих задач (также можно обучать с помощью AI Toolkit от Ostris).
Ниже приведён пример преобразования текста в изображение, в котором модель обучается стилю карт Таро на наборе данных multimodalart/1920-raider-waite-tarot-public-domain с триггером trtcrd:
Стоимость запуска
В этом разделе мы рассмотрим потребление памяти и скорость генерации моделей.
Память
| название | пиковое выделение (после загрузки), ГиБ | пиковое выделение (после вывода), ГиБ |
|---|---|---|
| nvfp4 (RTX6000) | 13.4 | 15.3 |
| fp8r (H100) | 14.35 | 16.27 |
| bf16 (H100) | 18.80 | 20.72 |
Если у вас меньше памяти:
- Загрузите квантованный трансформер.
- Запустите текстовый кодировщик отдельно и освободите его. Он запускается только один раз для каждого изображения, до удаления шума.
- Включите автоматическую выгрузку на CPU, которая перемещает каждый компонент на GPU только на время его работы (мы это не тестировали).
Скорость
Сквозное время работы дистиллированной контрольной точки (16 шагов), усреднённое по трём запускам после прогрева:
| Рабочий процесс | Размер результата | Время | Пиковая память |
|---|---|---|---|
| Текст в изображение | 1024 × 1024 | 1.93 с | 23.8 ГиБ |
| Изображение в изображение, один референс 1024 × 1024 | 1024 × 1024 | 3.87 с | 23.8 ГиБ |
| Редактирование компоновки (рыцарь), один референс 1360 × 768 | 1360 × 768 | 4.10 с | 23.8 ГиБ |
Один NVIDIA H100 80 ГБ, без выгрузки, стандартный бэкенд attention.
Референсное изображение примерно вдвое увеличивает время. Токены референса присоединяются к той же последовательности, что текст и создаваемое изображение, поэтому референс 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: совместные блоки. Потоки объединяются в одну последовательность
[text | image | reference], которая проходит через 28 блоков с общим набором весов.
Эти два этапа различаются тем, кто на кого может обращать внимание.
На первом этапе каждый поток обращается только к самому себе, поэтому сначала каждый тип токенов уточняется отдельно. На втором этапе каждый токен обращается ко всем остальным: изображение получает информацию из текста и референсов. Для сравнения, двойные потоковые блоки FLUX.2 также используют отдельные веса для текста и изображения, но позволяют им взаимодействовать с самого начала. FLUX.3 сначала полностью разделяет потоки, а затем объединяет их.
В конце текстовые и референсные токены просто отбрасываются. Только токены изображения проходят через выходные слои, которые предсказывают, как переместить их на один шаг ближе к чистому изображению.
Внутри одного блока
Каждый блок на обоих этапах имеет одинаковую форму. Attention и MLP работают параллельно над одним и тем же нормализованным входом, а их сумма добавляется обратно в остаточный поток.
Каждый блок начинается с LayerNorm, у которого нет собственных обучаемых масштаба и сдвига. Вместо этого масштаб, сдвиг и вентиль поступают из встраивания временного шага (это называется модуляцией). Внутри attention запросы и ключи нормализуются с помощью RMS, а затем получают позиционные встраивания RoPE.
В совместном блоке все токены используют одни и те же веса, но текстовые, графические и референсные токены получают собственные масштаб, сдвиг и вентиль.
Каждый токен получает собственный временной шаг
В FLUX.1 и FLUX.2 одно встраивание временного шага модулирует каждый токен. В FLUX.3 модуляция зависит от типа токена.
Зашумлённые токены изображения модулируются текущим временным шагом t. Текстовые и референсные токены всегда модулируются временным шагом 0, что означает «чистый, здесь не нужно удалять шум». Поэтому даже референс, почти совпадающий с результатом, помечается как заданный контекст, а не как то, что нужно сгенерировать.
Дистиллированная контрольная точка представляет собой flow map. Ей также сообщается временной шаг, к которому переходит каждый шаг. Это второе встраивание временного шага добавляется к модуляции каждого токена, поэтому каждый из 16 шагов может совершать более крупный переход.
Позиции в четырёх измерениях
Сам по себе attention не знает, где расположен токен (это явление называется эквивариантностью относительно перестановок). RoPE исправляет это, поворачивая каждый запрос и ключ на величину, зависящую от позиции токена. FLUX.3 использует четыре позиционные оси (t, h, w, l) (временной шаг, высота, ширина, длина последовательности) и выделяет каждой четверть (32 измерения) каждой головы attention размерностью 128:
| Токены | t: временной шаг | h: высота | w: ширина | l: длина последовательности |
|---|---|---|---|---|
| текстовый токен i | 0 | 0 | 0 | i |
| токен изображения в (строка, столбец) | 0 | строка / 2 | столбец / 2 | 0 |
| референс k в (строка, столбец) | 0 | строка / 2 | столбец / 2 | −(k + 1) |
Текстовые токены выстраиваются вдоль l, как слова в предложении. Изображение и референсы представляют собой двумерные сетки в (h, w), разделённые вдоль l. Поскольку референс использует те же координаты (h, w), что и результат, «та же точка в референсе» имеет для модели точное значение — на этом основано редактирование с помощью src_bbox / tgt_bbox.
Цикл удаления шума
FLUX.3 — модель сопоставления потоков. Генерация начинается с чистого шума, и на каждом из 50 шагов трансформер предсказывает скорость. Это направление от шума к чистому изображению. Планировщик делает по нему один шаг.
На каждом шаге также можно получить текущую оценку моделью конечного изображения. Если декодировать эту оценку на нескольких шагах, видно, как формируется изображение:
Лиса, её поза и освещение уже сформированы к 10-му шагу, пока уровень шума всё ещё равен 0,97. Заснеженные ветви и текстура шерсти появляются лишь на последних шагах. Планировщик FLUX.3 использует большое временное смещение (6,93), благодаря чему уровень шума остаётся высоким большую часть процесса: 44 из 50 шагов выполняются при σ = 0,5. Мы создали эту иллюстрацию, добавив в конвейер небольшой блок, что приводит нас к модульному Diffusers.
Если вы впервые знакомитесь с сопоставлением потоков, воспользуйтесь нашим доступным руководством для начинающих и видеоматериалом, объясняющими принцип работы.
Модульный Diffusers
FLUX.3 поставляется как конвейер Modular Diffusers.
Просмотр рабочих процессов
Можно вывести список рабочих процессов и точные блоки каждого из них, не загружая веса.
Однократное кодирование, многократная генерация
Извлеките текстовый кодировщик, закодируйте запрос один раз, освободите кодировщик и создавайте изображения из кэшированных встраиваний.
Добавление шага внутрь цикла
Приведённая выше иллюстрация удаления шума создана с помощью дополнительного блока, который записывает оценку моделью чистого изображения на каждом шаге:
Попробовать
- Модели: коллекция FLUX.3 Image Klein
- Документация: FLUX.3 в Diffusers
- Дообучение: скрипты DreamBooth LoRA
- Составление запросов: руководство Black Forest Labs
Создали что-то с помощью FLUX.3? Делитесь своими LoRA и конвейерами на Hub. Мы будем рады их увидеть! 😎
Модели, упомянутые в этой статье 2
Наборы данных, упомянутые в этой статье 1
Пространства, упомянутые в этой статье 2
Коллекции, упомянутые в этой статье 1
Сообщество
· Зарегистрируйтесь или войдите, чтобы оставить комментарий
Модели, упомянутые в этой статье 2
Наборы данных, упомянутые в этой статье 1
Пространства, упомянутые в этой статье 2
Коллекции, упомянутые в этой статье 1
Переведено автоматически с английского. Оригинал статьи — по ссылке ниже.







