使用 ComfyUI 來生成圖片,再將其導入 Open WebUI 中,讓使用更加直觀。

Chun-Li 春麗
14 min readAug 12, 2024

--

目錄

⦿ 前情提要
⦿ 安裝 ComfyUI
⦿ 使用 ComfyUI
⦿ 與 Open WebUI 結合
⦿ impactframes/llama3_ifai_sd_prompt_mkr_q4km
⦿ 使用 Open WebUI 介面產生圖片
⦿ Prompt

前情提要

前篇文章中,使用 Ollama 在 Local 架設對話機器人伺服器,當時的語言模型是 Meta 的 llama3:8b,而實際到 Ollama 官方網站上看,目前最高參數的是 llama3.1:405b。

Open AI 的 GPT 3 的最高參數是 175b,而 GPT 4 謠傳參數是 1750b;Google 的 Gemini Ultra、Gemini Pro 並沒有明確給出參數量,不過較小的 Gemini Nano-1 跟 Gemini Nano-2 分別為 1.8b 和 3.25b;Anthropic 的 Claude 則一樣沒有明確給出參數量,但 Claude 3.5 Sonnet 綜合表現勝過 GPT 4-o。

不過 Meta 來勢洶洶,過去 Mistral AI 這家法國公司提出來的 Mistral 說用比較少的參數就能接近 Llama 的水準。

圖片源於 https://ai.meta.com/blog/meta-llama-3/

接著 Llama 3.1 開始跟 Claude 3.5 平分秋色。

圖片源於 https://ai.meta.com/blog/meta-llama-3-1/

而知道 Ollama 以語言模型作為基底,使用 Terminal 來下 prompt,是類似 API 的回應,所以對話機器人可以透過 Docker 起一個 Open WebUI 這個 Container,使用 Ollama 作為基底,而達成透過網頁的方式來讓使用者方便交互。

之前用模型的是 llama3:8b,它只有 text to text 的作用,今天我們想導入多模態,例如 text to image,即以文產圖,可不可行呢?

接著讓我們看下去吧!

繼續閱讀|回目錄

安裝 ComfyUI

ComfyUI,就跟 Open WebUI 很像,只是之前開啟的是 Ollama,藉由 Docker 起一個 Web Server,現在是希望 ComfyUI 開啟下載的模型(Stable Diffusion),同樣也起一個 Web Server,希望能夠透過網頁的方式,下 prompt 產生圖片,最終呈現大致如下:

下面就是步驟了。

首先,打開 Terminalcd Desktop 以切換到桌面。

git clone https://github.com/comfyanonymous/ComfyUI

接著,cd ComfyUI 以切換到 ComfyUI 資料夾。

鍵入 python3 -m venv venv 起一個虛擬環境。

鍵入 ./venv/bin/pip install torch torchvision torchaudio

鍵入 ./venv/bin/pip install -r requirements.txt

到此為止,ComfyUI 安裝完成,不過我們還缺少 Stable Diffusion 模型,於是需要到 Hugging Face 下載,例如我們到 https://huggingface.co/CompVis/stable-diffusion-v-1-4-original 這裡,下載 sd-v1–4.ckpt,使用 Stable Diffusion 1.4,下載完的 ckpt 檔案放到下面這個資料夾:ComfyUI/models/checkpoints

我們先鍵入 open ~/Desktop/ComfyUI/models/checkpoints,打開 checkpoints 這個資料夾,將 ckpt 檔案放進去。

到此為止,前置準備完成了!

繼續閱讀|回目錄

使用 ComfyUI

在 CLI,像我使用 Apple 筆電就是打開 Terminal,
鍵入 source venv/bin/activate ,接著就會呈現一個虛擬環境
(venv) chengchunli@MacBook-Pro-M2 ComfyUI %,這個環境與外界是隔離的。

接著鍵入 python main.py 就會啟動 ComfyUI,最後出現 To see the GUI go to: http://127.0.0.1:8188,這表示你已經 loopback 在本機架起一個網頁伺服器(即 ComfyUI 的功能),這個伺服器的基底是 Stable Diffusion 1.4

我們進到網頁看到如下:

在 Load Checkpoint 中可以選擇你放入的模型,剛剛下載的模型約 4.3 GB,這邊也可以看到有兩個 Prompt,我們只要專注在上方的 Prompt 即可,不過這邊要以英文輸入,否則在我輸入潑墨山水畫這幾個字後,按下右邊的 Queue Prompt,得到的結果如下圖左

但我們起碼要出現下圖右的結果,而不是讓他生成一個仿真的實景,於是,我們試著鍵入 a cat sitting on the couch, right behind the table, and TV is on. 使用英文的 Prompt,讓它去生成。

這次讓模型試著生成 1024 x 768 HD 的圖片,而 batch_size 是要它生成幾張,於是我們就會看到 KSampler 在跑進度條了,事實上,這個時候的 Terminal 中的虛擬環境也會跟著跑進度條,如下:

最後得到如下:

再使用 512 x 512,一次生成三張看看。

是不是很有趣呢?

繼續閱讀|回目錄

與 Open WebUI 結合

不過此時 Open WebUIComfyUI 各走各的路,是分開的,所以這邊要想辦法將他們結合起來。

我們先點到 Open WebUI 的管理員控制台。

我們先看看設定頁籤 => 模型 的地方,管理 Ollama 模型,這邊是 http://host.docker.internal:11434,這是利用 Docker 起的 Server,跟前一篇文章的 Port 一模一樣,不過這邊並不需要我們自己去設定,而是用 Docker 起完 Open WebUI 的服務後,Ollama 的模型位址就會是這一串,使用的也是 Ollama 預設 Port,不過當訪問 Open WebUI 時就會是 http://localhost:3000,因為當初起服務是使用 3000 映射到 8080,而 8080 跟 80 一樣都是 http 連線的 Port。

有了這樣的概念後,我們來看看 Open WebUI 上 Image Generation 如何說明。

官方的指令(第三步驟)把它拉出來看。

docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway \
-e COMFYUI_BASE_URL=http://host.docker.internal:7860/ \
-e ENABLE_IMAGE_GENERATION=True \
-v open-webui:/app/backend/data \
--name open-webui --restart always ghcr.io/open-webui/open-webui:main

將之與前一篇只起 Open WebUI 來對照。

docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway \
-v open-webui:/app/backend/data \
--name open-webui --restart always ghcr.io/open-webui/open-webui:main

多了設定 Base Url,以及 enable image generation,我們看到 Base Url 的地方是 http://host.docker.internal:7860/,但實際上我們執行 python main.py 的時候,剛剛使用的 ComfyUI 網址的 port 其實是 8188,那麼,起 Container 時指令應該改成如下:

docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -e COMFYUI_BASE_URL=http://host.docker.internal:8188/ -e ENABLE_IMAGE_GENERATION=True -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main

但等等,我們必須先把舊的 Open WebUI 的服務關閉,再來重啟這個 3000 映射到 8080 的 Open WebUI 的服務。

所以在 Terminal 如下執行(或使用 GUI)。

docker stop open-webui
docker rm open-webui

再鍵入剛才那段指令。

docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway \
-e COMFYUI_BASE_URL=http://host.docker.internal:8188/ \
-e ENABLE_IMAGE_GENERATION=True \
-v open-webui:/app/backend/data \
--name open-webui --restart always ghcr.io/open-webui/open-webui:main

還沒結束,這時候我們同樣回到 Open WebUI 的管理員控制台。

設定頁籤 => 圖片 的地方,將影像生成引擎選成 ComfyUI,基本 URL 的地方放入 http://host.docker.internal:8188/,這時候預設模型就可以選擇剛剛的 ckpt 檔案,也可設定圖片大小步數,在我的實測中,如果什麼都不動,步數就不要超過 25 了。

繼續閱讀|回目錄

impactframes/llama3_ifai_sd_prompt_mkr_q4km

為了要產生好的、描述充足來生成圖片的 prompt,我們在 Open WebUI 中還需要一個能夠將一般指令轉換成適合餵給 Stable Diffusion 的模型,所以這次試著在 Open WebUI 下載模型。

同樣到管理員控制台。

從 Ollama.com 下載模型處鍵入 impactframes/llama3_ifai_sd_prompt_mkr_q4km 然後按下右邊下載的按鈕,就完成了,我們也可參照這個網頁看看 impactframes 下有哪些模型。

使用 Open WebUI 介面產生圖片

首先,我們將模型選擇剛才下載回 Ollama 的那個 impactframes。

接著我們下指令得到 Prompt。

Open WebUI 跟 Terminal 就會開始跑。

最後生成如下:

雖然不夠完美,但這部份要再繼續研究看看 ComfyUIKSampler 了。

繼續閱讀|回目錄

Prompt

而是不是只能使用 llama3_ifai_sd_prompt_mkr_q4km呢?其實也不是,我們會希望其他模型也能使用 Prompt 去產生我們要的圖片,所以打開 Open WebUI,點到工作區 => 提示詞

在這裡加入一段提詞,/ 後面放入 image,將來就可將加入的提詞透過 /image 叫出來,下方加入

Craft a detailed and nuanced image generation prompt based on this brief: 
"['brief']".
Focus on expanding the visual elements, incorporating specific textures, colors, and atmosphere. The resulting prompt should be precise and rich in imagery, capturing the essence of the brief without any introductory or explanatory text.
根據這個簡述:"['brief']" 
來構建一個詳細且具有深度的圖片生成提示詞。
著重擴展視覺元素,融入具體的質感、色彩和氛圍。
最終的提示詞應該準確且富有畫面感,完全捕捉簡述的精髓,而不包含任何介紹性或解釋性的文字。

將來要生成的圖片,要把關於畫面的提示都放到 brief 中,結果如下:

--

--

Chun-Li 春麗

Do not go gentle into that good night, Old age should burn and rave at close of day; Rage, rage, against the dying of the light.