Port fluks MLX berdasarkan implementasi huggingface diffusers.
Jalankan model fluks yang kuat dari Black Forest Labs secara lokal di Mac Anda!
Mflux adalah port garis demi garis dari implementasi fluks di pustaka huggingface diffusers ke Apple MLX. Mflux disimpan dengan sengaja dijaga minimal dan eksplisit - arsitektur jaringan hardcoded dan tidak ada file konfigurasi yang digunakan kecuali untuk tokenizer. Tujuannya adalah untuk memiliki basis kode kecil dengan tujuan tunggal mengekspresikan model -model ini (dengan demikian menghindari terlalu banyak abstraksi). Sementara keterbacaan prioritas Mflux dibandingkan dengan umum dan kinerja, itu masih bisa cukup cepat, dan bahkan lebih cepat kuantitisasi.
Semua model diimplementasikan dari awal di MLX dan hanya tokenizer yang digunakan melalui perpustakaan Huggingface Transformers. Selain itu, hanya ada ketergantungan minimal seperti numpy dan bantal untuk pemrosesan gambar sederhana.
Untuk pengguna, cara termudah untuk menginstal mflux adalah dengan menggunakan uv tool
: jika Anda telah menginstal uv
, cukup:
uv tool install --upgrade mflux
Untuk mendapatkan mflux-generate
dan terkait baris perintah yang dapat dieksekusi. Anda dapat melompat ke pemandu penggunaan di bawah ini.
Encoder T5 bergantung pada kalimat, yang tidak memiliki artefak roda yang dapat diinstal untuk Python 3.13 pada November 2024. Sampai Google menerbitkan roda 3.13, Anda perlu membangun roda sendiri dengan instruksi pembuatan resmi atau untuk kenyamanan Anda menggunakan .whl
Pra-dibangun oleh kontributor @anthonywu. Langkah -langkah di bawah ini harus bekerja untuk sebagian besar pengembang meskipun sistem Anda dapat bervariasi.
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
Ini menciptakan dan mengaktifkan lingkungan virtual di folder mflux
. Setelah itu, instal mflux melalui PIP:
pip install -U mflux
git clone [email protected]:filipstrand/mflux.git
make install
make test
make lint
dan make format
yang disarankan dan menggunakan ruff
. Anda dapat mengatur editor/IDE Anda ke lint/format secara otomatis, atau menggunakan make
yang disediakan:make format
- Format Kode Andamake lint
- tunjukkan kesalahan dan peringatan serat Anda, tetapi tidak memperbaiki otomatismake check
- Melalui kait pre-commit
, memformat kode Anda dan mencoba untuk memperbaiki kesalahan serat otomatisruff
tentang penggunaan lanjutan Jalankan perintah mflux-generate
dengan menentukan prompt dan model dan beberapa argumen opsional. Misalnya, di sini kami menggunakan versi terkuantisasi model schnell
selama 2 langkah:
mflux-generate --model schnell --prompt " Luxury food photograph " --steps 2 --seed 2 -q 8
Contoh ini menggunakan model dev
yang lebih kuat dengan 25 langkah waktu:
mflux-generate --model dev --prompt " Luxury food photograph " --steps 25 --seed 2 -q 8
Secara default, file model diunduh ke folder .cache
di dalam direktori home Anda. Misalnya, dalam pengaturan saya, jalurnya terlihat seperti ini:
/Users/filipstrand/.cache/huggingface/hub/models--black-forest-labs--FLUX.1-dev
Untuk mengubah perilaku default ini, Anda dapat melakukannya dengan memodifikasi variabel lingkungan HF_HOME
. Untuk detail lebih lanjut tentang cara menyesuaikan pengaturan ini, silakan merujuk ke dokumentasi wajah memeluk .
Flux.1-dev saat ini membutuhkan akses yang diberikan ke repo pelukannya. Untuk pemecahan masalah, lihat pelacak masalah
--prompt
(wajib, str
): Deskripsi teks dari gambar yang akan dihasilkan.
--model
atau -m
(wajib, str
): Model untuk digunakan untuk generasi ( "schnell"
atau "dev"
).
--output
(opsional, str
, default: "image.png"
): output gambar file.
--seed
(opsional, int
, default: None
): seed untuk pembuatan angka acak. Default berbasis waktu.
--height
(opsional, int
, default: 1024
): Tinggi gambar output dalam piksel.
--width
(opsional, int
, default: 1024
): Lebar gambar output dalam piksel.
--steps
(opsional, int
, default: 4
): Jumlah langkah inferensi.
--guidance
(opsional, float
, default: 3.5
): Skala panduan (hanya digunakan untuk model "dev"
).
--path
(Opsional, str
, Default: None
): Path to a Local Model on Disk.
--quantize
atau -q
(opsional, int
, default: None
): kuantisasi (pilih antara 4
atau 8
).
--lora-paths
(opsional, [str]
, default: None
): Jalur menuju bobot Lora.
--lora-scales
(opsional, [float]
, default: None
): skala untuk masing-masing lora masing-masing (akan default ke 1.0
jika tidak ditentukan dan hanya satu bobot lora yang dimuat.)
--metadata
(opsional): Ekspor file .json
yang berisi metadata untuk gambar dengan nama yang sama. (Bahkan tanpa bendera ini, metadata gambar disimpan dan dapat dilihat menggunakan exiftool image.png
)
--controlnet-image-path
(wajib, str
): jalur ke gambar lokal yang digunakan oleh controlnet untuk memandu pembuatan output.
--controlnet-strength
(opsional, float
, default: 0.4
): derajat pengaruh gambar kontrol pada output. Berkisar dari 0.0
(tidak ada pengaruh) hingga 1.0
(pengaruh penuh).
--controlnet-save-canny
(opsional, bool, default: false): jika diatur, menyimpan gambar referensi deteksi tepi cerdik yang digunakan oleh controlnet.
--init-image-path
(Opsional, str
, Default: None
): Jalur lokal ke gambar awal untuk pembuatan gambar-ke-gambar.
--init-image-strength
(opsional, float
, default: 0.4
): Mengontrol seberapa kuat gambar awal mempengaruhi gambar output. Nilai 0.0
berarti tidak ada pengaruh. (Default adalah 0.4
)
--config-from-metadata
atau -C
(opsional, str
): Path [eksperimental] ke file sebelumnya yang disimpan melalui --metadata
, atau file konfigurasi buatan tangan yang kompatibel menempel pada skema ARGS yang diharapkan.
{
"$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 "
}
Atau, dengan lingkungan Python yang benar aktif, buat dan jalankan skrip terpisah seperti yang berikut:
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" )
Untuk lebih banyak opsi tentang cara mengkonfigurasi mFlux, silakan lihat Generate.py.
Angka-angka ini didasarkan pada model schnell
yang tidak qualisasi , dengan konfigurasi yang disediakan dalam cuplikan kode di bawah ini. Untuk mengatur waktu mesin Anda, jalankan yang berikut:
time mflux-generate
--prompt " Luxury food photograph "
--model schnell
--steps 2
--seed 2
--height 1024
--width 1024
Untuk mengetahui spesifikasi mesin Anda (termasuk jumlah inti CPU, inti GPU, dan memori, jalankan perintah berikut:
system_profiler SPHardwareDataType SPDisplaysDataType
Perangkat | M-Series | Pengguna | Waktu yang dilaporkan | Catatan |
---|---|---|---|---|
Studio Mac | 2023 M2 Ultra | @awni | <15s | |
MacBook Pro | 2024 M4 Max (128GB) | @IvanFiorAvanti | ~ 19S | |
MacBook Pro | 2023 m3 maks | @karpathy | ~ 20 -an | |
- | 2023 m2 maks (96GB) | @Explorigin | ~ 25s | |
Mac Mini | 2024 M4 Pro (64GB) | @Stoobs | ~ 34S | |
Mac Mini | 2023 M2 Pro (32GB) | @leekichko | ~ 54S | |
- | 2022 M1 Max (64GB) | @Bosseparra | ~ 55S | |
MacBook Pro | 2023 m2 maks (32GB) | @filipstrand | ~ 70 -an | |
- | 2023 M3 Pro (36GB) | @kush-gupt | ~ 80 -an | |
MacBook Pro | 2021 M1 Pro (32GB) | @filipstrand | ~ 160 -an | |
- | 2021 M1 Pro (16GB) | @qw-in | ~ 175S | Mungkin membekukan mac Anda |
MacBook Air | 2020 M1 (8GB) | @MbVillaverde | ~ 335S | Dengan resolusi 512 x 512 |
Perhatikan bahwa angka -angka ini termasuk memulai aplikasi dari awal, yang berarti melakukan model I/O, pengaturan/kuantisasi bobot dll. Jika kita berasumsi bahwa model sudah dimuat, Anda dapat memeriksa metadata gambar menggunakan exiftool image.png
dan lihat totalnya Durasi loop denoising (tidak termasuk embedding teks).
Tolok ukur ini tidak terlalu ilmiah dan hanya dimaksudkan untuk memberikan angka stadion baseball. Mereka dilakukan selama waktu yang berbeda dengan mflux dan mlx-versi yang berbeda, dll. Informasi perangkat keras tambahan seperti jumlah core GPU, perangkat Mac dll. Tidak selalu diketahui.
Hanya ada satu sumber keacakan saat menghasilkan gambar: array laten awal. Dalam implementasi ini, laten awal ini sepenuhnya dikendalikan secara deterministik oleh parameter seed
input. Namun, jika kami mengimpor instance tetap dari array laten ini yang disimpan dari implementasi Diffusers, maka Mflux akan menghasilkan gambar yang identik dengan implementasi Diffusers (dengan asumsi prompt tetap dan menggunakan pengaturan parameter default dalam pengaturan diffusers).
Gambar di bawah ini menggambarkan kesetaraan ini. Dalam semua kasus model Schnell dijalankan selama 2 langkah waktu. Implementasi Diffusers berjalan dalam mode CPU. Presisi untuk mFlux dapat diatur di kelas konfigurasi. Biasanya ada perbedaan yang nyata tetapi sangat kecil dalam gambar akhir ketika beralih antara 16bit dan presisi 32bit.
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 mendukung menjalankan fluks dalam mode kuantisasi 4-bit atau 8-bit. Menjalankan versi yang dikuantisasi dapat sangat mempercepat proses pembuatan dan mengurangi konsumsi memori dengan beberapa gigabyte. Model terkuantisasi juga mengambil lebih sedikit ruang disk.
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 "
Dalam contoh ini, bobot dikuantisasi saat runtime - ini lebih mudah jika Anda tidak ingin menyimpan salinan bobot ke disk, tetapi masih ingin mendapat manfaat dari potensi speedup dan kuantisasi reduksi RAM yang mungkin terjadi.
Dengan memilih --quantize
atau -q
Flag menjadi 4
, 8
, atau menghapusnya sepenuhnya, kami mendapatkan semua 3 gambar di atas. Seperti yang dapat dilihat, ada sedikit perbedaan antara gambar (terutama antara 8-bit, dan hasil yang tidak kuantisasi). Waktu pembuatan gambar dalam contoh ini didasarkan pada mesin 2021 M1 Pro (32GB). Meskipun gambarnya hampir identik, ada speedup ~ 2x dengan menjalankan versi 8-bit kuantisasi pada mesin khusus ini. Berbeda dengan versi non-quanzed, untuk versi 8-bit penggunaan memori swap berkurang secara drastis dan pemanfaatan GPU mendekati 100% selama seluruh generasi. Hasil di sini dapat bervariasi di berbagai mesin.
Ukuran model untuk schnell
dan dev
pada berbagai tingkat kuantisasi adalah sebagai berikut:
4 bit | 8 bit | Asli (16 bit) |
---|---|---|
9.85GB | 18.16GB | 33.73GB |
Alasan ukuran bobot tidak sepenuhnya dipotong menjadi dua adalah karena sejumlah kecil bobot tidak dikuantisasi dan disimpan secara presisi penuh.
Untuk menyimpan salinan lokal dari bobot kuantisasi, jalankan perintah mflux-save
seperti itu:
mflux-save
--path " /Users/filipstrand/Desktop/schnell_8bit "
--model schnell
--quantize 8
Perhatikan bahwa saat menghemat versi terkuantisasi, Anda akan membutuhkan bobot huggingface asli.
Dimungkinkan juga untuk menentukan adaptor lora saat menyimpan model, misalnya
mflux-save
--path " /Users/filipstrand/Desktop/schnell_8bit "
--model schnell
--quantize 8
--lora-paths " /path/to/lora.safetensors "
--lora-scales 0.7
Saat menghasilkan gambar dengan model seperti ini, tidak ada adaptor Lora yang diperlukan untuk ditentukan karena sudah dipanggang ke dalam bobot kuantisasi yang disimpan.
Untuk menghasilkan gambar baru dari model kuantisasi, cukup berikan --path
ke tempat disimpan:
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 "
CATATAN: Saat memuat model terkuantisasi dari disk, tidak perlu masuk ke dalam bendera -q
, karena kita dapat menyimpulkan ini dari metadata berat.
Catatan juga: Setelah kami memiliki model lokal (dikuantisasi atau tidak) yang ditentukan melalui argumen --path
, model cache huggingface tidak diperlukan untuk meluncurkan model. Dengan kata lain, Anda dapat merebut kembali ruang disk 34GB (per model) dengan menghapus model 16-bit penuh dari cache huggingface jika Anda memilih.
Jika Anda tidak ingin mengunduh model lengkap dan menghitungnya sendiri, bobot 4-bit tersedia di sini untuk unduhan langsung:
Mflux juga mendukung menjalankan model non-kuantisasi langsung dari lokasi khusus. Dalam contoh di bawah ini, model ditempatkan di /Users/filipstrand/Desktop/schnell
:
mflux-generate
--path " /Users/filipstrand/Desktop/schnell "
--model schnell
--steps 2
--seed 2
--prompt " Luxury food photograph "
Perhatikan bahwa bendera --model
harus diatur saat memuat model dari disk.
Perhatikan juga bahwa tidak seperti saat menggunakan cara alias
khas untuk menginisialisasi model (yang secara internal menangani bahwa sumber daya yang diperlukan diunduh), saat memuat model langsung dari disk, kami mengharuskan model yang diunduh terlihat seperti berikut:
.
├── 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
Ini mencerminkan bagaimana sumber daya ditempatkan di repo huggingface untuk fluks.1. Bobot Huggingface, tidak seperti yang diekspor langsung dari proyek ini, harus diproses sedikit berbeda, itulah sebabnya kami memerlukan struktur ini di atas.
Salah satu cara untuk mengkondisikan pembuatan gambar adalah dengan memulai dari gambar yang ada dan membiarkan Mflux menghasilkan variasi baru. Gunakan bendera --init-image-path
untuk menentukan gambar referensi, dan- --init-image-strength
untuk mengontrol seberapa banyak gambar referensi harus memandu generasi. Misalnya, mengingat gambar referensi di bawah ini, perintah berikut menghasilkan gambar pertama menggunakan sketsa 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
Seperti ControlNet, teknik ini bergabung dengan adaptor Lora:
Dalam contoh-contoh di atas loras berikut digunakan sketsa, bidikan animasi dan kamera fluks-film digunakan.
MFLUX Dukungan Memuat Adaptor Lora Terlatih (Dukungan Pelatihan Aktual akan datang).
Contoh berikut the_hound lora dari @thelastben:
mflux-generate --prompt " sandor clegane " --model dev --steps 20 --seed 43 -q 8 --lora-paths " sandor_clegane_single_layer.safetensors "
Contoh berikut adalah flux_1_dev_lora_paper-cutout-style lora dari @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 "
Perhatikan bahwa bobot terlatih Lora biasanya dilatih dengan kata atau frasa pemicu . Misalnya, dalam kasus terakhir, kalimat harus mencakup frasa "gaya potongan kertas" .
Perhatikan juga bahwa bobot Lora yang sama dapat bekerja dengan baik dengan model schnell
dan dev
. Lihat repositori Lora asli untuk melihat mode apa yang dilatih.
Beberapa loras dapat dikirim untuk menggabungkan efek dari adaptor individu. Contoh berikut menggabungkan kedua Loras di atas:
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
Hanya untuk melihat perbedaannya, gambar ini menampilkan empat kasus: salah satu dari kedua adaptor sepenuhnya aktif, sebagian aktif dan tidak ada Lora sama sekali. Contoh di atas juga menunjukkan penggunaan bendera --lora-scales
.
Karena layanan penyempurnaan yang berbeda dapat menggunakan implementasi fluks yang berbeda, bobot LORA yang sesuai yang dilatih pada layanan ini dapat berbeda satu sama lain. Tujuan Mflux adalah untuk mendukung yang paling umum. Tabel berikut menunjukkan format yang didukung saat ini:
Didukung | Nama | Contoh | Catatan |
---|---|---|---|
✅ | Bfl | Civitai - Impresionisme | Banyak hal di civitai tampaknya berhasil |
✅ | Diffuser | Flux_1_dev_lora_paper-cutout-style | |
Xlabs-ai | Flux-Realismlora |
Untuk melaporkan format tambahan, contoh atau saran lain yang terkait dengan dukungan format LORA, silakan lihat masalah #47.
Mflux memiliki dukungan ControlNet untuk kontrol pembuatan gambar yang bahkan lebih halus. Dengan memberikan gambar referensi melalui --controlnet-image-path
dan parameter kekuatan melalui --controlnet-strength
, Anda dapat memandu generasi menuju gambar referensi.
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
Contoh ini menggabungkan gambar referensi ControlNet dengan fluks komik Lora Dark .
generate-controlnet
. Saat ini, controlNet yang digunakan adalah Instantx/Flux.1-dev-Controlnet-Canny, yang dilatih untuk model dev
. Ini dapat bekerja dengan baik dengan schnell
, tetapi kinerja tidak dijamin.
ControlNet juga dapat bekerja dengan baik bersama dengan adaptor Lora. Dalam contoh di bawah ini gambar referensi yang sama digunakan sebagai input ControlNet dengan prompt yang berbeda dan adaptor LORA aktif.
export HF_HUB_DISABLE_PROGRESS_BARS=1
--args
alias mflux-dev='mflux-generate --model dev'
alias mflux-schnell='mflux-generate --model schnell --metadata'
Proyek ini dilisensikan di bawah lisensi MIT.