Huggingface Diffusersの実装に基づくMLXポートオブフラックス。
MacでローカルにBlack Forest Labsから強力なフラックスモデルを実行してください!
Mfluxは、Huggingface Diffusers LibraryにApple MLXに及ぶフラックス実装のラインバイラインポートです。 MFLUXは意図的に最小限で明示的に保たれます - ネットワークアーキテクチャはハードコードされており、トークンザーを除いて構成ファイルは使用されません。目的は、これらのモデルを表現するという単一の目的を持つ小さなコードベースを持つことです(それにより、抽象化が多すぎることを避けます)。一般性とパフォーマンスよりもMFLUX優先度の読みやすさがありますが、それでも非常に高速であり、さらに速く量子化されます。
すべてのモデルはMLXでゼロから実装されており、トークナーザーのみがHuggingface Transformersライブラリを介して使用されます。それ以外は、単純な画像の後処理のためのnumpyや枕のような最小限の依存関係しかありません。
ユーザーの場合、MFLUXをインストールする最も簡単な方法は、 uv tool
を使用することです。UV uv
インストールしている場合は、単純に:
uv tool install --upgrade mflux
mflux-generate
および関連するコマンドライン実行可能ファイルを取得します。以下の使用ガイドにスキップできます。
T5エンコーダーは、2024年11月現在、Python 3.13用のインストール可能なホイールアーティファクトを持たないTentionPieceに依存しています。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
フォルダーに仮想環境が作成およびアクティブ化されます。その後、PIP経由でMFLUXをインストールします。
pip install -U mflux
git clone [email protected]:filipstrand/mflux.git
make install
make test
make lint
、 ruff
をmake format
して使用します。編集者/IDEを自動的にリント/フォーマットにセットアップするか、提供されたmake
を使用することもできます。make format
- コードをフォーマットしますmake lint
- 糸くずのエラーと警告を表示しますが、自動修正はありませんmake check
pre-commit
フックを介して、コードをフォーマットし、リントエラーを自動修正しようとしますruff
文書に相談してくださいプロンプトとモデル、およびいくつかのオプションの引数を指定して、コマンドmflux-generate
を実行します。たとえば、ここでは、2つのステップでschnell
モデルの量子化バージョンを使用します。
mflux-generate --model schnell --prompt " Luxury food photograph " --steps 2 --seed 2 -q 8
この例では、25のタイムステップでより強力なdev
モデルを使用しています。
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は現在、Huggingface Repoへのアクセスを許可されています。トラブルシューティングについては、問題トラッカーを参照してください
--prompt
(必須、 str
):生成する画像のテキスト説明。
--model
または-m
(必須、 str
):生成に使用するモデル( "schnell"
または"dev"
)。
--output
(optional、 str
、default: "image.png"
):出力image filename。
--seed
(オプション、 int
、デフォルト: None
):乱数生成のためのシード。デフォルトは時間ベースです。
--height
(オプション、 int
、デフォルト: 1024
):ピクセル単位の出力画像の高さ。
--width
(オプション、 int
、デフォルト: 1024
):ピクセル単位の出力画像の幅。
--steps
(オプション、 int
、デフォルト: 4
):推論手順の数。
--guidance
(オプション、 float
、デフォルト: 3.5
):ガイダンススケール( "dev"
モデルにのみ使用)。
--path
(オプション、 str
、デフォルト: None
):ディスク上のローカルモデルへのパス。
--quantize
または-q
(オプション、 int
、default: None
):Quantization( 4
または8
から選択)。
--lora-paths
(オプション、 [str]
、default: None
):loraウェイトへのパス。
--lora-scales
(オプション、 [float]
、default: None
):それぞれのロラのスケール(指定されていない場合はデフォルトで1.0
にデフォルトになり、1つのロラ重量のみがロードされます。)
--metadata
(オプション):同じ名前の画像のメタデータを含む.json
ファイルをエクスポートします。 (このフラグがなくても、画像メタデータは保存され、 exiftool image.png
を使用して表示できます)
--controlnet-image-path
(必須、 str
):コントロールネットが出力生成をガイドするために使用するローカル画像へのパス。
--controlnet-strength
(オプション、 float
、default: 0.4
):コントロールイメージが出力に与える影響の程度。 0.0
(影響なし)から1.0
(完全な影響)の範囲。
--controlnet-save-canny
(オプション、bool、default:false:false):設定されている場合、ControlNetで使用されるCanny Edge Detection Reference Imageを保存します。
--init-image-path
(オプション、 str
、default: None
):画像から画像の生成のための初期画像へのローカルパス。
--init-image-strength
(オプション、 float
、default: 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
マシンの仕様を見つけるには(CPUコアの数、GPUコア、およびメモリを含む、次のコマンドを実行します。
system_profiler SPHardwareDataType SPDisplaysDataType
デバイス | Mシリーズ | ユーザー | 報告された時間 | メモ |
---|---|---|---|---|
Mac Studio | 2023 m2ウルトラ | @Awni | <15s | |
MacBook Pro | 2024 m4 max(128GB) | @ivanfioravanti | 〜19 | |
MacBook Pro | 2023 m3 max | @karpathy | 〜20秒 | |
- | 2023 m2 max(96GB) | @explorigin | 〜25秒 | |
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 max(32GB) | @filipstrand | 〜70年代 | |
- | 2023 M3 Pro(36GB) | @kush-gupt | 〜80年代 | |
MacBook Pro | 2021 M1 Pro(32GB) | @filipstrand | 〜160S | |
- | 2021 M1 Pro(16GB) | @qw-in | 〜175s | Macをフリーズする可能性があります |
MacBook Air | 2020 M1(8GB) | @mbvillaverde | 〜335s | 解像度512 x 512 |
これらの数字には、アプリケーションのゼロの開始が含まれていることに注意してください。つまり、モデルI/Oの実行、重みの設定/量子化などを意味します。モデルが既にロードされていると仮定すると、 exiftool image.png
を使用して画像メタデータを検査し、合計を参照できます。除去ループの期間(テキストの埋め込みを除く)。
これらのベンチマークはそれほど科学的ではなく、球場の数値を提供することのみを目的としています。これらは、さまざまなMFLUXやMLX-versionsなどのさまざまな時期に実行されました。GPUコアの数、Macデバイスなどの追加のハードウェア情報は常にわかっているわけではありません。
画像を生成するときのランダム性の単一のソースのみがあります:初期潜在アレイ。この実装では、この最初の潜在性は、入力seed
パラメーターによって完全に決定論的に制御されます。ただし、Diffusersの実装から保存されたこの潜在アレイの固定インスタンスをインポートする場合、MFLUXはDiffusersの実装と同一の画像を作成します(固定プロンプトを想定し、Diffusersセットアップのデフォルトパラメーター設定を使用します)。
以下の画像は、この同等性を示しています。すべての場合において、Schnellモデルは2つの時間ステップで実行されました。 Diffusersの実装はCPUモードで実行されました。 MFLUXの精度は、構成クラスで設定できます。通常、16ビットと32ビットの精度を切り替える場合、最終画像には顕著ですが、非常に小さな違いがあります。
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 "
この例では、重量は実行時に量子化されます - これは、重みの量子コピーをディスクに保存したくない場合に便利ですが、潜在的なスピードアップとRAM削減の量子化がもたらす可能性のあるものから利益を得たいと考えています。
--quantize
または-q
フラグ8
4
に選択するか、完全に削除することにより、3つの画像すべてを上に取得します。ご覧のとおり、画像の間にはほとんど違いがありません(特に8ビットと非定量化された結果の間)。この例の画像生成時間は、2021 M1 Pro(32GB)マシンに基づいています。画像はほぼ同一ですが、この特定のマシンで8ビットの量子化バージョンを実行することにより、約2倍のスピードアップがあります。非定量化されたバージョンとは異なり、8ビットバージョンの場合、スワップメモリの使用量は大幅に減少し、GPUの使用率は世代全体で100%に近いです。ここでの結果は、さまざまなマシンで異なる場合があります。
さまざまな量子化レベルでのschnell
とdev
両方のモデルサイズは次のとおりです。
4ビット | 8ビット | オリジナル(16ビット) |
---|---|---|
9.85GB | 18.16GB | 33.73GB |
重みのサイズが完全に半分にカットされていない理由は、少数の重みが量子化されておらず、完全な精度で維持されているためです。
量子化された重みのローカルコピーを保存するには、次のようにmflux-save
コマンドを実行します。
mflux-save
--path " /Users/filipstrand/Desktop/schnell_8bit "
--model schnell
--quantize 8
量子化されたバージョンを保存するときは、元のハギングフェイスウェイトが必要になることに注意してください。
モデルを保存するときに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
引数を介して指定されたローカルモデル(量子化または違います)があると、モデルを起動するにはハギングフェイスキャッシュモデルが必要ありません。言い換えれば、選択した場合は、ハギングフェイスキャッシュから完全な16ビットモデルを削除することにより、34GBのディスクスペース(モデルごと)を取り戻すことができます。
完全なモデルをダウンロードして自分で量子化したくない場合は、直接ダウンロードするために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のHuggingface Repoにリソースがどのように配置されるかを反映しています。このプロジェクトから直接エクスポートされた量子化されたものとは異なり、ハギングフェイスの重みは少し異なる方法で処理する必要があるため、上記のこの構造が必要です。
画像生成を条件付ける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アダプターのロード(実際のトレーニングサポートが来ています)。
次の例@TheLastBenのThe_Hound Lora:
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-style lora from @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
違いを確認するために、この画像は4つのケースを表示します。1つは両方のアダプターを完全にアクティブ、部分的にアクティブにし、LORAをまったく使用していません。上記の例は--lora-scales
フラグの使用も示しています。
さまざまな微調整サービスがさまざまな実装のフラックスを使用できるため、これらのサービスでトレーニングされた対応するLORAウェイトは互いに異なる場合があります。 Mfluxの目的は、最も一般的なものをサポートすることです。次の表は、現在のサポートされている形式を示しています。
サポート | 名前 | 例 | メモ |
---|---|---|---|
✅ | BFL | Civitai-印象派 | Civitaiの多くのことは機能しているようです |
✅ | ディフューザー | flux_1_dev_lora_paper-cutout-style | |
xlabs-ai | フラックスリアリスミスlora |
追加の形式、例、またはLORA形式のサポートに関連するその他の提案を報告するには、#47を参照してください。
MFLUXは、画像生成のさらに微細な制御をコントロールネットサポートしています。 --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 Comic Fluxを組み合わせています。
generate-controlnet
コマンドを初めて実行するときに自動的に発生します。現時点では、使用されているコントロールネットはInstantx/Flux.1-dev-controlnet-cannyであり、 dev
モデル用に訓練されています。 schnell
でうまく機能する可能性がありますが、パフォーマンスは保証されていません。
ControlNetは、LORAアダプターと一緒にうまく機能することもできます。下の例では、同じ参照画像が異なるプロンプトとLORAアダプターがアクティブを使用したControlNet入力として使用されます。
export HF_HUB_DISABLE_PROGRESS_BARS=1
--args
を渡す代わりに、ファイル内の複雑なジョブパラメーターを保存しますalias mflux-dev='mflux-generate --model dev'
alias mflux-schnell='mflux-generate --model schnell --metadata'
このプロジェクトは、MITライセンスの下でライセンスされています。