西川和久の不定期コラム

話題のFLUX.1をComfyUIで画像生成してみる!基本系とControlNetのWorkflow(json)公開

 前回は「FLUX.1 [dev] fp8」の画像を中心に、その凄さをご紹介した。今回は「ではどうやって作れば?」ということで、「ComfyUI」を使ったWorkflowをご紹介したい。

ComfyUIとは?

 ComfyUIとは「AUTOMATIC1111」と同様、Stable Diffusionを中心とした画像生成AIに対応したアプリケーションだ。以下の画面キャプチャをご覧いただきたいが、普通のWebアプリ的な雰囲気は皆無。一体何が何だか分からない状態で起動する(笑)。

ComfyUI起動直後の画面。難しいそうで簡単そうで……このWorkflowだけでSD 1.5とSDXLの画像は生成できる

 各ボックスは、Nodeと呼ばれ単機能。複数のNodeを繋ぎ合わせてWorkflowを作り、目的の結果を得る……という仕掛けになっている。初期のシンセサイザーに似ていると表現した方が分かりやすいかも知れない。この特性から、画像を生成するだけでなく、LLMやVLLMなどを動かすことも可能だ。

 ComfyUIをWindowsへインストールするのは簡単!nがあるのでダウンロードして7-zipの中にあるComfyUI_windows_portableフォルダを適当な場所へ展開、run_nvidia_gpu.batを実行するだけで起動する。

 ちなみに、Windows 11に内蔵している7-zipは解凍が非常に遅く、できればWindows版7-zipアプリをダウンロードして使った方が良い。zipもそうだが(やはり遅い)、どうせ搭載するなら、もっと実用的なものにして欲しいところだ。

 いつも筆者がpython系の記事を書く時に紹介した、minicondaを使って環境を作り、pip install……といった手間は不要だ。これには仕掛けがあり、nを使い、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]で画像が生成されれば正解となる。

ComfyUI-Manager
CheckpointをComfyUI/modelsへコピー。その後、 [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バインド版

FLUX.1 [dev] fp8で生成。KSamplerの設定が一部違うがWorkflow自体は同じ
処理中のタスクマネージャー。VRAM 10.4GB使用

 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の画像
生成された512×768の画像
生成された832×1,216の画像

 この時、解像度は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の設定になっている。

FLUX.1 [dev] fp8版の正式なWorkflow。デフォルトのWorkflowに追加したNodeはグリーン、ちょっと変えたのがブルー

 増えているのは上から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だ。

jsonファイルをドラッグアンドロップした直後の画面。赤い部分がシステムに無いカスタムNode
ComfyUI-ManagerでInstall Missing Custom Nodesをクリック
該当するカスタムNodeが出るのでInstall、Restart。その後、Webブラウザでリロードすれば赤い部分が消える

 が、おそらく赤いNodeがいくつか出てしまう。これはシステムにないカスタムNodeを使っている場合で、ネットからダウンロードしたWorkflowでは頻繁に発生する。

 そこで登場するのがComfyUI-Managerだ。Install Missing Custom Nodesをクリック、赤いNodeを含むカスタムNodeが表示されるので、インストールし、再起動。再起動後、Webブラウザをリロードすれば赤い部分が消える。

 これで左上のLoad Checkpointをflux1-dev-fp8.safetensorsへ変え、[Queue Prompt]をクリックすると、ご覧のように実写と勘違いしそうな美女が現れる(笑)。

無事FLUX.1 [dev] fp8で美女が生成できた♪

 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というフォルダに入れておく。

Xlabs AIのカスタムNodeを使ったControlNet / Depth対応Workflow

 先の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でモデルを選ぶのを忘れずに!以下のような美女が出れば正解だ。

XLabs AIのカスタムNodeを使った普通の生成(左のスイッチは2つともオフ)。無事美女が登場!
左のスイッチのControlNetをオンにしてControlNet / Depthを使った画像を生成。入力した画像とポーズなどが一致しているのが分かる

 次に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に興味を持った人はぜひ試して欲しい。