Порт потока MLX на основе реализации Diffusers HuggingFaceface.
Запустите мощные модели потока из Brandest Labs на местном уровне на вашем Mac!
MFLUX-это линейный порт реализации Flux в библиотеке диффузоров HuggingFace для Apple MLX. MFLUX целенаправленно сохраняется минимальным и явным - сетевые архитектуры жестко кодируются, и не используются файлы конфигурации, кроме токенизаторов. Цель состоит в том, чтобы иметь крошечную кодовую базу с единственной целью выражения этих моделей (тем самым избегая слишком большого количества абстракций). В то время как MFLUX приоритет читаемости над общностью и производительностью, она все еще может быть довольно быстрым и даже более быстрым квантованием.
Все модели реализованы с нуля в MLX, и только токенизаторы используются через библиотеку трансформаторов HuggingFace. Кроме этого, существуют только минимальные зависимости, такие как Numpy и подушка для простой после обработки изображения.
Для пользователей самый простой способ установить MFLUX - использовать uv tool
: если вы установили uv
, просто:
uv tool install --upgrade mflux
Чтобы получить исполняемые файлы командной строки mflux-generate
и связанных с ними. Вы можете пропустить руководства по использованию ниже.
Энкодер T5 зависит от предложения, который не имеет установленного артефакта колеса для Python 3.13 с ноября 2024 года. Пока Google не опубликует 3,13 колеса, вам нужно построить свое собственное колесо с официальными инструкциями по сборке или для вашего удобства .whl
Предварительно построенный участником @anthonywu. Приведенные ниже шаги должны работать для большинства разработчиков, хотя ваша система может различаться.
uv venv --python 3.13
python -V # e.g. Python 3.13.0rc2
source .venv/bin/activate
# for your convenience, you can use the contributor wheel
uv pip install https://github.com/anthonywu/sentencepiece/releases/download/0.2.1-py13dev/sentencepiece-0.2.1-cp313-cp313-macosx_11_0_arm64.whl
# enable the pytorch nightly
uv pip install --pre --extra-index-url https://download.pytorch.org/whl/nightly -e .
mkdir -p mflux && cd mflux && python3 -m venv .venv && source .venv/bin/activate
Это создает и активирует виртуальную среду в папке mflux
. После этого установите MFLUX через PIP:
pip install -U mflux
git clone [email protected]:filipstrand/mflux.git
make install
make test
make lint
и make format
установки и использует ruff
. Вы можете автоматически настроить свой редактор/IDE на Lint/Format или использовать наши предоставленные make
:make format
- форматирует ваш кодmake lint
- показывает ваши ошибки и предупреждения, но не исправляет автоматическое исправлениеmake check
- через крючки pre-commit
, форматируют ваш код и попытки автоматически исправить ошибки Lintruff
по обширному использованию Запустите команду mflux-generate
, указав подсказку, модель и некоторые дополнительные аргументы. Например, здесь мы используем квантовую версию модели schnell
для 2 шагов:
mflux-generate --model schnell --prompt " Luxury food photograph " --steps 2 --seed 2 -q 8
В этом примере используется более мощная модель dev
с 25 временными шагами:
mflux-generate --model dev --prompt " Luxury food photograph " --steps 25 --seed 2 -q 8
По умолчанию файлы модели загружаются в папку .cache
в вашем домашнем каталоге. Например, в моей настройке путь выглядит так:
/Users/filipstrand/.cache/huggingface/hub/models--black-forest-labs--FLUX.1-dev
Чтобы изменить это поведение по умолчанию, вы можете сделать это путем изменения переменной среды HF_HOME
. Для получения более подробной информации о том, как настроить эту настройку, пожалуйста, обратитесь к документации об объятиях .
Flux.1-DEV в настоящее время требует предоставления доступа к своему репозитую. Для устранения неполадок, см. The The Tracker Tracker
--prompt
(требуется, str
): текстовое описание изображения для генерации.
--model
или -m
(требуется, str
): модель для использования для генерации ( "schnell"
или "dev"
).
--output
(необязательный, str
, default: "image.png"
): выходное имя файла вывода.
--seed
(необязательно, int
, default: None
): семя для генерации случайных чисел. По умолчанию основано на времени.
--height
(необязательно, int
, по умолчанию: 1024
): высота выходного изображения в пикселях.
--width
(необязательно, int
, по умолчанию: 1024
): ширина выходного изображения в пикселях.
--steps
(необязательно, int
, по умолчанию: 4
): количество шагов вывода.
--guidance
(необязательно, float
, по умолчанию: 3.5
): шкала наведения (используется только для модели "dev"
).
--path
(необязательно, str
, default: None
): путь к локальной модели на диске.
--quantize
или -q
(необязательно, int
, по умолчанию: None
): квантование (выберите между 4
или 8
).
--lora-paths
(необязательно, [str]
, по умолчанию: None
): пути к весам Лоры.
--lora-scales
(необязательно, [float]
, по умолчанию: None
): шкала для каждой соответствующей LORA (будет по умолчанию 1.0
, если не указан, и загружается только один вес Lora.)
--metadata
(необязательно): экспорт файла .json
, содержащий метаданные для изображения с тем же именем. (Даже без этого флага метаданные изображения сохраняются и могут быть просмотрены с помощью exiftool image.png
)
--controlnet-image-path
(требуется, str
): Путь к локальному изображению, используемому ControlNet для руководства выводом.
--controlnet-strength
(необязательно, float
, по умолчанию: 0.4
): степень влияния, которое управляющее изображение оказывает на вывод. Диапазоны от 0.0
(без влияния) до 1.0
(полное влияние).
--controlnet-save-canny
(необязательно, Bool, по умолчанию: false): если установлено, сохраняет опорное изображение обнаружения хитрых краев, используемое ControlNet.
--init-image-path
(необязательно, str
, по умолчанию: None
): локальный путь к начальному изображению для генерации изображения к изображению.
--init-image-strength
(необязательно, float
, по умолчанию: 0.4
): управляет тем, насколько сильно начальное изображение влияет на выходное изображение. Значение 0.0
означает отсутствие влияния. (По умолчанию 0.4
)
--config-from-metadata
или -C
(необязательно, str
): [экспериментальный] Путь к предыдущему файлу, сохранению через --metadata
, или совместимый файл конфигурации ручной работы, придерживающийся ожидаемой схемы Args.
{
"$schema" : " http://json-schema.org/draft-07/schema# " ,
"type" : " object " ,
"properties" : {
"seed" : {
"type" : [ " integer " , " null " ]
},
"steps" : {
"type" : [ " integer " , " null " ]
},
"guidance" : {
"type" : [ " number " , " null " ]
},
"quantize" : {
"type" : [ " null " , " string " ]
},
"lora_paths" : {
"type" : [ " array " , " null " ],
"items" : {
"type" : " string "
}
},
"lora_scales" : {
"type" : [ " array " , " null " ],
"items" : {
"type" : " number "
}
},
"prompt" : {
"type" : [ " string " , " null " ]
}
}
}
{
"model" : " dev " ,
"seed" : 42 ,
"steps" : 8 ,
"guidance" : 3.0 ,
"quantize" : 4 ,
"lora_paths" : [
" /some/path1/to/subject.safetensors " ,
" /some/path2/to/style.safetensors "
],
"lora_scales" : [
0.8 ,
0.4
],
"prompt" : " award winning modern art, MOMA "
}
Или, с правильной средой Python, создайте и запустите отдельный сценарий, как следующее:
from mflux import Flux1 , Config
# Load the model
flux = Flux1 . from_alias (
alias = "schnell" , # "schnell" or "dev"
quantize = 8 , # 4 or 8
)
# Generate an image
image = flux . generate_image (
seed = 2 ,
prompt = "Luxury food photograph" ,
config = Config (
num_inference_steps = 2 , # "schnell" works well with 2-4 steps, "dev" works well with 20-25 steps
height = 1024 ,
width = 1024 ,
)
)
image . save ( path = "image.png" )
Для получения дополнительных вариантов настройки mflux, см. Generate.py.
Эти цифры основаны на некватурной модели schnell
, с конфигурацией, представленной в фрагменте кода ниже. Во время вашей машины, запустите следующее:
time mflux-generate
--prompt " Luxury food photograph "
--model schnell
--steps 2
--seed 2
--height 1024
--width 1024
Чтобы узнать спецификацию вашей машины (включая количество ядер ЦП, ядер графических процессоров и память, запустите следующую команду:
system_profiler SPHardwareDataType SPDisplaysDataType
Устройство | М-сериал | Пользователь | Сообщалось время | Примечания |
---|---|---|---|---|
Mac Studio | 2023 M2 Ultra | @awni | <15 с | |
MacBook Pro | 2024 M4 Макс (128 ГБ) | @ivanfioravanti | ~ 19S | |
MacBook Pro | 2023 M3 Макс | @karpathy | ~ 20 -е годы | |
- | 2023 M2 Макс (96 ГБ) | @Explorigin | ~ 25 с | |
Mac Mini | 2024 M4 Pro (64 ГБ) | @Stoobs | ~ 34 с | |
Mac Mini | 2023 M2 Pro (32 ГБ) | @leekichko | ~ 54 с | |
- | 2022 M1 Макс (64 ГБ) | @Bosseparra | ~ 55 с | |
MacBook Pro | 2023 M2 Макс (32 ГБ) | @filipsstrand | ~ 70 -е годы | |
- | 2023 M3 Pro (36 ГБ) | @Kush-gupt | ~ 80 -е годы | |
MacBook Pro | 2021 M1 Pro (32 ГБ) | @filipsstrand | ~ 160 -е годы | |
- | 2021 M1 Pro (16 ГБ) | @qw-in | ~ 175 с | Может заморозить ваш Mac |
MacBook Air | 2020 м1 (8 ГБ) | @mbvillaverde | ~ 335S | С разрешением 512 x 512 |
Обратите внимание, что эти цифры включают запуск приложения с нуля, что означает выполнение модели ввода -вывода, настройки/квантования веса и т. Д. Если мы предположим, что модель уже загружена, вы можете проверить метаданные изображения, используя exiftool image.png
и увидеть общее количество Продолжительность разобщенной петли (за исключением встраивания текста).
Эти тесты не очень научные и предназначены только для того, чтобы дать номера стадионного парка. Они проводились в разное время с различными MFLUX и MLX-версиями и т. Д.
При генерации изображения есть только один источник случайности: начальный скрытый массив. В этой реализации этот начальный латент полностью детерминированно контролируется параметром ввода seed
. Однако, если бы мы импортировали фиксированный экземпляр этого скрытого массива, сохраненного в реализации Diffusers, то MFLUX будет создавать идентичное изображение для реализации Diffusers (при условии фиксированной подсказки и использования параметров параметров по умолчанию в настройке Diffusers).
Изображения ниже иллюстрируют эту эквивалентность. Во всех случаях модель Schnell была запущена в течение 2 временных шагов. Реализация диффузоров работала в режиме процессора. Точность для mflux может быть установлена в классе конфигурации. Обычно существует заметная, но очень небольшая разница в конечном изображении при переключении между 16 -битной точностью.
Luxury food photograph
detailed cinematic dof render of an old dusty detailed CRT monitor on a wooden desk in a dim room with items around, messy dirty room. On the screen are the letters "FLUX" glowing softly. High detail hard surface render
photorealistic, lotr, A tiny red dragon curled up asleep inside a nest, (Soft Focus) , (f_stop 2.8) , (focal_length 50mm) macro lens f/2. 8, medieval wizard table, (pastel) colors, (cozy) morning light filtering through a nearby window, (whimsical) steam shapes, captured with a (Canon EOS R5) , highlighting (serene) comfort, medieval, dnd, rpg, 3d, 16K, 8K
A weathered fisherman in his early 60s stands on the deck of his boat, gazing out at a stormy sea. He has a thick, salt-and-pepper beard, deep-set blue eyes, and skin tanned and creased from years of sun exposure. He's wearing a yellow raincoat and hat, with water droplets clinging to the fabric. Behind him, dark clouds loom ominously, and waves crash against the side of the boat. The overall atmosphere is one of tension and respect for the power of nature.
Luxury food photograph of an italian Linguine pasta alle vongole dish with lots of clams. It has perfect lighting and a cozy background with big bokeh and shallow depth of field. The mood is a sunset balcony in tuscany. The photo is taken from the side of the plate. The pasta is shiny with sprinkled parmesan cheese and basil leaves on top. The scene is complemented by a warm, inviting light that highlights the textures and colors of the ingredients, giving it an appetizing and elegant look.
MFLUX поддерживает работающий поток в 4-битном или 8-битном квантовом режиме. Запуск квантовой версии может значительно ускорить процесс генерации и снизить потребление памяти на несколько гигабайт. Квантовые модели также занимают меньше места на диска.
mflux-generate
--model schnell
--steps 2
--seed 2
--quantize 8
--height 1920
--width 1024
--prompt " Tranquil pond in a bamboo forest at dawn, the sun is barely starting to peak over the horizon, panda practices Tai Chi near the edge of the pond, atmospheric perspective through the mist of morning dew, sunbeams, its movements are graceful and fluid — creating a sense of harmony and balance, the pond’s calm waters reflecting the scene, inviting a sense of meditation and connection with nature, style of Howard Terpning and Jessica Rossier "
В этом примере веса квантовы в среде выполнения - это удобно, если вы не хотите сохранить квантованную копию весов на диск, но все же хотите получить выгоду от потенциального ускорения и квантования снижения оперативной памяти.
Выбирая флаг --quantize
или -q
, который будет 4
, 8
или полностью удалив его, мы получаем все 3 изображения выше. Как видно, существует очень небольшая разница между изображениями (особенно между 8-битными и не квалифицированным результатом). Время генерации изображений в этом примере основано на машине 2021 M1 Pro (32 ГБ). Несмотря на то, что изображения почти идентичны, существует ~ 2-кратное ускорение, используя 8-битную квантовую версию на этой конкретной машине. В отличие от не квадратной версии, для 8-битной версии использование памяти свопа резко сокращается, а использование графического процессора близка к 100% в течение всего поколения. Результаты здесь могут различаться в разных машинах.
Размеры модели как для schnell
, так и для dev
на различных уровнях квантования следующие:
4 бит | 8 бит | Оригинал (16 бит) |
---|---|---|
9,85 ГБ | 18.16gb | 33,73 ГБ |
Причина, по которой массы веса не полностью сокращены пополам, заключается в том, что небольшое количество весов не имеет квантового и сохраняемого с полной точностью.
Чтобы сохранить локальную копию квантованных весов, запустите команду mflux-save
так:
mflux-save
--path " /Users/filipstrand/Desktop/schnell_8bit "
--model schnell
--quantize 8
Обратите внимание, что при сохранении квантовой версии вам понадобятся оригинальные веса HuggingFace.
Также можно указать адаптеры LORA при сохранении модели, например,
mflux-save
--path " /Users/filipstrand/Desktop/schnell_8bit "
--model schnell
--quantize 8
--lora-paths " /path/to/lora.safetensors "
--lora-scales 0.7
При создании изображений с такой моделью, адаптер LORA не требуется, поскольку он уже выпекается в сохраненные квантовые веса.
Чтобы сгенерировать новое изображение из квантованной модели, просто предоставьте --path
, где оно было сохранено:
mflux-generate
--path " /Users/filipstrand/Desktop/schnell_8bit "
--model schnell
--steps 2
--seed 2
--height 1920
--width 1024
--prompt " Tranquil pond in a bamboo forest at dawn, the sun is barely starting to peak over the horizon, panda practices Tai Chi near the edge of the pond, atmospheric perspective through the mist of morning dew, sunbeams, its movements are graceful and fluid — creating a sense of harmony and balance, the pond’s calm waters reflecting the scene, inviting a sense of meditation and connection with nature, style of Howard Terpning and Jessica Rossier "
Примечание. При загрузке квантовой модели с диска нет необходимости проходить в флаге -q
, поскольку мы можем сделать это из метаданных веса.
Также примечание: как только у нас будет локальная модель (квантовая или нет), указанная через аргумент --path
, модели кеша Huggingface не обязаны для запуска модели. Другими словами, вы можете восстановить 34 ГБ диска (на модель), удалив полную 16-битную модель из кеша HuggingFace, если вы выберете.
Если вы не хотите загружать полные модели и квантовать их самостоятельно, 4-битные веса доступны здесь для прямой загрузки:
MFLUX также поддерживает запуск не квалифицированной модели непосредственно из пользовательского местоположения. В приведенном ниже примере модель помещается в /Users/filipstrand/Desktop/schnell
:
mflux-generate
--path " /Users/filipstrand/Desktop/schnell "
--model schnell
--steps 2
--seed 2
--prompt " Luxury food photograph "
Обратите внимание, что флаг --model
должен быть установлен при загрузке модели с диска.
Также обратите внимание, что в отличие от использования типичного alias
инициализации модели (которая находится внутри, обрабатывает необходимые ресурсы), при загрузке модели непосредственно с диска мы требуем, чтобы загруженные модели выглядели как следующие:
.
├── text_encoder
│ └── model.safetensors
├── text_encoder_2
│ ├── model-00001-of-00002.safetensors
│ └── model-00002-of-00002.safetensors
├── tokenizer
│ ├── merges.txt
│ ├── special_tokens_map.json
│ ├── tokenizer_config.json
│ └── vocab.json
├── tokenizer_2
│ ├── special_tokens_map.json
│ ├── spiece.model
│ ├── tokenizer.json
│ └── tokenizer_config.json
├── transformer
│ ├── diffusion_pytorch_model-00001-of-00003.safetensors
│ ├── diffusion_pytorch_model-00002-of-00003.safetensors
│ └── diffusion_pytorch_model-00003-of-00003.safetensors
└── vae
└── diffusion_pytorch_model.safetensors
Это отражает то, как ресурсы помещаются в репогроз для Flux.1. Весаги, в отличие от квантованных, экспортируемых непосредственно из этого проекта, должны обрабатывать немного по -другому, поэтому нам требуется эта структура выше.
Одним из способов установить генерацию изображения является начиная с существующего изображения и позволить MFLUX создать новые вариации. Используйте флаг- --init-image-path
, чтобы указать эталонное изображение, и --init-image-strength
чтобы управлять тем, насколько эталонное изображение должно направлять генерацию. Например, учитывая ссылочное изображение ниже, следующая команда создала первое изображение, используя наброски LORA:
mflux-generate
--prompt " sketching of an Eiffel architecture, masterpiece, best quality. The site is lit by lighting professionals, creating a subtle illumination effect. Ink on paper with very fine touches with colored markers, (shadings:1.1), loose lines, Schematic, Conceptual, Abstract, Gestural. Quick sketches to explore ideas and concepts. "
--init-image-path " reference.png "
--init-image-strength 0.3
--lora-paths Architectural_Sketching.safetensors
--lora-scales 1.0
--model dev
--steps 20
--seed 43
--guidance 4.0
--quantize 8
--height 1024
--width 1024
Как и в случае Controlnet, этот метод хорошо сочетается с адаптерами LORA:
В примерах выше следующих лор используются наброски, используются анимационные выстрелы и флюс-фильма.
MFLUX Поддержка загрузки обученных адаптеров LORA (наступает фактическая поддержка обучения).
Следующий пример The_hound Lora от @TheLastBen:
mflux-generate --prompt " sandor clegane " --model dev --steps 20 --seed 43 -q 8 --lora-paths " sandor_clegane_single_layer.safetensors "
Следующим примером является FLUX_1_DEV_LORA_PAPER-CUTOUT в стиле LORA из @NOROD78:
mflux-generate --prompt " pikachu, Paper Cutout Style " --model schnell --steps 4 --seed 43 -q 8 --lora-paths " Flux_1_Dev_LoRA_Paper-Cutout-Style.safetensors "
Обратите внимание, что обученные весам Лора обычно обучаются с именным словом или фразой . Например, в последнем случае предложение должно включать фразу «стиль бумаги» .
Также обратите внимание, что одни и те же веса Lora могут хорошо работать как с моделями schnell
и dev
. Обратитесь к оригинальному репозиторию LORA, чтобы увидеть, для какого режима он был обучен.
Многочисленные лора могут быть отправлены для объединения эффектов отдельных адаптеров. Следующий пример объединяет оба вышеуказанных лора:
mflux-generate
--prompt " sandor clegane in a forest, Paper Cutout Style "
--model dev
--steps 20
--seed 43
--lora-paths sandor_clegane_single_layer.safetensors Flux_1_Dev_LoRA_Paper-Cutout-Style.safetensors
--lora-scales 1.0 1.0
-q 8
Просто чтобы увидеть разницу, это изображение отображает четыре случая: один из оба адаптеров полностью активных, частично активных и вообще без LORA. Приведенный выше пример также показывает использование флага --lora-scales
.
Поскольку различные службы точной настройки могут использовать различные реализации потока, соответствующие веса LORA, обученные этим услугам, могут отличаться друг от друга. Цель MFLUX - поддержка наиболее распространенных. В следующей таблице показаны текущие поддерживаемые форматы:
Поддерживается | Имя | Пример | Примечания |
---|---|---|---|
✅ | Блэк | Civitai - импрессионизм | Многие вещи на Civitai, кажется, работают |
✅ | Диффузоры | Flux_1_dev_lora_paper-cutout в стиле | |
Xlabs-ai | Flux-Realismlora |
Чтобы сообщить о дополнительных форматах, примерах или других предложениях, связанных с поддержкой Lora Format, см. В выпуске № 47.
MFLUX обладает поддержкой ControlNet для еще более мелкозернистого управления генерацией изображений. Предоставляя справочное изображение через --controlnet-image-path
и параметр прочности через --controlnet-strength
, вы можете направить генерацию к эталонному изображению.
mflux-generate-controlnet
--prompt " A comic strip with a joker in a purple suit "
--model dev
--steps 20
--seed 1727047657
--height 1066
--width 692
-q 8
--lora-paths " Dark Comic - s0_8 g4.safetensors "
--controlnet-image-path " reference.png "
--controlnet-strength 0.5
--controlnet-save-canny
Этот пример объединяет справочное изображение ControlNet с поток комиксов Lora Dark .
generate-controlnet
. На данный момент используется ControlNet-это andantx/flux.1-dev-controlnet-canny, который был обучен для модели dev
. Это может хорошо работать с schnell
, но производительность не гарантирована.
ControlNet также может хорошо работать вместе с адаптерами LORA. В примере ниже одно и то же эталонное изображение используется в качестве ввода ControlNet с различными проведениями и активными адаптерами LORA.
export HF_HUB_DISABLE_PROGRESS_BARS=1
--args
alias mflux-dev='mflux-generate --model dev'
alias mflux-schnell='mflux-generate --model schnell --metadata'
Этот проект лицензирован по лицензии MIT.