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]
Преместване на области в референтно изображение
При редактиране всяка област посочва откъде идва съдържанието ѝ (from, 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]
![]() |
|---|
Рицарят се премества от своята src_bbox към своята tgt_bbox, а останалата част от сцената остава на място |
Базов модел и квантизирани варианти
Базов модел
Всичко описано дотук използва дестилираната контролна точка. Базовата контролна точка изпълнява 50 стъпки с насочване без класификатор и е тази, която трябва да дообучавате (вижте „Дообучаване с 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:
За да намалите използваната памет, добавете няколко флага за оптимизация:
--gradient_checkpointing преизчислява активациите при обратното разпространение, --cache_latents предварително кодира изображенията и освобождава VAE, а --use_8bit_adam съхранява състоянията на оптимизатора в 8-битов формат.
Струва си да експериментирате с няколко настройки. Решетката по-долу обучава същия стил на таро с различни рангове на LoRA и оптимизатори; адаптерите са в Hub на адрес diffusers-modular/flux3-tarot-lora. Още функции и конфигурации за обучение са описани в README за DreamBooth FLUX.3.
За редактиране чрез инструкции скриптът за изображение към изображение (train_dreambooth_lora_flux3_klein_img2img.py) се обучава върху тройки (референтно изображение, целево изображение, инструкция), при което референцията се посочва в подканата като <ref_image_0>.
Вижте README за DreamBooth FLUX.3 за всички опции и пълния пример за изображение към изображение.
Каква е цената на изпълнението
В този раздел ще разгледаме потреблението на памет и скоростта на генериране на моделите.
Памет
Ако разполагате с по-малко памет:
- Заредете квантизиран трансформатор.
- Изпълнете текстовия енкодер отделно и го освободете. Той се изпълнява само веднъж за изображение, преди обезшумяването.
- Включете автоматично разтоварване към CPU, което премества всеки компонент към графичния процесор само докато работи (не сме измервали този вариант).
Скорост
Измервания от край до край за дестилираната контролна точка (16 стъпки), осреднени от три изпълнения след загряване:
Един NVIDIA H100 80GB, без разтоварване, със стандартния бекенд за внимание.
Референтното изображение приблизително удвоява времето. Референтните токени се присъединяват към същата последователност като текста и генерираното изображение, така че референция с размер 1024 × 1024 добавя 4 096 токена към всяко извикване на трансформатора.
Архитектурата
Нека разгледаме модела част по част. Моделът приема три вида токени:
- текст
- зашумено изображение, което се генерира
- и незадължителни референтни изображения
От пиксели към токени
FLUX.3 е модел за генериране на изображения чрез поток в латентното пространство. Това означава, че обезшумяващият модул приема латенти като вход и произвежда латенти като изход. Използваме VAE, за да декодираме латентите обратно до пиксели. FLUX.3 използва същата архитектура на VAE като Flux.2.
VAE на FLUX.2 компресира изображението 8 пъти във всяка посока до 32 канала, след което всеки блок 2 × 2 от този латент се пакетира в един токен със 128 канала.
Така един токен обхваща блок от 16 × 16 пиксела, а изображение 1024 × 1024 се превръща в мрежа 64 × 64 от 4 096 токена. Зашуменото изображение започва като случаен шум с точно тази форма. Референтното изображение преминава през същия 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 първо държи потоците напълно разделени, а след това ги обединява.
Накрая текстовите и референтните токени просто се премахват. Само токените на изображението преминават през изходните слоеве, които предсказват как да ги придвижат с една стъпка към чисто изображение.
Вътрешността на един блок
Всеки блок, независимо от етапа, има една и съща форма. Механизмът за внимание и MLP работят паралелно върху един и същ нормализиран вход, а сборът им се добавя обратно към остатъчния поток.
Всеки блок започва с LayerNorm, който няма собствени обучаеми мащабиране или отместване. Вместо това мащабът, отместването и управляващият сигнал идват от вграждане на времевата стъпка (това се нарича модулация). В механизма за внимание заявките и ключовете се нормализират с RMS и получават ротационни позиционни вграждания (RoPE).
В съвместен блок всички токени споделят едни и същи тегла, но текстовите, изображенческите и референтните токени получават собствени мащаб, отместване и управляващ сигнал.
Всеки токен получава собствена времева стъпка
В FLUX.1 и FLUX.2 едно вграждане на времева стъпка модулира всеки токен. В FLUX.3 модулацията зависи от вида на токена.
Токените на зашуменото изображение се модулират от текущата времева стъпка t. Текстовите и референтните токени винаги се модулират от времева стъпка 0, което означава „чисто, тук няма какво да се обезшумява“. Така дори референция, която изглежда почти същата като изхода, се маркира като даден контекст, а не като нещо за генериране.
Дестилираната контролна точка е карта на потока. На нея също се подава времевата стъпка, до която прескача всяка стъпка. Тази втора времева стъпка получава собствено вграждане, което се добавя към модулацията на всеки токен, така че всяка от 16-те стъпки да може да прави по-голям скок.
Позиции в четири измерения
Сам по себе си механизмът за внимание не знае къде се намира даден токен (това явление се нарича еквивариантност спрямо пермутациите). RoPE поправя това, като завърта всяка заявка и ключ с величина, зависеща от позицията на токена. FLUX.3 използва четири позиционни оси, (t, h, w, l) (времева стъпка, височина, ширина, дължина на последователността), като дава на всяка по една четвърт (32 измерения) от всяка глава за внимание с размер 128:
Текстовите токени се подреждат по 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 се доставя като конвейер на модулния 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
Преведено автоматично от английски. Оригиналната статия е на връзката по-долу.







