画像生成AI FLUX.1 をBlack Forest Labs リファレンス実装、Diffusers、ComfyUI で動かしてみた（セルフホスト）

## はじめに
Stable Diffusion の開発メンバーなどが立ち上げた __[Black Forest Labs](https://blackforestlabs.ai/)__ の画像生成AIモデル __FLUX.1__ が話題になっています。プロンプトへの追随性能もなかなか良く、人物も指や四肢の破綻の少ない高品質な画像を生成することができます。また、`[pro]`、`[dev]`、`[schnell]`の3つのモデルのうち __[dev]__ と __[schnell]__ はモデルウェイトが公開されていて OCI のようなクラウドやローカル環境でセルフホスティングすることができます。
<table>
<tr>
<td>

![ComfyUI_00077_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/f910cd82-fc67-93e0-90e9-86c03034a892.png)
</td>
<td>

![ComfyUI_00132_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/eef1e00f-8724-aab1-62c4-0a25beb9cbcd.png)
</td>
</tr>
</table>

この記事では、ローカルの Windows 11 PC、それも、__Nvidia GeForce RTX2060 VRAM 6GB__ という FLUX.1 のような巨大モデルには厳し過ぎる GPU 環境で様々な方法で動かしてみた経験をまとめています。
- __[Black Forest Labs リファレンス実装（Model Offloading、NSFW検知）](#black-forest-labs-リファレンス実装)__
- __[Hugging Face Diffusers（量子化、Model Offloading）](#hugging-face-diffusers)__
- __[ComfyUI](#comfyui)__ 

これらの 3つのセルフホスティング手法をいずれも Windows の共有GPUメモリが有効な状態で試しています。

:::note
プログラミングはしないのでノーコードで画像生成したい方は、後半の [ComfyUI](#comfyui) へ直行していただくのが良いかもしれません
:::
:::note
どの方法も OCI などのクラウドの GPU インスタンスでも同じ手順が使えるはずです（インターネットからアクセスできないインスタンス上の Gradio や ComfyUI の WebUI は Pinggy や Localtunnel でトンネルさせることができます　⇒　[OCI Cloud Shell でも VS Code を使いたい](https://qiita.com/yuji-arakawa/items/654d936ca616334286b0) と同じ手順）
:::


ちなみに、同じ弱弱GPU環境で Stable Diffusion 3 Medium を動かしてみたときの記事もありますので、やっぱりSDが好きという方はこちら ↓ も覗いてみてください。

https://qiita.com/yuji-arakawa/items/1a8cfeff8f81ba808389

## FLUX.1 とは
### 高画質
<table>
<tr>
<td>

![ComfyUI_00064_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/5bb9e8d0-c27f-15b1-9a1a-daede10867cb.png)
</td>
<td>

![ComfyUI_00133_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/c2a6f7ce-34d0-b582-7fb5-d9714c1e67b4.png)

</td>
</tr>
</table>

### アニメ風のイラストも得意
<table>
<tr>
<td>

![ComfyUI_00070_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/28dc1c1f-27f7-5ea2-cd59-b74c0d881fa2.png)
</td>
<td>

![ComfyUI_00131_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/8a660642-38fd-35f3-f089-a20a582416eb.png)
</td>
</tr>
</table>

### プロンプトの効きが良い
<table>
<tr>
<td>

![ComfyUI_00094_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/e29fd81d-fb39-9bc1-ef9f-5254d972d446.png)
</td>
<td>

![ComfyUI_00091_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/2542e261-ec5c-c1d4-5315-a8d3737201b5.png)
</td>
</tr>
<tr>
<td>

![ComfyUI_00101_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/73707c45-a098-1ce9-bf8a-27ae592e7d25.png)
</td>
<td>

![ComfyUI_00100_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/2426d1f1-ef3c-6bf6-4bba-a8b41116f189.png)
</td>
</tr>
</table>

### 文字も綺麗（アルファベット）
<table>
<tr>
<td>

![ComfyUI_00116_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/7ff2301c-bf75-84c3-4ecf-60660fd71764.png)
</td>
<td>

![flux-schnell.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/20e1c637-f6ce-5884-d9f6-89e2aeebb6ca.png)
</td>
</tr>
</table>

### 巨大
__12B（120億）パラメータ__

### FLUX.1 [dev]
https://github.com/black-forest-labs/flux/blob/main/model_cards/FLUX.1-dev.md
- オープンウェイト（モデルウェイトを公開）
- クローズドソース（モデルウェイトを公開していない）モデルに匹敵するプロンプト追随性能
- Guidance Distillation を使ってFLUX.1[pro]から直接蒸留したモデル。高品質なイメージを効率的に生成
- 生成された出力は、個人的、科学的、商業的な目的で使用することが可能。出力、つまり、生成された画像は商用でも利用可能ですが出力以外の派生物（ファインチューニングしたモデルなど）は商業的な利用はできませんのでご注意ください。詳しくは、ライセンスの定義 [flux-1-dev-non-commercial-license](https://huggingface.co/black-forest-labs/FLUX.1-dev/blob/main/LICENSE.md) を参照してください

### FLUX.1 [schnell]
https://github.com/black-forest-labs/flux/blob/main/model_cards/FLUX.1-schnell.md
- オープンウェイト（モデルウェイトを公開）
- クローズドウェイト（モデルウェイトを公開していない）モデルに匹敵するプロンプト追随性能
- latent adversarial diffusion distillation により高品質なイメージを 1 ～ 4 ステップで生成できる最速モデル
- 生成された出力は、個人的、科学的、商業的な目的で使用することが可能。ライセンスは、`apache-2.0`
https://github.com/black-forest-labs/flux/blob/main/model_cards/FLUX.1-schnell.md

### FLUX.1 [pro]
- クローズドウェイト（モデルウェイトを公開していない）
- FLUX.1の最高峰で、プロンプトの追従性、ビジュアルクオリティ、画像のディテール、出力の多様性など、最先端のパフォーマンスを備えた画像生成を提供

:::note warn
[Black Forest Labs の APIサービス](https://docs.bfl.ml/) もしくは、[Replicate](https://replicate.com/collections/flux) と [fal.ai](https://fal.ai/) のサービスでのみ利用可能。（fal.ai については Black Forest Labs の公式ページに名前がありますが 2024/8/11 時点では fal.ai のサイト上に [pro] は見当たりません。[dev] と [schnell] は利用できるようです）
:::

なお、[pro] はセルフホストできないためこの記事ではこれ以上は触れていません。

## Black Forest Labs リファレンス実装
https://github.com/black-forest-labs/flux

ComfyUI や AUTOMATIC1111氏の Stable Diffusion Web UI のような出来合いの UI からではなく自分でプログラムを組みたいときのリファレンス実装です。Text to Image と Image to Image（FLUX.1 [dev] のみ） の実装を確認＆お試しできます。

:::note
[Falconsai/nsfw_image_detection](https://huggingface.co/Falconsai/nsfw_image_detection) を使った NSFW（Not Safe for Work：職場での閲覧に適さない画像） の検知なども実装されていてとても参考になりますね
:::

### 前提条件
- CUDA 対応の GPU を搭載したハードウェア
- PyTorch が対応している CUDA Toolkit のバージョンがインストールされていること（[PyTorch と CUDA Toolkit のバージョンコンパチビリティの確認](https://pytorch.org/get-started/locally/)）

### インストール
インストール先のフォルダ（ディレクトリ）にリファレンス実装のリポジトリをクローンします
```
git clone https://github.com/black-forest-labs/flux
cd flux
```
Python 仮想環境を作成します（推奨）。ここでは、venv を使います
```bash:Python仮想環境の作成（Windows Git Bash の場合）
py -3.11 -m venv .venv
source .venv/Scripts/activate
```
```bash:Python仮想環境の作成（Linux の場合）
python3.11 -m venv .venv
source .venv/bin/activate
```
依存するパッケージをインストールします
```bash:依存パッケージのインストール
pip install -e '.[all]'
```
#### PyTorch の確認
CUDA対応の PyTorch がインストールされたことを確認します
```bash:PyTorchバージョン確認
pip show torch
```
```bash:出力例
$ pip show torch
Name: torch
Version: 2.4.0+cu124
Summary: Tensors and Dynamic neural networks in Python with strong GPU acceleration
Home-page: https://pytorch.org/
Author: PyTorch Team
Author-email: packages@pytorch.org
License: BSD-3
Location: d:\lab\FLUX\FLUX.1\.venv\Lib\site-packages
Requires: filelock, fsspec, jinja2, networkx, sympy, typing-extensions
Required-by: accelerate, optimum-quanto
```
この出力例のように `Version` に バージョン番号に続いて `+cu124` のような CUDA Toolkit バージョンが表示されていれば正しくCUDA対応の PyTorch がインストールされています。`Version: 2.4.0` のように PyTorch のバージョン番号だけが表示された場合は、CUDA 対応ではありませんので、CUDA 対応 PyTorch をインストールします。その場合は、PyTorch をアンインストールして、再度適切な PyTorch をインストールします。[PyTorch と CUDA Toolkit のバージョンコンパチビリティの確認](https://pytorch.org/get-started/locally/)でインストールコマンドを確認することができます。

#### CUDA 対応 PyTorch のインストール（上の確認結果で必要な場合のみ）
```bash:torch のアンインストール
pip uninstall torch
```
```bash:CUDA Toolkit のバージョン確認
nvcc --version
```
```bash:nvcc 出力例
$ nvcc --version
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on Thu_Mar_28_02:30:10_Pacific_Daylight_Time_2024
Cuda compilation tools, release 12.4, V12.4.131
Build cuda_12.4.r12.4/compiler.34097967_0
```
最後の行の `Build cuda_` の後に CUDA Toolkit のバージョンが表示されています
これの例では 12.4 であることがわかります
[PyTorch と CUDA Toolkit のバージョンコンパチビリティの確認](https://pytorch.org/get-started/locally/)でインストールコマンドを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/6ad00775-7579-ba24-0602-ba394f4901cb.png)

この例の場合のインストールコマンドは次のようになります。
```bash:PyTorchインストールコマンド
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124
```
FLUX.1 を使用するためには `torch` と `torchvision` だけあれば良いので torchaudio を除いた以下のコマンドでも大丈夫です
```bash:PyTorchインストール
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu124
```
CUDA対応の PyTorch がインストールされたかどうか確認します
```bash:PyTorchバージョン確認
pip show torch
```
```bash: torchvision バージョン確認
pip show torchvision
```
### ライセンス条件への同意とHugging Face へログイン（Dev を使用する場合のみ）
:::note warn
FLUX.1 Dev を使用する場合には Hugginface にログインして認証してもらう必要があります。ライセンス条件に同意したアカウントでログインしていないとこのようなエラーが出てモデルをダウンロードできません。
```
Cannot access gated repo for url https://huggingface.co/black-forest-labs/FLUX.1-dev/resolve/main/model_index.json.
Access to model black-forest-labs/FLUX.1-dev is restricted. You must be authenticated to access it.
```
:::
- Hugging Face のアカウントを取得します（[Hugging Face アカウント作成ページ](https://huggingface.co/join) で無料で登録することができます）
- Hugging Face の User Access Token を取得します（[Hugging Face User Access Token 作成ページ](https://huggingface.co/settings/tokens) で無料で取得できます。"Type" は、"READ"）
- FLUX.1-dev の [Model Card](https://huggingface.co/black-forest-labs/FLUX.1-dev) に表示されている "You need to agree to share your contact information to access this model" から Hugging Face にログインしてモデルなどのコンテンツにアクセスする条件に同意する必要があります（一度、同意するとこの表示は現れなくなります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/65cd0a57-a450-b4fa-03fa-63f7a3acbdb7.png)


#### Hugging Face CLI のインストール
```
pip install huggingface_hub
```
#### Hugging Face にログイン
ターミナル（コマンドプロンプト）で次のコマンドを実行します
```
huggingface-cli login
```
Hugging Face のバナーが表示されてトークン（User Access Token）の入力を促されます
```
(.venv) Japanese_Stable_VLM $ huggingface-cli login

    _|    _|  _|    _|    _|_|_|    _|_|_|  _|_|_|  _|      _|    _|_|_|      _|_|_|_|    _|_|      _|_|_|  _|_|_|_|
    _|    _|  _|    _|  _|        _|          _|    _|_|    _|  _|            _|        _|    _|  _|        _|
    _|_|_|_|  _|    _|  _|  _|_|  _|  _|_|    _|    _|  _|  _|  _|  _|_|      _|_|_|    _|_|_|_|  _|        _|_|_|
    _|    _|  _|    _|  _|    _|  _|    _|    _|    _|    _|_|  _|    _|      _|        _|    _|  _|        _|
    _|    _|    _|_|      _|_|_|    _|_|_|  _|_|_|  _|      _|    _|_|_|      _|        _|    _|    _|_|_|  _|_|_|_|

    To login, `huggingface_hub` requires a token generated from https://huggingface.co/settings/tokens .
Token can be pasted using 'Right-Click'.
Enter your token (input will not be visible):
```
ここで Hugging Face のトークン（User Access Token）を入力します
```
Add token as git credential? (Y/n)
```
ここで、トークンを Git の認証情報として追加するかを選択します。どちらでも本アプリケーションの実行には影響ありません
トークンが正しければ次のように表示されてログイン完了です
```
Token is valid (permission: read).
Your token has been saved to C:\Users\yujim\.cache\huggingface\token
Login successful
```
### 公式リファレンス実装デモ（Gradio版）を実行
#### 起動
```
python demo_gr.py --offload --share --device cuda
```
`--offload` は、コンポーネントが必要な時にだけ GPU VRAM へロードされ使われていないときには CPU（にぶら下がっている）メモリへオフロードするよう指示しています。RTX 2060 の VRAM が 6GB しかないためこれを指定しています
`--share` は、Gradio アプリケーションにインターネット経由でアクセスできるようにパブリックURLを割り当ててトラフィックをトンネルさせる指定です。クラウド環境を使うような場合に便利です
`--device` で GPU を使用するように指示しています。これはデフォルトですのでなくても大丈夫です
ここでは指定していませんが `--name` で使いたいモデルを `flux-schnell`か `flux-dev` で指定できます。`flux-schnell` がデフォルトです。

なお、起動オプションはヘルプで確認できます
```ヘルプ（オプションの確認）
$ python demo_gr.py -h
usage: demo_gr.py [-h] [--name {flux-dev,flux-schnell}] [--device DEVICE]
                  [--offload] [--share]

Flux

options:
  -h, --help            show this help message and exit
  --name {flux-dev,flux-schnell}
                        Model name
  --device DEVICE       Device to use
  --offload             Offload model to CPU when not in use
  --share               Create a public link to your demo
```

上記の起動コマンドを実行するとモデルのダウンロード／ロードが行われ Gradio サーバが起動すると以下のようなメッセージが表示されます
```
Running on local URL:  http://127.0.0.1:7860
Running on public URL: https://xxxxxxxxxxxxx.gradio.live
```
初回は、Hugging Face からモデルをダウンロードするためかなり時間がかかります。2回目以降も UI のサーバを起動する前にモデルをローカルキャッシュからメモリへのロードするため環境よっては時間がかかります（ディスクが遅いなど）。
このメッセージが表示されたらローカルで実行している場合は local URL:  http://127.0.0.1:7860 を、クラウドなどのリモートで実行している場合は public URL: https://xxxxxxxxxxxxx.gradio.live をブラウザで開きます（xxxxxxxxxx は都度異なります）。Gradio の UI が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/92d71c75-a5e8-ca53-8a61-ce0f616aa764.png)

#### 生成（Text to Image）
"Generate" をクリックします。"Prompt" にはデフォルトのプロンプトが仕込まれています。
生成が完了するとこのような画像が生成されます。
![ea6e1684-b625-4a6b-8eac-d470a0580990.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/18d0af25-4156-7a63-9ebe-d976a18c92de.jpeg)

このときの生成中のGPU メモリ使用量の最大値は 26.4GB（専用 GPU メモリ：5.7G + 共有 GPU メモリ：20.7GB）でした。4 Step で生成できる Schnell でも __7000秒__ もかかってしまいました.... ~~Difffusers ではこのようなことは起こらなかった ので理由は理解できていません~~（Diffuses でも、bfloat16 を使った際に似たようなことが起きていました。RTX2060には bfloat のハードウェアサポートが無いためと思われます。Diffusers では、bfloat16 の代わりに float16 を使ってしのいでいます。同じ原因の可能性もあります）....私の弱弱GPUのような環境の方は [Hugging Face Diffusers](#hugging-face-diffusers) を、プログラミングには興味が無い方は[ComfyUI](#comfyui)を試された方がいいかもしれません。


プロンプトを変えて生成してみます。左上の　”Prompt” に別のプロンプトを入力して生成してみます。

ComfyUI Examples の Flux.1 公式の workflow に設定されているケモ耳の女の子プロンプトに「大きな丸い眼鏡をかけている」を追加したプロンプトを使ってみました。生成された画像はこちらです
<table>
<tr>
<td>

![2f498faf-679b-49b9-b280-8a31284120bb.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/b1a6bea1-12f2-4ad5-743c-c17965990df7.jpeg)
</td>
</tr>
<tr>
<td>
cute anime girl with massive fluffy fennec ears and a big fluffy tail blonde messy long hair blue eyes wearing a maid outfit with a long black gold leaf pattern dress, wearing big round glasses and a white apron mouth open holding a fancy black forest cake with candles on top in the kitchen of an old dark Victorian mansion lit by candlelight with a bright window to the foggy forest and very expensive stuff everywhere
</td>
</tr>
</table>


※ Dev を使用する際のデフォルトは 50 Step ですが 20 Step 程度でも良い結果が得られると思います。Gradio UI の "Advanced Options" にある "Number of steps" を 調整して生成します

### Image to Image　(Flux.1 [dev] のみ)
"Prompt" の直下の "Image to Image" のチェックボックスにチェックを入れます。すると画像をアップロードするエリアが表示されます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/b259e5cd-cb90-e7a0-d0f6-27ace48a2fac.png)

画像をアップロートして、"Prompt" を設定して "Generate" をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/67f36181-2a87-71b5-806e-95645eaf1767.png)


## Hugging Face Diffusers
### Diffusers とは？
Diffusersは、Hugging Faceが開発した拡散モデル（Diffusion Model）のためのオープンソースライブラリです

#### Diffusers の特徴
- __簡潔さ__ : 数行のコードで画像生成などの複雑なタスクを実行できます
- __柔軟さ__ : モデルのカスタマイズや新しいモデルの開発が容易にできます
- __豊富な事前学習済みモデル__ : Hugging Face Hub からStable Diffusion、FLUX等の多数の事前学習済みモデルを簡単にダウンロードして使用できます
---
### FLUX.1 [dev] @ Hugging Face
#### デモ（Hugging Face Spaces）
https://huggingface.co/spaces/black-forest-labs/FLUX.1-dev
#### モデルカード
https://huggingface.co/black-forest-labs/FLUX.1-dev
### FLUX.1 [schnell]  @ Hugging Face
#### デモ（Hugging Face Spaces）
https://huggingface.co/spaces/black-forest-labs/FLUX.1-schnell
#### モデルカード
https://huggingface.co/black-forest-labs/FLUX.1-schnell

---
### Diffusers を使ったサンプルコード

https://github.com/kutsushitaneko/flux1-diffusers

このサンプルコード（私、kutsushitaneko版）は、起動時の指定で Optimum Quanto を使った量子化に対応しています。Optimum Quanto は、Hugging Face Optimum の量子化バックエンドです。

https://github.com/huggingface/optimum-quanto

#### 前提条件
- CUDA 対応の GPU を搭載したハードウェア
- PyTorch が対応している CUDA Toolkit のバージョンがインストールされていること（[PyTorch と CUDA Toolkit のバージョンコンパチビリティの確認](https://pytorch.org/get-started/locally/)）

#### サンプルコードの取得
Github のリポジトリからクローンします
```
git clone https://github.com/kutsushitaneko/flux1-diffusers.git
cd flux1-diffusers
```

Python 仮想環境を作成します（推奨）。ここでは、venv を使います
```bash:Python仮想環境の作成
python3.10 -m venv .venv
source .venv/bin/activate
```
#### PyTorch のインストール
[CUDA 対応 PyTorch のインストール（上の確認結果で必要な場合のみ）](#cuda-対応-pytorch-のインストール上の確認結果で必要な場合のみ) の手順で CUDA 対応バージョンの PyTorch をインストールします

#### Hugging Face へログイン（Dev を使用する場合のみ）
[こちら](#ライセンス条件への同意とhugging-face-へログインdev-を使用する場合のみ) の手順で Hugging Face にログインします
#### 依存パッケージのインストール
```bash:依存パッケージインストール
pip install -r requirements.txt
```
#### Diffusers版サンプルコードの実行
```bash:ヘルプ（オプション）の表示
FLUX1Quantize_and_Generate.py -h
```
```bash:ヘルプの出力
$ python FLUX1Quantize_and_Generate.py -h
usage: FLUX1Quantize_and_Generate.py [-h] [--model {flux-schnell,flux-dev}] [--offload] [--weight {int2,int4,int8,fp8,none}] [--share] [--inbrowser]

Flux.1 with Diffusers demo app

options:
  -h, --help            show this help message and exit
  --model {flux-schnell,flux-dev}
                        Model name(default: flux-schnell)
  --offload             Offload model to CPU when not in use
  --weight {int2,int4,int8,fp8,none}
                        quantization precision(default: int8)
  --share               Create a public link to your demo
  --inbrowser           Launch the demo in the browser
```
モデルには、FLUX.1 Schnell（デフォルト） を int8 量子化（デフォルト）、Model Offload あり、Public URL で共有あり、自動的にブラウザに表示でアプリを起動するには次のコマンドを使います
```bash:アプリ起動
python FLUX1Quantize_and_Generate.py --offload --share --inbrowser
```
起動には、量子化（weight に int2, int4, init8（デフォルト）, fp8 を指定）した場合は 私の環境 で 4分程度、量子化しない場合（weight に none を指定した場合）に 1分程度かかります

アプリが起動すると次のようなメッセージが表示されます
```bash:コンソールメッセージ
...
...
パイプラインの作成時間: 52.15 秒
Running on local URL:  http://127.0.0.1:7860
Running on public URL: https://xxxxxxxx.gradio.live

This share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)
```
ブラウザが自動的に立ち上がらない場合は、ローカル環境であれば local URL の http://127.0.0.1:7860 を、クラウドなどのリモート環境であれば public URL の https://xxxxxxxx.gradio.live をブラウザで開きます（xxxxxxxx は都度異なります）。この public URL は アプリを終了しない限り 72時間有効です。アプリを終了する際は Ctrl-C で終了します

##### 画像生成
<table>
<tr>
<td>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/b7152bec-cf48-97d4-79f5-20a64979828a.png)
</td>
</tr>
<tr>
<td>
量子化しない（weight = none）場合の表示例
</td>
</tr>
</table>

詳細設定をクリックすると画像のサイズなどを設定できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/eca13a83-248c-8479-3cc8-c8a1189c8904.png)

左上の "Prompt" に生成したい画像のプロンプト（英語）を入力して「画像生成」ボタンをクリックすると生成が始まります


##### 生成完了時の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/2c0384cd-196e-d568-e57b-4a4a06b3952b.png)

##### 生成画像例
<table>
<tr>
<td>

![flux-schnell-output2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/e2a59a47-41d0-375e-d607-72d5a545d3fb.png)
</td>
<td>

![flux-schnell-output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/79a3459d-f08b-5875-fe3f-9455c2995466.png)

</td>
</tr>
<tr>
<td>
A cat holding a sign that says Hello Kitty
</td>
<td>
A cute anime girl is standing on the hill. She has black hair, a bob, a white beret, and a red cardigan over a white blouse. Her skirt is a white fluffy mini frill skirt with a large spread. She is wearing white knee-high socks. Her shoes are pink. Cherry blossoms are dancing on the asphalt slope leading to the hill. The composition is looking up at her from the bottom of the hill
</td>
</tr>
<tr>
<td>

![aek3s-wuk7r.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/2d3a4fa6-60f0-1da8-908e-0b284bbd3396.png)

</td>
<td>

![a079f-y2om1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/c5716627-1996-2433-9a9c-fc0b6b6944c5.png)
</td>
</tr>
<tr>
<td>
3D animation style graphics reminiscent of Pixar of a magical girl in a pink costume. She is holding a magic wand. Beside her is a white cat
</td>
<td>
Cat driving a motorcycle
</td>
</tr>
</table>

#### サンプルコードの説明
```python:Diffusers FluxPipeline のインポート
from diffusers import FluxPipeline
```
FLUX.1 でテキストから画像を生成する pipeline のクラスです
```python:Diffusers Pipeline の生成
def create_pipe(model: str, offload = True, weight = "int8"):
    if model == "flux-schnell":
        bfl_repo = "black-forest-labs/FLUX.1-schnell"
    elif model == "flux-dev":
        bfl_repo = "black-forest-labs/FLUX.1-dev"
    else:
        raise ValueError(f"Invalid model name: {model}")

    start_time = time.time()
    pipe = FluxPipeline.from_pretrained(
        bfl_repo, torch_dtype=torch.float16
    )

    if weight != "none":
        quantize(pipe.transformer, weights=UNET_QTYPES[weight], exclude=["proj_out", "x_embedder", "norm_out", "context_embedder"])
        freeze(pipe.transformer)
        quantize(pipe.text_encoder_2, weights=UNET_QTYPES[weight])
        freeze(pipe.text_encoder_2)

    if offload:
        pipe.enable_model_cpu_offload()
    else:
        pipe.to("cuda")

    end_time = time.time()
    execution_time = end_time - start_time
    print(f"パイプラインの作成時間: {execution_time:.2f} 秒")
    return pipe
```

`FluxPipeline.from_pretrained(bfl_repo, torch_dtype=torch.float16)` で `bfl_repo` に指定された Hugging Face Hub のリポジトリからモデルをダウンロードして、text2image の pipeline を生成しています

:::note
`torch_dtype=torch.float16` としていますが本来は、`float16` ではなく `bfloat16` です。私の PC の GPU RTX2060 には `bfloat16` のハードウェアサポートがなく非常に遅くなるため RTX2060 でもハードウェアサポートがある `float16` としています。
:::
:::note warn
`bfloat16` と `float16` では生成される画像が異なります。この問題への対処方法は Diffusers のドキュメントの[Running FP16 inference](https://huggingface.co/docs/diffusers/main/api/pipelines/flux#running-fp16-inference)に記載がありますが、このサンプルコードでは未対応です。
`bfloat16` に対応した GPU を使う場合は `bfloat16` を使ってください。
:::

起動パラメータの weight に none 以外が指定された場合、Optimum Quanto の `quantize()` を使って量子化しています。量子化することで GPU の VRAM 消費量を減らすことができます。ただし、量子化処理に CPU 側のメモリを大量に必要とします。CPU側のメモリが 64GBあれば余裕で量子化できますが 32GB だと厳しいかもしれません

また、起動パラメータ offload が指定された場合は、`enable_model_cpu_offload()`で Model Offloading しています。これは、モデルのコンポーネントが必要なときにだけ GPU VRAM に載り、使用していないときには CPU側のメモリへ退避することで GPU VRAM の必要量を削減する機能です

:::note
さらに GPU VRAM の使用量を抑制するには、以下の機能の利用が考えられます
- enable_sequential_cpu_offload()
- vae.enable_slicing()
- vae.enable_tiling()

詳しくは、Diffusers のドキュメントの [Reduce memory usage](https://huggingface.co/docs/diffusers/optimization/memory#reduce-memory-usage) に詳しい説明があります
:::

### LoRA
LoRA (Low-Rank Adaptation) は、大規模な事前学習済みモデルを効率的にファインチューニングするための技術です。特に画像生成AIの分野で元のモデルの画風を変えたり特定の種類の画像を意図したとおりに生成されやすくする目的で多く活用されています
Diffusers を使った LoRA の適用については別のブログを書きました。こちら ↓ です。

https://qiita.com/yuji-arakawa/items/8d065ae3df536f5cd559

さらに、別の LoRA を試した続編↓です。

https://qiita.com/yuji-arakawa/items/9525beab101b8e1d6452

## ComfyUI
### ComfyUI のインストール
動作環境毎（Windows/Linux/Mac）のインストール手順はこちら ↓ に説明があります

https://github.com/comfyanonymous/ComfyUI

ここでは Windows の場合だけ説明します

#### Windows での前提条件
- CUDA 対応の GPU を搭載したハードウェア
- PyTorch が対応している CUDA Toolkit のバージョンがインストールされていること（[PyTorch と CUDA Toolkit のバージョンコンパチビリティの確認](https://pytorch.org/get-started/locally/)）

#### Windows へのComfyUIインストール手順
- [ダウンロードファイルのダイレクトリンク](https://github.com/comfyanonymous/ComfyUI/releases/latest/download/ComfyUI_windows_portable_nvidia.7z) から [7-Zip](https://7-zip.org/) ファイルをダウンロードします
- ダウンロードしたファイルを [7-Zip](https://7-zip.org/) で解凍します 
- `ComfyUI_windows_portable` というフォルダが現れますのでこれを開きます
- `update` フォルダを開きます
- `update_comfyui_and_python_dependencies.bat` をダブルクリックします（CUDA Toolkit 12.1 対応の PyTorch が決め打ちでインストールされます。私は CUDA Toolkit 11.8 ですが、このまま 12.1 対応 PyTorch がインストールされた状態で動作しています。動作に問題があるようでしたら PyTorch だけ適切なバージョンを入れなおしてみるもの良いかもしれません。その場合は、[PyTorch の確認](#pytorch-の確認) と[CUDA 対応 PyTorch のインストール（上の確認結果で必要な場合のみ）](#cuda-対応-pytorch-のインストール上の確認結果で必要な場合のみ) を参考にしてみてください）
- `ComfyUI_windows_portable` フォルダに戻ります

### ComfyUI における FLUX.1 の使い方
https://comfyanonymous.github.io/ComfyUI_examples/flux/

こちら ↑ の公式サイトに記載がありますが、以下に私がやってみたときのメモをまとめておきます。
#### FLUX.1 モデルのダウンロード
ComfyUI 用の FLUX.1 のモデルには、Dev と Schnell のそれぞれに
- `FP8 Checkpoint Version`（シングルファイル）
- `Regular Full Version`（テキストエンコーダー、VAE、拡散モデルが別々のファイル）

があります。Regular Full Version は、fp16 で 32GB 以上の GPU VRAM を必要とします。私のような小さな VRAM の GPU しか持っていない人は [FP8 Checkpoint Version](https://comfyanonymous.github.io/ComfyUI_examples/flux/#simple-to-use-fp8-checkpoint-version) が向いていそうです。

しかし、私の RTX2060 では、FP8 Checkpoint Version は画像生成が永遠に終わりません。実際には永遠には試していませんが数時間経過しても 1 Step も生成が進みません。RTX2060 には fp8 のハードウェアサポートが無いからでしょうか...とはいえ、Diffusers で量子化した際には int8 も fp8 の生成時間に差は見られなかったので謎です...

ということで、__Regular Full Version__ を使用します。あれ？32GB GPU VRAM が必要なのではと思われたと思いますが Windows では共有GPUメモリという OS 仮想メモリのスワップアウトのような仕組みがあり GPU の VRAM からあふれた分は CPU にぶら下がっている通常のメモリにスワップアウトしてくれます。もちろん、速度は大幅に落ちてしまいますがそもそもこんな古いGPUで動かそうとしているので贅沢は言えません。動くだけ有難いということで。（fp8 がうまく動作しないのは私の環境問題か何か手順でミスをしているのかもしれません。試してみたい方は [Simple to use FP8 Checkpoint version](https://comfyanonymous.github.io/ComfyUI_examples/flux/#simple-to-use-fp8-checkpoint-version) に手順があります。__生成時に CFG を 1.0__ にするのを忘れないようにしましょう）

##### テキストエンコーダー
FLUX.1 のテキストエンコーダーは CLIP と T5 の2つがあります。SD3 Medium では、CLIP だけで動作させることができましたが FLUX.1 では両方必要なようです（下記の workflow で試す限りは CLIP だけではエラーとなりました）。Dev と Schnell による違いはありません。

###### CLIP のダウンロード
[Hugging Face Hub の comfyanonymous/flux_text_encoders リポジトリ](https://huggingface.co/comfyanonymous/flux_text_encoders/tree/main) から `clip_l.safetensors` をダウンロードします。ファイルは、`ComfyUI/models/clip/` フォルダに配置します。Windows の場合、インストール時に ComfyUI の 7-Zip ファイルを解凍すると `ComfyUI_windows_portable` というフォルダができていて、その直下に `ComfyUI` フォルダがあるはずです。

###### T5 のダウンロード
[Hugging Face Hub の comfyanonymous/flux_text_encoders リポジトリ](https://huggingface.co/comfyanonymous/flux_text_encoders/tree/main) から `t5xxl_fp16.safetensors` をダウンロードします。ファイルは、CLIP のときと同様に `ComfyUI/models/clip/` フォルダに配置します。 

T5 には、FP16 の `t5xxl_fp16.safetensors` と FP8 の `t5xxl_fp8_e4m3fn.safetensors` があります。公式には、メモリ消費量を抑えるためには `t5xxl_fp8_e4m3fn.safetensors` が使える、しかし、32GB 以上のメモリがあれば `t5xxl_fp16.safetensors` を勧めると書かれています。私の共有GPUメモリ必須な 6GB VRAM 環境ではどちらを使っても生成時間に差は見られませんでした。これだけ環境が弱弱だともはや五十歩百歩ということなのでしょうか。それとも GPU VRAM に載っていないといけない領域の局所性が高いということなのでしょうか。このあたりよく理解できていません。というのは、公式のリファレンス実装や Diffusers では共有GPUメモリを使うと生成時間が実用性がまるでないレベルになるのに ComfyUI では、テキストエンコーダーも拡散モデルも FP16 を使っているのに公式のリファレンス実装よりも10倍も生成速度が速いのです。ComfyUI が何か工夫をしているのだと思います。ということで精度が高い `t5xxl_fp16.safetensors` を使っています。

##### VAE のダウンロード
VAE も Dev と Schnell で共通です。
[Hugging Face Hub の black-forest-labs/FLUX.1-schnell リポジトリ](https://huggingface.co/black-forest-labs/FLUX.1-schnell/blob/main/ae.safetensors) から `ae.safetensors` をダウンロードします。ファイルは、`ComfyUI/models/vae/` フォルダに配置します。

##### FLUX.1 拡散モデル
拡散モデルは、 Dev か Schnell か使いたいモデルによって異なります。

###### FLUX.1 Dev 拡散モデルのダウンロード（Dev を使用する場合のみ）
[Hugging Face Hub の black-forest-labs/FLUX.1-dev リポジトリ](https://huggingface.co/black-forest-labs/FLUX.1-dev/tree/main) から `flux1-dev.safetensors` をダウンロードします。ファイルは、`ComfyUI/models/unet/` フォルダに配置します。

###### FLUX.1 Schnell 拡散モデルのダウンロード（Schnell を使用する場合のみ）
[Hugging Face Hub の black-forest-labs/FLUX.1-dev リポジトリ](https://huggingface.co/black-forest-labs/FLUX.1-schnell/tree/main) から `flux1-schnell.safetensors` をダウンロードします。ファイルは、`ComfyUI/models/unet/` フォルダに配置します。

#### 画像生成
ComfyUI で画像生成を行うためには workflow を定義する必要があります。Dev 用の workflow と Schnell 用の workflow が埋め込まれた画像がそれぞれ公式から提供されています。

##### CompyUI を起動
Windows の場合、ComfyUI の7-Zip ファイルを解凍して作られた `ComfyUI_windows_portable` フォルダの `run_nvidia_gpu.bat` をダブルクリックします。ブラウザに ComfyUI が表示されます

##### FLUX.1 Dev workflow のセットアップ（Dev を使用する場合のみ）

###### Dev 用 workflow をロード
[ComfyUI Examples Flux Dev](https://comfyanonymous.github.io/ComfyUI_examples/flux/#flux-dev) にアクセスして、ケーキを持ったケモ耳の女の子の画像を ComfyUI へドラッグ＆ドロップしてます。もしくは、この画像をダウンロードして、ComfyUI の右端の"Load"ボタンからロードします。以下の画像をクリックして拡大表示したものをドラッグ＆ドロップでも大丈夫です。

<img width=256 alt="flux_dev_example.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/c5edae42-685c-524f-aebe-16e386e36136.png">

##### FLUX.1 Schnell workflow のセットアップ（Schnell を使用する場合のみ）

###### Schnell 用 workflow をロード
[ComfyUI Examples Flux Schnell](https://comfyanonymous.github.io/ComfyUI_examples/flux/#flux-schnell) にアクセスして、鮮やかなボトルと地球が入ったワイングラスの画像を ComfyUI へドラッグ＆ドロップしてます。もしくは、この画像をダウンロードして、ComfyUI の右端の"Load"ボタンからロードします。以下の画像をクリックして拡大表示したものをドラッグ＆ドロップでも大丈夫です。

<img width=256 alt="flux_schnell_example.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/1ac35dbf-e3c5-bcc3-6f1d-253a3350b471.png">

##### 画像生成（Dev / Schnell で操作は共通）
###### プロンプトの設定
ComfyUI 中央の緑色の"CLIP Text Encoder(Positive Prompt)"に英語でプロンプトを設定します。AUTOMATIC1111氏の Stable Diffusion Web UI のようなカンマ区切りで単語を並べて行ったり括弧で特定の単語の効果を強調したりといったお作法はありませんので、普通に英語の文章で描きたい情景を記述します。
例えば、上の公式サンプルのケモ耳の女の子のプロンプトはこうなっています。
>cute anime girl with massive fluffy fennec ears and a big fluffy tail blonde messy long hair blue eyes wearing a maid outfit with a long black gold leaf pattern dress and a white apron mouth open holding a fancy black forest cake with candles on top in the kitchen of an old dark Victorian mansion lit by candlelight with a bright window to the foggy forest and very expensive stuff everywhere

日本語に訳すとこんな感じでしょうか
>かわいいアニメの少女で、巨大でふわふわのフェネックの耳と大きなふわふわの尻尾を持ち、金髪の乱れた長い髪と青い目をしています。メイド服を着ており、長い黒の金箔模様のドレスと白いエプロンを身につけています。口を開けて、豪華なブラックフォレストケーキを持っています。ケーキの上にはろうそくが立っています。場所は古い暗いビクトリア朝の邸宅のキッチンで、ろうそくの明かりで照らされています。霧のかかった森に面した明るい窓があり、周りには非常に高価な物がたくさん置かれています。

自分で書くときは、DeepL 、ChatGPT、Claude や OCI Generative AI の Command R/R+ のプレイグラウンドなどで日本語から英語に翻訳すると楽ですね。

__※ Dev / Schnell を入れ替えて試したい場合や FP8 も試したい場合は、workflow をロードしなおします。左上の "Load Diffusion Model" で選びなおせない～と焦らないでくださいね（⇒自分）__

###### 画像生成実行
ComfyUI 右上の "Queue Prompt" をクリックするとキューイングされ生成が開始されます。デフォルトではキューイングすると noise_seed がランダムに更新されますので、そのまま繰り返し"Queue Prompt" をクリックしてキューイングすれば noise_seed を変えて同じプロンプトの画像を続けて生成できます。生成中もプロンプトの変更ができますので、別の画像生成指示もキューイングできます。

###### 生成例
<table>
<tr>
<td>

![ComfyUI_00128_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/3c48e095-89e6-0092-c479-0b3272a5f533.png)
</td>
<td>

![ComfyUI_00076_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/88422f84-95e4-4b3c-bf6d-6c7f57b64e3e.png)
</td>
</tr>
</table>

#### LoRA
LoRA (Low-Rank Adaptation) は、大規模な事前学習済みモデルを効率的にファインチューニングするための技術です。特に画像生成AIの分野で元のモデルの画風を変えたり特定の種類の画像を意図したとおりに生成されやすくする目的で多く活用されています。
ここでは、__Modern Anime LoRA Adapter for FLUX.1 dev__を使ってモダンアニメスタイルの画像を生成してみます

https://huggingface.co/alfredplpl/flux.1-dev-modern-anime-lora

##### 手順
- Modern Anime LoRA Adapter for FLUX.1 devの[リポジトリ](https://huggingface.co/alfredplpl/flux.1-dev-modern-anime-lora/tree/main) から modern-anime-lora-2.safetensors の[モデルウェイト](https://huggingface.co/alfredplpl/flux.1-dev-modern-anime-lora/blob/main/modern-anime-lora-2.safetensors) をダウンロードして、`ComfyUI\models\loras` に配置します
- Modern Anime LoRA Adapter for FLUX.1 devの[ワークフロー anime-workflow.json](https://huggingface.co/alfredplpl/flux.1-dev-modern-anime-lora/blob/main/anime-workflow.json) をダウンロードして、ComfyUI にドラッグ＆ドロップするか右側のメニューの"Load"からロードします
- プロンプトに __"modern anime style," というトリガーワード__ を追加します。Modern Anime LoRA Adapter for FLUX.1 dev は、プロンプトにこの __トリガーワードがあった場合にだけ効果を表します__ 
- "Queue Prompt" をクリックして生成します

##### LoRA を使った生成例
この作例では、あえて LoRA なしの場合もありの場合も「トリガーワード」を追加したプロンプトを使って、LoRA なしの通常のワークフローとLoRAありのワークフローで比較しています。プロンプトの違いではなくあくまでも LoRAの効果を見るためです。シード値は同じ値にしてあります
<table>
<tr>
<td>
LoRA なし
</td>
<td>
LoRA あり
</td>
</tr>
<tr>
<td>

![ComfyUI_00139_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/51985c5a-f690-8097-41fc-9ddd3dedcf66.png)

</td>

<td>

![ComfyUI_00136_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/eae81c6e-4768-7f6b-6739-25a1e5bbcacd.png)

</td>

</tr>
<tr>
<td>
modern anime style, a cute Japanese idle singer girl, long marine blue hair, She is singing ,holding a microphone, wearing white idle costume, standing on the stage .This is a flashy concert with 3D holograms and laser effects
</td>
<td>
modern anime style, a cute Japanese idle singer girl, long marine blue hair, She is singing ,holding a microphone, wearing white idle costume, standing on the stage .This is a flashy concert with 3D holograms and laser effects
</td>
</tr>
<tr>
<td>
seed: 112233344
</td>
<td>
seed: 112233344
</td>
</tr>
</table>

どちらも "modern anime style," というプロンプトが入っているためアニメ絵にはなっていますが、LoRA によって少し雰囲気が変わっていることは見て取れます...とはいえ、FLUX.1 自体がオリジナルモデルでも結構良いアニメ絵を生成できますので違いがわかりにくいですね

## えっと、あとがきです
もうアップデートはないという噂を鵜呑みにして Stable Diffusion WebUI Forge を見ていなかったのですが 2024/8/15 に大型アップデートがあり FLUX.1 もサポートされました。ComfyUI はとても上手に GPU VRAM を使っているようですが Forge も期待です。

https://github.com/lllyasviel/stable-diffusion-webui-forge

AUTOMATIC1111は独自実装が多いから時間かかるかな？

それはそうと、FLUX のControlNet や In-Painting も追いたいし、そもそも1年くらいさわってなかった Meta の SAM(Segment Anythin Model)に大型アップデートの2が出たのでさわらなきゃと思いつつ画像のベクトル検索とかしてる間に FLUX 出て来て、もうわけわかりませんね。以前作ったSAMのノートブック[「Stable Diffusion XL 1.0 と Segment Anything Model で始める画像生成から自動マスク生成、インペインティングまで」](https://github.com/aws-samples/aws-ml-jp/blob/main/tasks/generative-ai/text-to-image/inference/SDXL_t2i_mask_inpaint/Demo_SDXL_1_0_text2image_and_inpaint_with_mask.ipynb)まだ動くかな？Amazon SageMaker JumpStart に完全依存で作ってるけどだいぶ変わってますよね Jumstart。 SAM2 対応＆FLUXセルフホスティングでアップデートしたい。

## おまけ

他にもいろいろ記事を書いていますので良かったらお立ち寄りください。

https://qiita.com/yuji-arakawa/items/28f30a5434ba429f3f16

https://qiita.com/yuji-arakawa/items/8d065ae3df536f5cd559

https://qiita.com/yuji-arakawa/items/654d936ca616334286b0

https://qiita.com/yuji-arakawa/items/1a8cfeff8f81ba808389

https://qiita.com/yuji-arakawa/items/9cd485debd5b0d18aca2

https://qiita.com/yuji-arakawa/items/042937eaf16fa00cf491

https://qiita.com/yuji-arakawa/items/6d0299c505315bc3cdb0

https://qiita.com/yuji-arakawa/items/05e3455572d3b09a53dc

https://qiita.com/yuji-arakawa/items/2d4f6eff17a5410dba2d

https://qiita.com/yuji-arakawa/items/597c4bd9f3d5b4212b51

https://aws.amazon.com/jp/blogs/news/leveraging-pinecone-on-aws-marketplace-as-a-knowledge-base-for-amazon-bedrock/