このブログは何?
Stable Diffusion 開発者達が開発した FLUX.1 が評判です。早くも LoRA も出て来て ComfyUI などを使った画像生成例のブログ記事も見かけるようになりました。そこでこのブログでは、Hugging Face Diffusers で FLUX.1 に LoRA を適用してみた経験をまとめています
Diffusers での FLUX.1 による画像生成自体はこちら ↓ のブログにまとめています。
このプログには続編↓があります。
FLUX.1 とは?
FLUX.1は、Stable Diffusionの開発者たちが設立したBlack Forest Labsの画像生成AIモデルです。プロンプトに対する高い忠実性と優れた画像品質で注目を集めています。パラメータ数は、12B(120億)です。 |
FLUX.1 の特徴
- 高品質な画像生成 : 人物の顔や手、指などの複雑なディテールを正確に描写することができ解剖学的な崩壊もほとんど見られない高品質な画像を生成できます
- プロンプトへの忠実性 : テキストプロンプトによるユーザーの指示を反映した画像を生成する高い能力を持っています
- 用途に合わせた3つのモデル : 最高性能でBlack Forest Labsやそのパートナー企業のAPIサービスでのみ利用可能な Pro モデル、高性能でオープンウェイト(fine-tuning modelなどの派生物の商用利用は不可)な Dev モデル、わずか 4 Step で高品質な画像を生成できる高速モデルの Schnell の 3つのモデルがあります
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
名前のとおり現代的なアニメスタイルの画像を生成できる LoRA です。トリガーワード "modern anime style,
" をプロンプトに入れることで LoRA の効果が発動します
今回の検証では、この LoRA は Diffusers との組み合わせでは効果が見られませんでした。プロンプトによって異なるかもしれません
XLabs-AI flux-RealismLora
写真のようなリアルな画像を生成できる LoRA です。
今回の検証では、この LoRA は Diffusers との組み合わせでは効果が見られませんでした。プロンプトによって異なるかもしれません
FLUX Tarot v1
タロットカードのような雰囲気の画像を生成できる LoRA です。トリガーワードは、"in the style of TOK a trtcrd tarot style" です。
今回の検証では、唯一、Diffusers との組み合わせで顕著な効果が見られた LoRA です
コード
コードのダウンロード
git clone https://github.com/kutsushitaneko/flux1-diffusers-lora
cd flux1-diffusers-lora
コードの説明
import torch
from diffusers import FluxPipeline
import time
import ipywidgets
-
FluxPipeline
は、Diffusers で FLUX.1 を使うために必要なものです。モデルを Hugging Face Hub やローカルからロードしてパイプラインを生成したり、推論(画像生成)を行うメソッドを持っています -
ipywidgets
は、Jupyter Notebook の場合にプログレスバーを表示するときに使用されます。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 へ転送しています
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つしかモデルがない場合は省略できます
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" が必要ですので、プロンプトに追加しています
GPU に A40 を使ったときの生成時間は 20秒程でした
実行方法
Jupyter ノートブック環境で、以下の順にノートブックを実行します
- setup.ipynb を実行: PyTorch は、CUDA 12.1 対応の最新版をインストールするように pip コマンドを記載しています。お使いの環境に合わせて適宜書き換えてください。こちら を参考にしてみてください
- FLUX1_with_{LoRA名}_{補足}.ipynb の各ノートブックを実行
ここで紹介しているコードは、48GB VRAM 搭載の A40 と CPU側メモリが 50GB の環境で実行しています。そのため、Model Offloding や量子化はせずにストレートな推論コードとなっています。FLUX.1 は巨大なモデルですので小さな VRAM 環境の場合には、Model Offloading や量子化が必要になると思います。こちらのブログはRTX2060という弱弱GPUでFLUXを動かしたときの記録ですので参考にしてみてください
生成例
Modern Anime LoRA は、(Diffusers&私がテストした限りのプロンプトでは)LoRA の効果を確認できませんでした。LoRA 自体の効果を見たいので LoRA なしの場合にもトリガーワード "modern anime style, " を入れています。トリガーワード自体がプロンプトとしても意味があって FLUX が認識していそうですので効果の確認が難しいですね。
XLabs-AI flux-RealismLoraも(Diffusers&私がテストした限りのプロンプトでは)LoRA の効果を確認できませんでした。XLabs-AI のリポジトリのコードでは Diffusers を使っていませんのでXLabs-AI謹製のコードを使うべきかもしれませんね。main.py がLoRAを使って画像生成するコードです。
FLUX Tarot v1 は、LoRA の有無で顕著な違いが見られました。確かに LoRA があった方がよりリアルなタロットカードの雰囲気が出ています。こちらも LoRA 自体の効果を見たいので LoRA なしの場合にもトリガーワード "in the style of TOK a trtcrd, tarot style" を入れています。
もう一つ効果が顕著に現れた LoRA を取り上げた続編↓を書きました。
おまけ
他にもいろいろ記事を書いていますので良かったらお立ち寄りください。