Last Updated on 2024-07-31 by Clay
介紹
上一回我們完成了 ComfyUI 的配置,現在我們可以開始建立一個最基本的工作流(workflow)。工作流是 ComfyUI 跟 stable-diffusion-webui 最不同的地方,ComfyUI 藉由不同卡片之間組成的流程,更容易讓人明白實際上 Stable Diffusion 的模型究竟是怎麼推理的、也更容易客製化做出更進階的效果。
總之,畫面一打開,你應該就會看見系統配置的基本工作流了。

不過直接這樣上手一看,第一眼確實相當複雜,現在我們先按下 Clear 按鈕,一步步重新來過吧!

搭建基礎的工作流(workflow)
1. 建立 Empty Latent Image 卡片
首先,我們在界面上任意處左鍵雙擊,便會跳出 Search 的搜尋方框;接著我們搜尋 empty
,並且把 Empty Latent Image 卡片叫出來。

而這 Empty Latent Image 其實是一堆高斯分佈的噪音圖像,也是 Stable Diffusion 的原始輸入,Stable Diffusion 模型會通過一系列反向擴散步驟,逐步去噪(de-noising),從噪音中生成清晰的圖像。
在這裡,我們可以設定模型的長寬以及總共要生成幾張圖片(batch_size)。
2. 建立 Load Checkpoint 卡片
這個卡片最重要的是可以選擇我們要使用的 Stable Diffusion 模型。如果裝好了 ComfyUI,預設應該會附帶一個很基本的 v1-5-pruned-emaonly.safetensors 模型,就先選擇使用它吧!之後,我再來寫一篇文章,把 Stable Diffusion 網路上可以找到的資源整理一下。

3. 建立 Prompt 卡片
以同樣的方法,我們繼續建立 CLIP Text Encode 卡片,這裡要建立兩個:一個是正向的提示詞(Positive Prompt),告訴模型我們想要生成什麼東西、一個是反向的提示詞(Negative Prompt),告訴模型我們不要生成什麼。

對著卡片點擊右鍵,你會看到一個有著許多編輯選項的選單,在這裡,我習慣替兩個卡片分別取不同的名字與顏色,好用來區分哪個是正向提示詞、哪個是反向提示詞。
最後別忘了,我們需要把 Load Checkpoint 卡片的 CLIP 的黃點,分別連接上正向提示詞和反向提示詞的卡片輸入,這樣一來模型才會去解析這些提示詞。
順帶一提,我把正向提示詞設定為 a dog, run in the forest, day, sun, blue sky,
並把反向提示詞設定為 cat
,希望等等出現的動物只有狗就好。
4. 建立 KSampler 卡片
這一步可說是這篇筆記中最複雜的一步了。首先我們先建立 KSampler 卡片,你會看到它接受四個輸入:
- model
- positive
- negative
- latent_image
但說穿了其實也並沒有那麼困難:positive 和 negative 很顯然是分別接上兩個不同的提示詞的、model 則是接 Load Checkpoint 的 MODEL 輸出、latent_image 則是接最初設定的噪音圖像的 LATENT 輸出。

我們現在開始可以觀察到一些規律,幫助我們不要接錯工作流:
- 放在卡片右側的大寫文字,通常代表著『輸出』;而對應著的卡片左側小寫文字,則代表著其所需要的『輸入』
- 對應的小圓點,輸入和輸出的顏色是一模一樣的
除此之外,KSampler 還有著一些看起來比較困難的參數,下面我列出參數的意義,之後可以實驗性質地去測試調整後的效果。
- seed: 用於隨機數生成的種子值,而設定一個固定的種子可以確保生成的圖像是可重現的
- control_after_generate: 指定在生成圖像後的 seed 會如何變化,預設是 random 的,但是我將其固定,所以此處設置為 fixed
- steps: 這是擴散過程中的去噪步驟數量,更多的去噪步驟通常會產生更高質量的圖像,但也會增加計算時間,有時走過頭了也會生成預期外的結果,我會建議測試時都設定為 20 步,確認生成的結果是希望的方向,再慢慢提昇步數
- cfg: 是 Classifier Free Guidance 的縮寫,數值用於平衡模型跟隨正向提示詞與不跟隨反向提示詞的程度;通常來說,值越高、模型會越是嚴格地遵循提示詞,但是設定得過高也會導致圖片出現奇怪的解碼,設定為 6.0 ~ 9.0 是常見的範圍
- sampler_name: 指定所使用的採樣器。採樣器是用來決定如何在潛在空間中進行擴散過程,此處先暫時使用 euler,這個如果要細究,恐怕得開十幾篇坑才填得上
- scheduler: 這是調度器,用於控制擴散過程中的步驟安排。此處先設定為 normal,同樣,這是一個大坑
- denoise: 去噪強度的參數,數值範圍通常是 0 到 1,決定了每一步的去噪程度,1.00 表示完全去噪
5. 建立 VAE Decode 卡片
這裡其實是推理過程的最後一步了,我們建立 VAE Decode 這個解碼器的卡片,把最終結果解碼成圖片。它的輸入 samples 是剛剛 KSampler 的輸出 LATENT,另外一個輸入 vae 則是接一開始的 Load Checkpoint 卡片的 VAE 輸出。

6. 建立 Save Image 卡片
現在建立 Save Image 卡片,把 VAE Decode 的輸出將其連接上,按下右側工作面板的 Queue Prompt,Stable Diffusion 架構就會開始生成圖片了。

這裡如果有任何的錯誤,ComfyUI 都會跳出提出跟高亮提醒,所以可以迅速地 DEBUG。總之,到這裡我們總算是大公告成了,下面附上我們整體的工作流。

保存你的工作流
那接下來還有一個問題 —— 如果每次我們重新開始推理都要搭建工作流,豈不是太累了?而且接下來要玩高階一點的技巧,恐怕搭建工作流的複雜程度會比現在多上十倍不只欸?
所以,是的,我們應該把自己搭建好的工作流保存起來。點擊右側工作面板的 Save 按鈕,我們可以將工作流儲存成一個 Json 檔案,之後可以用 Load 完美復原到當前的工作流。
另外,我們也可以參考網路上各方大神所建立的工作流,偷師一點技巧,我自己還滿常這樣做的。我推薦以下這個網站:Prompting Pixels,基本常見的幾種技巧幾乎都在上面了。
那麼,下一篇我將紀錄一些 Stable Diffusion 的網路資源,希望能有些幫助。