西川和久の不定期コラム
話題のFLUX.1をComfyUIで画像生成してみる!基本系とControlNetのWorkflow(json)公開
2024年8月27日 06:17
ComfyUIとは?
ComfyUIとは「AUTOMATIC1111」と同様、Stable Diffusionを中心とした画像生成AIに対応したアプリケーションだ。以下の画面キャプチャをご覧いただきたいが、普通のWebアプリ的な雰囲気は皆無。一体何が何だか分からない状態で起動する(笑)。
各ボックスは、Nodeと呼ばれ単機能。複数のNodeを繋ぎ合わせてWorkflowを作り、目的の結果を得る……という仕掛けになっている。初期のシンセサイザーに似ていると表現した方が分かりやすいかも知れない。この特性から、画像を生成するだけでなく、LLMやVLLMなどを動かすことも可能だ。
ComfyUIをWindowsへインストールするのは簡単!ここに7-zipファイルがあるのでダウンロードして7-zipの中にあるComfyUI_windows_portableフォルダを適当な場所へ展開、run_nvidia_gpu.batを実行するだけで起動する。
ちなみに、Windows 11に内蔵している7-zipは解凍が非常に遅く、できればWindows版7-zipアプリをダウンロードして使った方が良い。zipもそうだが(やはり遅い)、どうせ搭載するなら、もっと実用的なものにして欲しいところだ。
いつも筆者がpython系の記事を書く時に紹介した、minicondaを使って環境を作り、pip install……といった手間は不要だ。これには仕掛けがあり、Windows embeddable packageを使い、python本体はもちろん、必要なライブラリを全て内包し、ポータブルな環境を構築したからだ。pythonで作ったプログラムを配布する時に非常に便利なツールとなっているわけだが、これをComfyUIも採用しており、上記のようにサクッと起動できるというわけだ。
早速生成したいところだが、まだモデルが入っていないので生成できない。今回はFLUX.1を生成するのが目的なので、要らぬ手間はかけたくないが、確認用として、以下からSD 1.5のベースモデルをダウンロードする。
・v1-5-pruned-emaonly.ckpt (4.27GB)
これをComfyUI/models/checkpointsへコピーする。よく使うフォルダの一覧を書き出すと、
ComfyUI/models/checkpoints
ComfyUI/models/loras
ComfyUI/models/controlnet
ComfyUI/models/vae
※ 各モデルが入る
ComfyUI/custom_nodes
※ 拡張機能用
ComfyUI/output
※ 生成した画像を保存
こんな感じだろうか。順にCheckpoint、LoRA、ControlNet、vaeのモデルを入れるフォルダ。次は拡張機能をインストールするフォルダと、生成画像保存用となる。
ここままでも動くのだが、ComfyUI-Managerをインストールする。基本メンテナンス用で、これがないとCLIでアップデートやパッケージのインストールすることになり非常に面倒。手順は以下の通り。
一旦ComfyUIを終了
cd ComfyUI/custom_nodes
git clone https://github.com/ltdrdata/ComfyUI-Manager
※ 事前にGit for Windowsをインストール
ComfyUIを再起動
ComfyUIを再起動するとメニューに[Manager]の項目が追加されており、クリックするとこんなパネルが開くはずだ。これで準備OK。ついでに先のCheckpointをコピーしておき、[Queue Prompt]で画像が生成されれば正解となる。
なお、コピーしたのにエラーで動かない場合は、メニューの[Refresh]ボタンを押してほしい。起動時、関連フォルダはスキャンしてセットされるのだが、起動後、models以下にファイルをコピーした時はこの操作が必要となる。
基本操作は何もないところでダブルクリックするとNode一覧(検索可能)、Nodeの上で右クリックするとプロパティ、画面のズームイン/アウトはマウスのホイールとなる。また各Nodeの小文字がINPUT、大文字がOUTPUT。無関係なNodeには接続できないので、接続できたということは、理屈的に合ってると思って良い。なお、INPUTは複数入力はできず、1つだけ。OUTPUTは複数NodeのINPUTへ接続可能だ。
さて次はいよいよFLUX.1 [dev] fp8を使って画像生成てみたい。
FLUX.1 [dev] fp8を使った画像生成 / お試し型
本来FLUX.1 [dev]は、「checkpoint」、「t5」、「clip」、「vae」と4つのファイルが必要となる。またt5とclipはSD 3 Mediumと共通で、ダウンロードするURLも異なり手間。しかも合計で35GBを超える(笑)。
そこで、FLUX.1 [dev]のfp8版でかつ、全部バインドしているこのcheckpointを使う。ダウンロードするのは1本で済むというわけだ。ファイル容量は17.2GB。fp16版のフルセットより約半分の容量となる。これを先のComfyUI/modelsへコピーする([Refresh]が必要なら適時行なう)。
・FLUX.1 [dev] fp8 t5/clip/vaeバインド版
Workflowは(一部必要なNodeが抜けているので不完全だが)そのまま以下の項目だけ変更し[Queue Prompt]をクリックするとFLUX.1の画像が生成される。今回使用したのは、GeForce RTX 4080 Laptop GPU(12GB)搭載のGIGABYTE「AORUS 17X AXF-B4JP664JP」。
Load Checkpoint: flux1-dev-fp8.safetensors
KSampler:
cfg: 1
scheduler: simple
この時、解像度は512×512のまま。かかった時間は約12秒、VRAM使用量10.4GB。VRAM 12GB搭載のGPUなら生成可能だ。512×768と832×1,216の画像は全く同じ設定でサイズだけ変更したもの。
前回、FLUX.1は1MPに加え2MPにも対応していると書いたが、実は0.5MPにも対応している。これはSD 1.5と同レベルの解像度となる。VRAM容量があまりなく、遅めのGPUに有効だろう。もちろん出てくる絵は[dev]レベルだ。引きの構図でも顔が崩れない特徴があるため、意外とこの解像度も用途や環境によっては行けるかも知れない。
RTX 40系なら高速化可能!?
本題へ入る前に少しでも速く……っと言うことで、GeForce RTX 40系限定だが、高速化の話を。実は先日ComfyUIの更新があり、--fastオプションが追加された。これを有効にする方法は……。
ComfyUI_windows_portable/update/update_comfyui_and_python_dependencies.bat を実行
ComfyUI_windows_portable/update/update.bat を実行
ComfyUI_windows_portable/run_nvidia_gpu.bat のmain.py 最後に --fastを追加
un_nvidia_gpu.bat で起動
たったこれだけだ。t5がfp4_e4m3fn限定だが、今回使用しているfp8版にはこれが含まれているので何も考える必要はない。テストしたゲーミングノートPCもGeForce RTX 4080 Laptop GPUと該当するので試したところ……。
--fastなし
512×512 13秒前後
512×768 16秒+α
832×1,216 38秒前後
--fastあり
512×512 9秒前後
512×768 11秒前後
832×1,216 29秒前後
と、かなり効果があった。これだけ違うと体感的にも明らかに速くなったと分かる。どの解像度もVRAM 10.xGBなので12GBあれば問題なく作動。該当機種をお持ちの方はぜひ試してほしい。
参考までにGeForce RTX 3090で832×1,216だと23〜24秒。コアの世代が1つ違うと……という感じだ。ちなみにGeForce RTX 40系と同じコアを搭載したA6000 Ada(48GB)でも有効だが、130万円超えるので関係ないだろう。なぜハードウェア的に同じコアのGeForce RTX 4090のVRAMを倍にするだけでこの価格になるのか謎過ぎる(笑)。
FLUX.1 [dev] fp8を使った画像生成 / 正式なWorkflow
以下のWorkflowをご覧いただきたい。これがFLUX.1 [dev] fp8版の正式なWorkflowとなる。最初に試したデフォルトのWorkflowに追加したNodeはグリーン、ちょっと変えたのがブルーになっている。また紫でマスクされてるのはBypassと呼ばれ(Nodeの上で右クリックするとプロパティがが出てその中にある)、その部分は処理しない。ここはLoRAの設定になっている。
増えているのは上からModelSamplingFlux(1.15/0.5)、FluxGuidance(3.5)、そしてConditioningZeroOut。値は固定だ。ConditioningZeroOutは、基本FLUX.1にはNegative Promptがなく、と言ってKSamplerのNegativeに何も入れないわけには行かないため、このようなNodeが必要となる。
ブルーの部分はEmpty Latent Image。ここは元々、width/height/batch_sizeの3つの項目で成り立っているが、上記のModelSamplingFluxがwidth/heightを必要とするため、単に数字を入れるNodeを2つ追加(左側上のブルーNode)、そこへwidthとheightを入れ、2つのNodeへそれぞれ入れている。
さて、これを見ながらWorkflowを作って!ではさすがに厳しいと思うので、Workflowのjsonを添付のFlux_base.json(0.01MB)にする。json形式のファイルをそのままComfyUIへドラッグ&ドロップすればOKだ。
が、おそらく赤いNodeがいくつか出てしまう。これはシステムにないカスタムNodeを使っている場合で、ネットからダウンロードしたWorkflowでは頻繁に発生する。
そこで登場するのがComfyUI-Managerだ。Install Missing Custom Nodesをクリック、赤いNodeを含むカスタムNodeが表示されるので、インストールし、再起動。再起動後、Webブラウザをリロードすれば赤い部分が消える。
これで左上のLoad Checkpointをflux1-dev-fp8.safetensorsへ変え、[Queue Prompt]をクリックすると、ご覧のように実写と勘違いしそうな美女が現れる(笑)。
BypassしているLoRAは、Civitaiなどで好みのものがあればダウンロードし、models/lorasへコピー。[Refresh]後、Bypassを外せば効果が出るはずだ。生成に時間がかかる時は512×512や512×768など解像度を落とせば何とかなるだろう。これでしばらくは遊べるのでは!?(笑)。
FLUX.1 [dev] fp8を使った画像生成 / ControlNet
次はControlNetを使えるWorkflow。ControlNetとは画像を与え、その中にある情報を使い、生成する画像の構図などを固定する技術だ。たとえばPromptでは出しづらいヨガのポーズの写真を入れれば、似た感じの絵や写真が生成される。
XLabs AIから
が出ているので(Depthは深度情報、残り2つは線)、今回はDepthを使ってみる。なおダウンロードしたControlNetモデルは models/xlabs/controlnetsというフォルダに入れておく。
先のWorkflowにこれらの処理を加えてもいいのだが、XLabs AIからカスタムNodeとWorkflowが出ているので、それを少し改良したのがこれだ。比較してModelSamplingFluxやFluxGuidanceがない分、ぱっと見スッキリしている。
Workflowのダウンロードはここから。ComfyUIに入れると真っ赤っ赤だが、焦らず先の手順で無いカスタムNodeをインストールする。
ブルーがXLabs AIのカスタムNode、グリーンが画像から深度情報を得るプリプロセッサ。赤い部分はPromptなのだが2段になっている。これは上がclip、下がt5と、上はタグ区切りでザックリ書き、下は英文で背景など詳細を書く……というのが本来の使い方だが、タグ区切りだけで上下に入れたり、下だけに入れたりしても機能する(上だけだと効きが悪い)。
またその下に同じPrompt入力があるが、これがNegative Prompt用のダミー。XLabs SamplerにNegative入力があるので、これを取りあえず接続しているだけで、何か書いても生成画像には影響しない。
左にあるスイッチャーはグループのスイッチングだ。このWorkflowではLoRAとControlNetをグループ設定しているが、使わない時はこれをOFFするだけでまとまてBypassでき便利。
まずどちらもオフにして作動の確認。Load Checkpointでモデルを選ぶのを忘れずに!以下のような美女が出れば正解だ。
次にControlNetをオンに。適当な画像をセットし、DownloadAndLoadDepthAnythingV2Modelから適当なモデルを選ぶ(fp16の方が小さい)。システムにない時は自動的にダウンロードするのだが、筆者の環境ではダウンロードしないケースもあり、そんな時はここからダウンロードし、models/depthanythingへファイルをコピーする。そしてControlNetをオン。実行すると、先に深度情報画像を作り、その後、Samplerが動き出す。結果はご覧の通り。深度情報に合わせた形で画像が生成される。
ただVRAM 12GBだと超えてしまい、共有メモリも使い出し、512×768へ解像度を落としても40秒ほどかかる。この辺りがGeForce RTX 4080 Laptop GPU(12GB)の限界のようだ。
なお、Workflow、Xlasbs Samplerのcontrol_after_generateがfixedになっているため、seedが固定され、次に[Queue]しても何も動かない。increment/decrement/randomizeいずれかに設定を変更してほしい。
筆者のお勧めはincrement。「あ、前の良かったな!」という時にseedカウントを下げれば戻れるからだ。randomizeだとランダムなので戻れない。
以上でFLUX.1 [dev] fp8をComfyUIを使って生成する話は終わりなのだが、Workflowを眺めると、LoRAはCheckpointとSamplerの間。つまりChekpointに何だかの影響を与え、ControlNetはPromptとSamplerの間に入り、何にか情報を伝えている……的に、AUTOMATIC1111だと何がどうなっているのか?ブラックボックスで分からなかったのが、ComfyUIだとなんとなく処理の流れが分かるようになった。
これを続けていると、ある日突然、「あ、そうか!」となり、作りたいWorkflowが自然に作れるようになる。人間も日々学習しており、閾値を超えると突然ひらめく感じだろうか!?(笑)。
AUTOMATIC1111のように、WebUI上のパネルを操作するだけで生成するのもいいが、ComfyUIのように、何がどうなっているのか(大雑把に)理解しながら画像生成するのもある意味楽しい。
VRAM容量の関係から、FLUX.1は無理でもSD 1.5やSDXLなら同じ理屈で生成可能だ。冒頭に書いたように、Windowsであればセットアップ自体は簡単なので、画像生成AIに興味を持った人はぜひ試して欲しい。