在 Hugging Face Spaces 上使用 Gradio 執行 ComfyUI 工作流程

Hugging Face 推出了一種方法,將複雜的 ComfyUI 工作流程轉換為獨立的 Gradio 應用程式,讓它們能夠在 Hugging Face Spaces 上使用無伺服器的 ZeroGPU 基礎設施免費部署與執行。

將 ComfyUI 工作流程匯出為 Python

若要在沒有節點式 UI 的情況下執行 ComfyUI 工作流程,必須先將工作流程匯出為純 Python 腳本。這可透過 Peyton DeNiro 所開發的 ComfyUI-to-Python-Extension 完成。

匯出流程:

  1. 透過 ComfyUI 中的 Custom Nodes Manager 安裝 ComfyUI to Python Extension
  2. 進入 UI 設定,停用新選單,並選取「Save as Script」。
  3. 此過程會產生一個 Python 腳本,代表工作流程的後端邏輯。

建立 Gradio 介面

工作流程匯出為 Python 後,即可建立 Gradio 應用程式,以協調腳本並提供使用者友善的介面。

UI 實作

開發者可以使用 gr.Blocks() 定義想要向最終使用者公開的輸入。例如,在 Flux[dev] Redux + Flux[dev] Depth 工作流程中,常見的公開參數包括:

  • 文本提示
  • 結構與風格圖像
  • 深度與風格強度滑桿

整合邏輯

為了讓 UI 可運作,將 Python 腳本中匯出的 main() 函式轉換為生成函式(例如 generate_image)。匯出腳本內的硬編碼值會被來自 Gradio 輸入的變數取代,且最終的圖像輸出節點會被修改為回傳已儲存的圖像路徑。

部署至 Hugging Face Spaces

部署至 Hugging Face Spaces 需要特定的最佳化,以避免上傳龐大的模型檔案,並利用無伺服器的 GPU 加速。

模型管理

不直接上傳模型,而是使用 huggingface_hub 函式庫的 hf_hub_download 函式,以程式方式將本機 ComfyUI 模型路徑對應到 Hugging Face Hub 上的相應版本。這確保模型僅在 Space 啟動時下載一次。

ZeroGPU 最佳化

為了啟用免費推論,生成函式必須以 @spaces.GPU 裝飾。為了在 ZeroGPU 上優化效能,並避免每次執行時都從磁碟重新載入模型到 GPU,模型宣告應從裝飾函式移至全域 Python 環境。預先載入則透過 ComfyUI 的 model_management.load_models_gpu 函式處理。

部署步驟

  1. Requirements:custom_nodes 資料夾中的所有需求合併至根目錄的單一 requirements.txt 檔案。
  2. Space Configuration: 建立新 Space,並將硬體設定為 ZeroGPU(此功能供 PRO 訂閱者使用,或可透過申請授權使用於 ComfyUI 後端)。
  3. File Upload: 上傳所有 ComfyUI 資料夾檔案,models 資料夾除外。
  4. Authentication: 對於受限模型(例如 FLUX),在 Space 設定中新增名為 HF_TOKEN 的機密,以存放 Hugging Face 令牌。

未來自動化

Hugging Face 計畫於 2025 年初自動化並簡化「workflow-to-app」流程,減少手動編碼與設定的需求。

Sources