西川和久の不定期コラム

生成AI画像の写真はもはや実写レベルに!?話題のFLUX.1で顔LoRAを作ってみた

 先立ってリリースされた「SD3 Medium」がイマイチなので、今年もしばらくは「SDXL」か……っと思っていた8月頭に、いきなり生成AI画像の大物「FLUX.1」が登場した。今回はその概要と、顔LoRAの作り方2パターンをご紹介したい。

FLUX.1とは?

 FLUX.1は、「SD 1.5」やSDXLなどでお馴染みStable Diffusionの開発者たちが設立した(これはOKなのか?)「Black Forest Labs」から8月1日(現地時間)発表された新型の生成AI画像モデルだ。120億パラメータを持ち、プロンプト(Prompt)に忠実にしかも物凄いクオリティで写真やイラストなどを生成できる。

 モデルは3種類あり、

  • FLUX.1 [pro] / API形式のみ
  • FLUX.1 [dev] / 20 steps
  • FLUX.1 [schnell] / 4 steps

となっており、上から順に高性能だ。[pro]がAPI形式なのは残念だが、[dev]でもVRAM 24GBのGeForce RTX 3090や4090が一杯一杯なので、仮に[pro]が公開されても家庭用ハイエンドPCで動くかどうかは謎(笑)。一方、[pro]と[dev]は、絵柄に関しては大差ない?ものの、文字などの対応が[pro]の方が上らしい。

 [dev]と[schnell]は、ハイエンドGPUを搭載したPCであれば生成可能だ。ステップ数の違いからも分かるように、schnellの方が軽い。SD 1.5やSDXLでもLCMやTurboモデルがあり、少ないステップ数で生成可能だったが、その分やはり画質は劣る。これと同じことが[dev]と[schnell]にも当てはまり、筆者は少し試した後、一切[schnell]は使っていない。ただ誤解しないでほしいのは、[schnell]でもSDXLは軽く上回り、SD3 Mediumといい勝負になっている点だ。

 さてこの構成、どこかで見たことが……。そう、クオリティ問題で飛んでしまった?SD3と同じなのだ。SD3の場合、SD3 MediumはPCで生成可能、LargeとUltraはAPI形式となっている。残念ながらライセンス問題と、体が崩れるなどクオリティ問題で、今ではすっかり影が薄くなってしまった新型生成AI画像モデルだ。ライセンス問題に関しては後に修正、クオリティ問題は修正版を出す……っとなっているものの、未だ出ていない。

 そこにFLUX.1 [dev]と[schnell]が投入され、コミュニティは一気にFLUX.1に流れてしまった感がある。仮に今、修正版のSD3 Mediumが出てもダメだろう。Ultraがオープンで出ても厳しいのではないだろうか?

 そんなFLUX.1、公式のファイル構成は以下の通り。

1.FLUX.1 [dev]

checkpoint: flux1-dev.safetensors (23.8GB)

2.FLUX.1 [schnell]

checkpoint: flux1-schnell.safetensors (23.8GB)

3.共通

t5: t5xxl_fp16.safetensors (SD3と共通/9.79GB)

clip: clip_l.safetensors (SD3と共通)

vae: ae.safetensors

合計4つのファイルが必要となる。checkpointとt5を合わすだけで約34GB。通常SDXLが7GBほどなので、5倍の容量。まるでLLMモデルだ。何種類か入れるとSSDが溢れてしまう(笑)。なおテキストエンコーダの「t5」と「clip」はSD3と共通なので、ここのを流用する。vaeは各モデルのfilesの中にある。

 現在、checkpoint/t5/clip/vaeを1つのファイルにまとめたもの、[dev]と[schnell]をマージしたもの、fp8版、量子化されたNF4版、GGUF版など色々出ており、今後どれが主流になるかは不明であるが、基本形は上記2つとなる。

 生成環境は新型「Forge」、「ComfyUI」、そしてSwarmUI。おそらく他でもバックエンドがComfyUIなら可能かと思われる。

 各アプリの生成方法などを書き出すと、それで原稿何本か書けてしまうので、今回は省略。興味のある人は検索すれば山盛り情報が出てくるので調べてみてほしい。また手持ちで強力なGPU搭載PCがなくても、Google ColabやXのGrok 2(Promptは日本語でもOK)でもFLUX.1は生成可能だ。

 前置きが長くなってしまったが、FLUX.1 [schnell]と[dev]のサンプル画像を掲載する。

SD3 Mediumの画像
SD3 Ultraの画像
[schnell] / 1MP / 4 steps
[schnell] / 2MP / 4 steps
[dev] / 1MP / 20 steps
[dev] / 2MP / 20 steps
ComfyUIで[dev] / 2MPを生成

 いかがだろうか?以前連載でSD3 MediumとSD3 Ultra(API形式)の画像を掲載しているが、[dev]とUltraがいい勝負(ただUltraは1MP)なのがお分かり頂けるだろうか?また発色の感じも[schnell]とMedium、[dev]とUltraがよく似ている。参考までに[dev] / 2MPがGeForce RTX 4090を使って約35秒だった。

 Promptは“photo of a powerful GPU-equipped computer scattered around a research lab, with a beautiful japanese woman like a k-pop idol. creating AI images. 20 years old.”(FLUX.1は公式にはNagative Promptがない)と、上記の記事に掲載した時と同じだ。

 なお、SDXLと大きく違う点として、対応解像度とADetailer不要(画面に対する顔などの面積が小さい場合、修正する機能)が挙げられる。

 解像度は最大2MPまで対応。SDXLが1MPだったので、倍となる。

  • 1MP 1:1 1,024 x 1,024, 2:3 832 x 1,216, 16:9 1,344 x 768
  • 2MP 1:1 1,408 x 1,408, 2:3 1,152 x 1,728, 16:9 1,920 x 1,088

 つまりFLUX.1だと16:9でいきなりフルHDの画像を生成可能だ。ただし2MPで生成するとGeForce RTX 4090でも先に挙げた通り重い処理となる。ADetailerに関しては、掲載した画像は無修正で顔も指も細部が崩れていない。そうそう指問題もなくはないものの、かなり率は低い。つまり、重い、ファイルが大きい以外は何も欠点がないのだ。

 あえて挙げればNFSW非対応(とは言えトップレスは出る)程度。この点は、既にcivitaiに対応LoRAが山盛り出ている(笑)。Trainedモデルも時間の問題だろう。

 そんな中、筆者が試みたのが、顔LoRAの作成。執筆時はもう手順が確立しているものの、試した時期は、学習率は1e-3がいいのか?1e-4がいいのか?など、まだ手探り状態だった。学習ソフトウェアは、いくつか試したがうまく行ったのは今回ご紹介する2つ。では順にご紹介したい。

顔LoRAその1 / ai-toolkit

 まず一番最初にらしい情報が載ったのはDreamBooth。ただ実際学習を始めるとVRAMを50GB近く(半分は共有RAM)を使い出しあえなく撃沈。次に見つけたのがこのai-toolkitだった。

 インストール方法はこのGitHubの通りなのだが、venvを使わずminicondaを使用。はじめWindowsで試したものの、必要なライブラリが入らず問題なかったUbuntuの方で学習させている(今は直ってるかも知れない)。

 学習自体は config/examples/train_lora_flux_24gb.yaml を config/へコピー。この時、名前は適当に変え、必要な項目を編集する。変えた部分だけ書き出すと以下のような感じだ。

name: "mylora_flux_lora_v1"
trigger_word: "mylora"
        - folder_path: "/home/knishika/AI/flux-lora/dataset/mylora"
        sample_every: 250 # sample every this many steps
        width: 832
        height: 1216
        prompts:
          - "photo of a japanese woman, [trigger], medium breasts, thigh, t-shirt and shorts, at beach"

 LoRAのファイル名、trigger word、datasetのパス、250 stepsごとに生成する画像のPromptたったこれだけ。

 datasetは10枚の画像とファイル名が対の.txtのキャプションファイル(何の画像なのかを英文で説明=10ファイル)。実際使ったdatasetの画像を掲載するが、さすがにモデルでもない普通の子の写真を出すわけにも行かずぼかしている。これでは似ているのか判断できないかと思うが、生成した画像が完全に本人に一致することを筆者が保証するので許して欲しい(笑)。なお通常キャプションの文頭にtrigger wordを入れるのだが、ai-toolkitでは、上記した通り、.yaml側に設定するので必要はない。

 実行は、

python run.py config/shio_lora_flux_24gb.yaml (実際は変更したファイル名)

これでOK。デフォルトの4,000 stepsだと2時間19分と出ている。使用VRAMは約21GB。そして250 stepsごとに画像を生成するので、状況を確認できる。出力先はoutput/mylora_flux_lora_v1/samples。まず学習0の画像を作り、その後、順次生成する。

ai-toolkitで使ったdataset
学習中。約2.4時間。GeForce RTX 4090でSDXLだと1,000 steps 20分ほどなのでかなりかかる
output/mylora_flux_lora_v1/samples。まず学習0の画像、その後250 stepsごとに出力される。500を超えると似てくる
LoRAっ子2号と呼んでいる顔LoRAを当てた画像。[dev] fp8 / 1MP
LoRAっ子2号と呼んでいる顔LoRAを当てた画像。[dev] fp8 / 2MP

※ どちらも1,000 steps, 1e-3, linear(_alpha)は4のLoRAを使用。LoRAの重みは0.8

datasetは実写だからとぼかした意味が全くなく、まさに本人の写真(笑)。まぁ体型などをあえて変えているので、同じなのは顔だけなのだが……。

 後で分かったことは、

  • 最大steps: 4000 → 1,000程度で良さそう
  • 学習率: 4e-4 → 1e-3
  • linear: 16 → --network_dimのことだとすると4でも良い
  • linear_alpha: 16 → --network_alphaのことだとするとdimと同じに

この4つ。最大stepsは、後述するsd-scriptsでも試したのだが、2,000や3,000でも多かった。1,000から1,500にして(datasetの枚数にもよる)、--network_dimは4が好みとなった。再学習したところこの状態で約40分かかった。

顔LoRAその2 / sd-scripts

 sd-scriptsはSD 1.5やSDXLの学習でも愛用しており、連載にも何度か登場した画像学習と言えば定番のソフトウェアだ。FLUX.1を使った学習はsd3ブランチへ切り替える git pull、git checkout sd3)。

 当時ちょうど作者のKohya Tech氏がFLUX.1対応を終えたばかりで、Xでやり取りしながらの作業となった。

 方法はまずsd-scriptsを動く環境を作ること。これは色々載っているので省略。また先に書いたように、sd3ブランチへ切り替えるのを忘れずに!

 後はここにある config.toml のサンプル中、

[[datasets.subsets]]
  image_dir = "datasetへのpath"

を書き換え、実行のオプション設定はGitHub通り。

accelerate launch  --mixed_precision bf16 --num_cpu_threads_per_process 1 flux_train_network.py --pretrained_model_name_or_path flux1-dev.sft --clip_l sd3/clip_l.safetensors --t5xxl sd3/t5xxl_fp16.safetensors --ae ae.sft --cache_latents_to_disk --save_model_as safetensors --sdpa --persistent_data_loader_workers --max_data_loader_n_workers 2 --seed 42 --gradient_checkpointing --mixed_precision bf16 --save_precision bf16 --network_module networks.lora_flux --network_dim 4 --optimizer_type adamw8bit --learning_rate 1e-4 --network_train_unet_only --cache_text_encoder_outputs --cache_text_encoder_outputs_to_disk --fp8_base --highvram --max_train_epochs 4 --save_every_n_epochs 1 --dataset_config dataset_1024_bs2.toml --output_dir path/to/output/dir --output_name flux-lora-name --timestep_sampling sigmoid --model_prediction_type raw --guidance_scale 1.0 --loss_type l2

 変更箇所は、モデルとconfig.tomlへのpath、LoRAのファイル名、--learning_rate 1e-4、--max_train_epochs 4 --save_every_n_epochs 1……ここを1e-3、1000、200とかに書き換えればOKだ。学習元になるモデルは[dev]を指定する(作られたLoRAは[schnell]でも利用可能)。当時vaeと合わせて拡張子が.sftだったが、今は.safetensorsに変更されている。

 datasetはLoRAっ子1号と呼んでいる別の子だが、同じ理由で写真はぼかしてある。申しわけない。またsd-scriptsの環境はGeForce RTX 3090側にあり、同じ10枚でも結構かかる。終了まで2.5時間、VRAM使用量約22.9GB。

sd-scriptsで使用したdataset
sd-scripts実行中。GeForce RTX 3090の場合、1,000 stepsで約2時間半と出ている
習中はVRAM 22.9GBを使用。ギリギリだ
LoRAっ子1号と呼んでいる顔LoRAを当てた画像。[dev] fp8 / 1MP
LoRAっ子1号と呼んでいる顔LoRAを当てた画像。[dev] fp8 / 2MP

※ どちらも1,000 steps, 1e-3, --network_dim 4のLoRAを使用。LoRAの重みは上0.8、下0.9。2MPの方が若干LoRAの効きが鈍くなる

 参考までにLoRAっ子1号、2号の画像は、筆者XのアカウントにもSDXL/SD3 Mediumも含め大量に載せている。興味のある方は合わせてご覧頂きたい。同じ顔なのが分かると思う(笑)。

 いかがだろうか?環境さえあれば、結構簡単に顔LoRAを作れることがお分かり頂けるだろうか。どちらも分かってしまえば簡単なので、興味のある人はぜひ試してほしい。ただしVRAM 24GB搭載のハイエンドPCか、Google Colabなどを使う必要がある。ai-toolkitに関してはGitHubにGoogle Colab用の.pynbもあるので、サクッと実行可能だ。

 いずれにしてもこれだけの画像がローカルPCで生成可能になると、SDXLから一気にジャンプした感がある。XのGrok 2でもFLUX.1が使えるので(ほかの商用系よりNSFW対応が緩く水着などは出る)、ネットはこの手の画像で溢れそうだ。

 ただ、必要なPC環境も一気にジャンプ。仮にこれ以上のものが出ても、ご家庭用ハイエンドPCで生成/学習するのは難しいかもしれない。嬉しいやら悲しいやら……。


 以上、最新生成AI画像のFLUX.1と、顔LoRAを作る方法をご紹介した。もちろんdatasetの内容を変えれば顔だけでなく、色々なLoRAを作ることが可能だ。興味のある人は是非チャレンジしてほしい。