画像生成AI FLUX.1 に Diffusers で LoRA を適用してみた

## このブログは何？
Stable Diffusion 開発者達が開発した FLUX.1 が評判です。早くも LoRA も出て来て ComfyUI などを使った画像生成例のブログ記事も見かけるようになりました。そこでこのブログでは、Hugging Face Diffusers で FLUX.1 に LoRA を適用してみた経験をまとめています

:::note
Diffusers での FLUX.1 による画像生成自体はこちら ↓ のブログにまとめています。
:::

https://qiita.com/yuji-arakawa/items/fd4fd0c026ecfa664d97

このプログには続編↓があります。

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

---
## FLUX.1 とは？
<table>
<tr>
<td>

![a13jb-dsahe.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/a2a93e27-9a44-4ba3-5a3a-74750fcdbd78.png)

</td>
<td>
FLUX.1は、Stable Diffusionの開発者たちが設立したBlack Forest Labsの画像生成AIモデルです。プロンプトに対する高い忠実性と優れた画像品質で注目を集めています。パラメータ数は、12B（120億）です。
</td>
</tr>
</table>

### FLUX.1 の特徴
- __高品質な画像生成__ : 人物の顔や手、指などの複雑なディテールを正確に描写することができ解剖学的な崩壊もほとんど見られない高品質な画像を生成できます
- __プロンプトへの忠実性__ : テキストプロンプトによるユーザーの指示を反映した画像を生成する高い能力を持っています
- __用途に合わせた3つのモデル__ : 最高性能でBlack Forest Labsやそのパートナー企業のAPIサービスでのみ利用可能な Pro モデル、高性能でオープンウェイト（fine-tuning modelなどの派生物の商用利用は不可）な Dev モデル、わずか 4 Step で高品質な画像を生成できる高速モデルの Schnell の 3つのモデルがあります


:::note
FLUX.1 Schnell の 4 Step 高速生成は昨年秋に流行った LCM : Latent Consistency Model（潜在一貫性モデル） によるリアルタイムお絵描きの興奮を思い出しますね！
:::

---

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

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

---

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

### コード例で使う LoRA の紹介
#### __Modern Anime LoRA Adapter for FLUX.1 dev__ の __v2.0 lora__ 

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

名前のとおり現代的なアニメスタイルの画像を生成できる LoRA です。__トリガーワード "`modern anime style,`" をプロンプトに入れることで LoRA の効果が発動します__

:::note alert
今回の検証では、この LoRA は Diffusers との組み合わせでは効果が見られませんでした。プロンプトによって異なるかもしれません
:::

#### __XLabs-AI flux-RealismLora__

https://huggingface.co/XLabs-AI/flux-RealismLora

写真のようなリアルな画像を生成できる LoRA です。

:::note alert
今回の検証では、この LoRA は Diffusers との組み合わせでは効果が見られませんでした。プロンプトによって異なるかもしれません
:::

#### __FLUX Tarot v1__

https://huggingface.co/multimodalart/flux-tarot-v1

タロットカードのような雰囲気の画像を生成できる LoRA です。トリガーワードは、"in the style of TOK a trtcrd tarot style" です。

:::note
今回の検証では、唯一、Diffusers との組み合わせで顕著な効果が見られた LoRA です
:::

---

## コード
### コードのダウンロード

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

```bash:リポジトリのクローン
git clone https://github.com/kutsushitaneko/flux1-diffusers-lora
cd flux1-diffusers-lora
```

---

### コードの説明
```python:ライブライのインポート
import torch
from diffusers import FluxPipeline
import time
import ipywidgets
```
- `FluxPipeline` は、Diffusers で FLUX.1 を使うために必要なものです。モデルを Hugging Face Hub やローカルからロードしてパイプラインを生成したり、推論（画像生成）を行うメソッドを持っています
- `ipywidgets`は、Jupyter Notebook の場合にプログレスバーを表示するときに使用されます。Python スクリプトの場合は不要です

```python:モデルのロードとパイプラインの生成
pipe = FluxPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    torch_dtype=torch.bfloat16
)
```
- `from_pretrained`は引数で指定されたモデル名を元に Hugging Face Hub からモデルをダウンロードして Dissusers のパイプラインを生成します
- `black-forest-labs/FLUX.1-dev`が、FLUX.1 dev のモデル名です。これを指定することで https://huggingface.co/black-forest-labs/FLUX.1-dev からモデルがダウンロードされます
- `pipe.to("cuda")`は、モデルを GPU へ転送しています

```python:LoRAのロード
pipe.load_lora_weights(
    pretrained_model_name_or_path_or_dict="multimodalart/flux-tarot-v1",
    weight_name="flux_tarot_v1_lora.safetensors"
)
```
- `pretrained_model_name_or_path_or_dict` でLoRAモデルをどこからロードするのかを指定します。Hugging Face Hub の LoRA リポジトリID、ローカルのディレクトリを指定できます
- `weight_name` で LoRAモデルの名前を指定します。`pretrained_model_name_or_path_or_dict`で指定したロケーションに1つしかモデルがない場合は省略できます

```python:画像生成
test_case = "44"
start_time = time.time()
image = pipe(
    prompt="a white cat eating pasta, in the style of TOK a trtcrd, tarot style",
    height=1360,
    width=768,
    guidance_scale=3.5,
    output_type="pil",
    num_inference_steps=20,
    max_sequence_length=512,
    generator=torch.Generator("cpu").manual_seed(523233344),
    joint_attention_kwargs={"scale": 1.0}
).images[0]
end_time = time.time()
print(f"画像生成時間: {end_time - start_time} 秒")
image.save(f"output/{test_case}.png")
```
ここは、通常の画像生成と変わるところはありません。この例の Tarot LoRA の場合は、LoRA が効果を表すためにトリガーキーワード "in the style of TOK a trtcrd, tarot style" が必要ですので、プロンプトに追加しています

:::note
GPU に A40 を使ったときの生成時間は 20秒程でした
:::


## 実行方法
Jupyter ノートブック環境で、以下の順にノートブックを実行します
1. setup.ipynb を実行: PyTorch は、CUDA 12.1 対応の最新版をインストールするように pip コマンドを記載しています。お使いの環境に合わせて適宜書き換えてください。[こちら](https://qiita.com/yuji-arakawa/items/fd4fd0c026ecfa664d97#pytorch-%E3%81%AE%E7%A2%BA%E8%AA%8D) を参考にしてみてください
2. FLUX1_with_{LoRA名}_{補足}.ipynb の各ノートブックを実行

:::note warn
ここで紹介しているコードは、48GB VRAM 搭載の A40 と CPU側メモリが 50GB の環境で実行しています。そのため、Model Offloding や量子化はせずにストレートな推論コードとなっています。FLUX.1 は巨大なモデルですので小さな VRAM 環境の場合には、Model Offloading や量子化が必要になると思います。[こちら](https://qiita.com/yuji-arakawa/items/fd4fd0c026ecfa664d97)のブログはRTX2060という弱弱GPUでFLUXを動かしたときの記録ですので参考にしてみてください
:::

## 生成例

|FLUX.1 dev| LoRAなし | LoRA(Modern Anime LoRA Adapter for FLUX.1 dev)|
|:-:|:-:|:-:|
| 生成画像 |![flux_no_lora_girl_modern_anime_style_523233344.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/7a472fa7-c47f-136a-97df-78608e31a0a9.png)|![flux_modern_anime_lora_girl_moder_anime_style_523233344.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/48c881ce-77da-415d-f959-4f43789785b7.png)|
|プロンプト|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|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|
|seed|523233344|523233344|

:::note alert
Modern Anime LoRA は、（Diffusers＆私がテストした限りのプロンプトでは）LoRA の効果を確認できませんでした。LoRA 自体の効果を見たいので LoRA なしの場合にもトリガーワード "modern anime style, " を入れています。トリガーワード自体がプロンプトとしても意味があって FLUX が認識していそうですので効果の確認が難しいですね。
:::

|FLUX.1 dev| LoRAなし | LoRA(XLabs-AI flux-RealismLora)|
|:-:|:-:|:-:|
| 生成画像 |![121.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/08b489ef-ad98-2755-a0e3-fbe4cb2ad55d.png)|![123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/4c997659-6c34-de88-2362-7e1287ba8ea9.png)|
|プロンプト|Photo of a cute Japanese idle singer girl, long black hair, She is singing ,holding a microphone, wearing Taisho Romantic Hakama costume, standing on the stage .This is a flashy concert with 3D holograms and laser effects|Photo of a cute Japanese idle singer girl, long black hair, She is singing ,holding a microphone, wearing Taisho Romantic Hakama costume, standing on the stage .This is a flashy concert with 3D holograms and laser effects|
|seed|523233344|523233344|

:::note alert
XLabs-AI flux-RealismLoraも（Diffusers＆私がテストした限りのプロンプトでは）LoRA の効果を確認できませんでした。XLabs-AI のリポジトリのコードでは Diffusers を使っていませんので[XLabs-AI謹製](https://github.com/XLabs-AI/x-flux)のコードを使うべきかもしれませんね。main.py がLoRAを使って画像生成するコードです。
:::

|FLUX.1 dev| LoRAなし | LoRA(FLUX Tarot v1)|
|:-:|:-:|:-:|
| 生成画像 |![42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/3b4520eb-2577-55bc-cfbd-2d547eebaed8.png)|![44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/74534/bb8e8d59-963a-fb0f-abb3-2943c75f2e2d.png)|
|プロンプト|a white cat eating pasta, in the style of TOK a trtcrd, tarot style|a white cat eating pasta, in the style of TOK a trtcrd, tarot style|
|seed|523233344|523233344|

:::note
FLUX Tarot v1 は、LoRA の有無で顕著な違いが見られました。確かに LoRA があった方がよりリアルなタロットカードの雰囲気が出ています。こちらも LoRA 自体の効果を見たいので LoRA なしの場合にもトリガーワード "in the style of TOK a trtcrd, tarot style" を入れています。
:::

もう一つ効果が顕著に現れた LoRA を取り上げた続編↓を書きました。

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

## おまけ

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

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

https://qiita.com/yuji-arakawa/items/fd4fd0c026ecfa664d97

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/