DCAI
Loading Light/Dark Toggl

ComfyUI Flux.1 [schnell]で高パフォーマンスのGGUFを使うには

⏱️10min read
📅 2024年11月3日
🔄 2024年11月15日
カテゴリー:📂 AIイラスト中級
ComfyUI Flux.1 [schnell]で高パフォーマンスのGGUFを使うにはのメイン画像

今回はComfyUI Flux.1[schnell]でGGUFを使う方法を解説します。Flux.1で量子化GGUFを使う場合は専用モデルと専用カスタムノードをつかいます。GGUFを使うことでパフォーマンスを向上できるのでおススメします。

GGUFとは

GGUF(GPT-Generated Unified Format)とは2023年8月にllama.cppチームによって発表されたファイル形式で、それまでのGGML(GPT-Generated Model Language)では対応できなかったモデルに対応したり、さらなる汎用性・拡張性を持っています。イラスト生成AI分野ではではsafetansorやbinファイルを量子化変換して公開されています。ご自身でGGUFファイルを作りたい方は公式のリポジトリをクローンして「convert-hf-to-gguf.py」を使って変換することもできます。

ComfyUI Flux.1 [schnell]でGGUFを使うには

モデルのダウンロード

ComfyUI Flux.1[schnell]でGGUFを使うにはcity96氏が公開しているモデルをダウンロードしましょう。リポジトリには2-bit(Q2_K)から16-bit(F16)まで並んでいるので後ほど説明する「量子化について」を参考にご自身の環境に適したモデルをダウンロードしましょう。

量子化について

city96/FLUX.1-schnell-ggufの量子化のタイプは下記の表の様になっています。

基本的にはビット数が多い程、精度が上がります。その代わりVRAM消費も上がりますのでご自身の環境にあったタイプを使いましょう。

タイプモデルサイズ説明
Q2_K4.01 GB2ビット量子化。16ブロックのスーパーブロックで、各ブロックは16のウェイトを持つ。1ウェイトあたり2.5625ビットになる。
Q3_K_S5.21 GB3ビット量子化。16ブロックのスーパーブロックで、各ブロックは16のウェイトを持つ。1ウェイトあたり3.4375ビットになる。
Q4_K_S / Q4_0 / Q4_16.78 GB / 6.77 GB / 7.51 GB4ビット量子化。8ブロックのスーパーブロックで、各ブロックは32のウェイトを持つ。1ウェイトあたり4.5ビットになる。Q4_0とQ4_1は4bit近似値に四捨五入されています。
Q5_K_S / Q5_0 / Q5_18.26 GB / 8.25 GB / 8.99 GB5ビット量子化。8ブロックのスーパーブロックで、各ブロックは32のウェイトを持つ。1ウェイトあたり5.5ビットになる。Q5_0とQ5_1は5bit近似値に四捨五入されています。
Q6_K9.83 GB6ビット量子化。16ブロックのスーパーブロックで、各ブロックは16のウェイトを持つ。1ウェイトあたり6.5625ビットになる。
Q8_012.7 GB8ビット近似値に量子化。各ブロックは32のウェイトを持つ。
F1623.8 GB16ビット 標準IEEE754 半精度浮動小数点数。

VRAM別オススメタイプ

表をみてもいまいちわからない方に下記のオススメを載せておきます。

  • 24GB VRAM:Q8_0
  • 16GB VRAM:Q6_K
  • 12GB VRAM:Q5_K_S
  • 10GB未満のVRAM:Q4_0またはQ4_1

カスタムノードのインストール

ComfyUIでGGUFをつかうにはカスタムノードの「ComfyUI-GGUF」が必要になります。「Custom Nodes Manager」を使ってComfyUI-GGUFを検索してインストールしましょう。

カスタムノードのインストール方法が分からない方は下記の記事にて詳しく解説しているのでご参照ください。

量子化されたT5 v1.1 XXLエンコーダーのインストール(オプション)

city96氏が公開しているT5 v1.1 XXLエンコーダーのGGUFファイルを使うことでさらなるパフォーマンスを発揮できます。モデルと同じ量子化ファイルをダウンロードしましょう。

ComfyUI Flux.1 [schnell] + GGUFを使ったワークフロー

ワークフロー全体図 

ここからは実際にモデルを使ってワークフローを使ってみましょう。このワークフローでは下記のモデル・カスタムノードを使用していますのであらかじめダウンロード・インストールしておきましょう。また、ComfyUIのバージョンが古いと上手く動かないことがあるので最新版にアップデートしましょう。

  • flux1-schnell-Q8_0.gguf:今回紹介しているFlux.1 [schnell]の8ビット量子化モデル
  • t5-v1_1-xxl-encoder-Q8_0.gguf:8ビットに量子化されたT5 v1.1 XXLエンコーダー
  • ComfyUI-GGUF:GGUF形式ののUnetとCLIPを読み込むためのカスタムノード
  • Image chooser:カスタムノードで1st Passの結果を確認する為に実装、これにより生成時間が短い1st Passを満足のいく構成が出るまで簡単に再実行できます。
  • 🔗aki_anime.safetensorsアニメスタイルのLoRAモデル
  • 🔗hinaFluxFantasyArmorMix-schnell_v1-rev1.safetensorsファンタジー調の鎧を生成してくれるLoRA
  • 🔗clip_l.safetensorsFlux.1の標準テキストエンコーダー
  • 🔗ae.safetensorsFlux.1の標準VAE

ワークフローはPatreonで公開していますが、有料サポーター様のみ閲覧・ダウンロードが可能となっています。1か月だけでも有料サポーターになっていただければ執筆の励みになりますので、よろしければ入会をお願い致します。

また、ワークフローがダウンロード出来なくでも解説を見ればご自身でも構成できるので、このまま解説にお進みください。

Basic Info

Basic Infoの全体図 
  • Unet Loader (GGUF):GGUFのUnetを読み込みます。unet_nameにflux-schnell-Q8_0.ggufを選択します。
  • DualCLIPLoader (GGUF):GGUFのテキストエンコーダーモデルを読み込みます。clip_nameにclip_l.safetensorst5-v1_1-xxl-encoder-Q8.ggufを選択しましょう。
  • Load LoRA:LoRAを読み込みます。lora_nameにaki_anime.safetensors、strength_modelには少しだけベースモデルを反映させたいので0.80にします。さらにLoRAを適応させていのでもう一つLoad LoRAを配置してlora_nameにhinaFluxFantasyArmorMix-schnell_v1-rev1.safetensors、strength_modelは顔への影響があったので0.60にします。
  • Empty Latent Image:今回は1280 x 720にします。batch_sizeは1のまま使用します。
  • ModelSamplingFlux:タイムステップスケジューリングシフトの設定です。FLUX.1 [schnell] で使う場合はmax_shiftは0.0~2.0辺りで設定しましょう。今回は2.0に設定します。また、base_shiftは反映されないので0または、デフォルトの0.5で使いましょう。widthとheightはデフォルトの1024で問題ありません。場合によってはこのノードをバイパスした方が良い結果が得られる場合も在ります。
  • CLIP Text Encode (Prompt):基本的にはT5XXLが自然言語を得意としているので自然言語のみでも問題ありませんが、CLIP Lも使われているのでDanbooruスタイルも使うことができます。今回は下記のプロンプトを使います。
    A beautiful blonde girl stands on a hillside under a blue sky.
    She looks like an angelic knight with a halo ring.
    She gazes at the viewer.
    She opens her white wings.
    Many white feathers in the sky.
    The girl's head is adorned with jewels.
    
    The theme is teal and orange.
    
    
    (The old castle is on top of a hill:0.85).
    
    horizonin view, 50mm lens portrait, correct perspective, (anime kawaii face with detailed eyes:1.3), medival fantasy, water fall, authentic (no credits, no signature.:1.1), (detailed fantasy white and gold armor:1.2)
    ネガティブプロンプトは反映されないので空白のまま使います。
  • Load VAE:VAEを読み込みます。vae_nameにはae.safetensorsを選択してください。
  • Primitive (Seeds):Seedを外部化して1st Passと2nd Passのシード値を共有しています。

1st Pass

1st Passの全体図 

1st PassはComfyUIの標準サンプラーをつかいます。過去の記事で紹介している「SamplerCustomAdvanced」で構成しても問題ありません。

  • KSampler:seedは外部化してPrimitive (Seeds)より値を取得しています。stepsは2を使います。cfgはFlux.1[schnell]推奨の1.0に設定します。sampler_nameをeuler、schedulerをbetaに設定して、denoiseを1.00に設定します。
  • VAE Decode:サンプラーにて生成されたラテントイメージをピクセルイメージにデコードします。

Preview Chooser

Preview Chooserの全体図 

1st Passで生成された結果を確認する為に配置しています。気に入ったイラストが生成されたら選択して「Progress selected image」ボタンで次に進めましょう。

Upscale

Upscaleの全体図 
  • Load Upscale Model:アップスケーラーモデルを選択します。今回は4x-UltraSharp.pthを使用します。
  • Upscale Image (using Model):アップスケーラーモデルを使用する為に使います。
  • Scale Image to Total Pixels:アップスケーラーモデルを使って4倍に拡大された画像を任意の大きさに縮小します。今回は3.00に指定して3メガピクセルのイラストに拡大します。PCのスペックが十分な方は5.00にするとさらに鮮明なイラストを生成できます。
  • VAE Encode:スケールアップした画像を2nd Passに送るためにラテントイメージにエンコードします。

2nd Pass Info

2nd Pass Infoの全体図 
  • ModelSamplingFlux:2nd Passでは大きく構図を変えたくないのでmax_shiftを0.15にします。
  • CLIP Text Encode (Prompt):2nd Pass用に下記の様なシンプルなプロンプトを使います。
    very detailed, masterpiece, intricate details, UHD, 8K

2nd Pass

2nd Passの全体図 

2nd Passはほとんど1st Passと同じ設定にしていますが、denoiseのみ0.35に設定して元の構図を崩さないようにしています。

Preview Image

最終結果になります。画像を保存したい場合は右クリックメニューから「Save Image」を選択するか、このノードを「Save Image」に変更してください。

以上がワークフローの解説になります。

最終結果

最終結果
Seed:739450908043048

まとめ

いかがでしたか?GGUFを導入することでヘビー級のFlux.1が快適に動くようになったのではないでしょうか?city96氏のHugging FaceではFlux.1[shnell]の他にもFlux.1[dev]、SD3.5 largeやsd3.5 large turboモデルも公開していますので興味のある方は試してみると良いでしょう。

さて、今回でFlux.1[schnell]の記事が3回目となりましたが、モデル界隈ではあまり盛り上がっていないようです。恐らくFlux.1[schnell]はモデルサイズの軽量や速度の向上を目的とした蒸留(distillation)モデルなのであまり融通が利かない事が原因と思われます。この理由でControlNetが使えなかったりファインチューニングが出来なかったりもします。しかし、ostris氏が公開している「🔗OpenFlux.1」でFlux.1[schnell]の蒸留モデル部分が取り除かれたので、もしかするとControlNet等が登場するかもしれません。