在 ComfyUI 上使用 SDXL 1.0

在 Stable Diffusion SDXL 1.0 版本推出以來,受到大家熱烈喜愛。我也在多日測試後,決定暫時轉投 ComfyUI。原因如下:

  • ComfyUI 可以一次過設定整個流程,對 SDXL 先要用 base model 再用 refiner model 的流程節省很多設定時間。
  • ComfyUI 啟動速度比較快,在生成時也感覺快一點,特別是用 refiner 的時候。
  • ComfyUI 整個界面非常自由,可以隨意拖拉到自己喜歡的樣子。
  • ComfyUI 在設計上很像 Blender 的 texture 工具,用後覺得也很不錯。
  • 學習新的技術總令人興奮,是時候走出 StableDiffusionWebUI 的舒適圈。

下載 SDXL 1.0

首先當然要下載 SDXL 1.0 的 Checkpoint Model,由於 SDXL 在訓練時圖片用上了 1024 x 1024 的圖片,解像度比 SD 1.5 時大了足足一整倍,而且訓練數據也增加了3倍,所以最終出來的 Checkpoint File 也比 1.5 的大得多。

下載 SDXL base Model (6.94GB)

stabilityai/stable-diffusion-xl-base-1.0 at main
We’re on a journey to advance and democratize artificial intelligence through open source and open science.

下載 SDXL refiner Model (6.08GB)

stabilityai/stable-diffusion-xl-refiner-1.0 at main
We’re on a journey to advance and democratize artificial intelligence through open source and open science.

另外可以下載 SDXL 用的 VAE (335MB)

stabilityai/sdxl-vae at main
We’re on a journey to advance and democratize artificial intelligence through open source and open science.

安裝方法

基本上跟 StableDiffusionWebUI 相似,安裝 Homebrew 及 Python 的方法可以參考前一篇文章,如已安裝可以跳過。

MacOS 安裝 StableDiffusionWebUI 及 有用的 Extension
雖然網上有不少 Cloud 的 圖像生成 AI service,但是如果要大量/長期免費地使用,在本地安裝及依靠本機運算能力的 Stable Diffusion 是一個不錯的選擇。
  •  安裝 Python 後,開新資料夾叫 ComfyUI 就好了,打開 Terminal 輸入指令 git clone https://github.com/comfyanonymous/ComfyUI.git 把 ComfyUI 儲存到資料夾中。
  • 安裝最新版的 torch
pip install --pre torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/nightly/cpu
  • 再安裝所需文件 pip install -r requirements.txt
  • 然後就可以使用指令啟動 ComfyUI python main.py --force-fp16
  • 成功運行後在 http://127.0.0.1:8188/ 就可以見到 ComfyUI。

ComfyUI 預設界面

使用方法

界面看起來很厲害,其實沒這麼困難的。首先把下載了的 checkpoint model 放到 /ComfyUI/models/checkpoints/ 中,Vae 放到 /ComfyUI/models/vae/,按一下右邊 Queue Prompt 下面的 Refresh 就會自動讀到新增的 models。

每一個小方格我們都叫做一個 Node,由最左邊的 Load Checkpoint 開始運作。

  1. Load Checkpoint - 讀取 checkpoint model,這裡選 sd_xl_base_1.0.safetensors 作為 model。
  2. 然後 Node 右邊的 3 條線就是將這個 Node 的結果輸出到另一個 Node。
  3. Clip Text Encode 就是輸入 Prompt 及 Negative prompt 的 Node,Checkpoint Loader 經 Clip Text Encode 將 prompt 傳送 KSampler。
  4. Latent Image 就是用作設定長闊以及每批次生成圖片的數量, SDXL 長闊記得設定成 1024 x 1024
  5. KSampler 入面的設定有用過 StableDiffusionWebUI 都很熟悉,seed 就是種子,使用相同設定及相同的種子就可以生成相同的圖片。還有預設每次生成後都會隨機變動 seed,這樣就每次都會生成不同的圖片。
  6. Step 是步數,通常設定 20 - 50,少過 20 步的過圖片會不成形,太多就會花很多時間及生成多餘的東西。CFG 是 prompts 的影響力,越大就越確實依照 prompts 生成,設定得比較少的話生成出來的圖片會比較有創意,最好由 7 - 15 左右。 Sampler 跟 Schedular 加起來就是 StableDiffusionWebUI 的 Sampling Methods,我最常用的 DPM++ SDE Karras 就是 dpmpp_sde + karras
  7. 最後右邊的 Save Image 就是自動儲存生成起的圖片。
  8. 選好了 Model ,輸入了 prompts 及選好設定後就可以按 Queue Prompt 開始生成。
  9. 然後生成的過程會一個 Node 一個 Node 去顯示整個過程去到那一步,直到最後就會在 Save Image 顯示預覽圖。

用了以下 Prompt

Intricate dynamic action shot of An astronaut riding a white horse on moon, highly detailed, anime style, studio anime, vibrant color

及 Negative Prompt

(low quality, worst quality:1.2), embedding:negativeXL.safetensors, watermark, photo, deformed, black and white, realism, disfigured, low contrast

用動畫風格來生成了一個經典的太空人。

用預設設定生成了一個太空人
用預設設定生成的太空人

不過生成後就會覺得出來的圖片怪怪的,精細度沒想像中高,很多像草稿的線條,主體邊緣解像度也有點低,而且 Refiner Checkpoint 不是還沒用過嗎,Refiner 就是用來在 base 生成圖片後再進行一次 img2img 細化 base 生成的如果,可以提高解像度及改善模糊的位置。


SDXL 1.0 的 ComfyUI 基本設定

我先設定用一個比較簡單的 Workflow 來用 base 生成及用 refiner 重繪。

  1. 需要有兩個 Checkpoint loader,一個是 base,另一個是 refiner。
  2. 需要有兩個 Sampler,一樣是一個是 base,另一個是 refiner。
  3. 當然 Save Image 也要兩個,一個是 base,另一個是 refiner。
  4. 然後就是要將整個 workflow 設定先用 base 文生圖,然後用將圖每給 refiner 圖生圖。
  5. 只要一個 queue 即可輸出 Base 及 Refiner 兩張圖,方便用來比較結果。

由於時間關係,我已經準備好檔案以供下載:

下載檔案後只要在 Queue Prompt 下按 Load 再選擇檔案即可有相同的界面設定,只要放好 Checkpoint Model 檔案即可。

Negative Prompt

如果有留意 Negative prompt 中有句 embedding:negativeXL.safetensors ,只要下載檔案放到 /COMFYUI/models/embeddings/ ,在 negative prompt 中用 embedding: + file name 就可以。

negativeXL - A | Stable Diffusion Embedding | Civitai
https://huggingface.co/gsdf/CounterfeitXL Negative Embeddings A:Standard B:Realistic C:Anime like
SDXL 專用的 Negative prompt
ComfyUI SDXL 1.0 設定
  • 左上角的 Prompt Group 內有 Prompt 及 Negative Prompt 是 String Node,再分別連到 Base 及 Refiner 的 Sampler。
  • 左邊中間的 Image Size 就是用來設定圖片大小, 1024 x 1024 就是對了。
  • 左下角的 Checkpoint 分別是 SDXL base, SDXL Refiner 及 Vae。
  • 右上的 Sampler 分別是 SDXL Base 及 SDXL Refiner 的設定及 Vae Decode。
  • 最後會生成左邊的是 base 的圖片,右邊是 refiner 的圖片。

比較一下 base 及 refiner 出來的成果:

  • 線條較為結實,比較少雜線。
  • 背面的星球的表面也比較好。
  • 馬的面部線條都簡化了。

ComfyUI 用後感

不過 ComfyUI 還有不少需要改進的空間,比起 StableDiffusionWebUI 真的比較難用。但在多線程的工作上也有他的好處,因為可以同時有很多組 prompt / checkpoint / LoRA ,同一時間運算比較不同的設定也有其好處,以後或者雙修 ComfyUI 及 StableDiffusionWebUI。