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

将 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. 依赖要求: 将所有 custom_nodes 文件夹中的依赖合并到根目录下的单个 requirements.txt 文件中。
  2. Space 配置: 创建一个新的 Space 并将硬件设置为 ZeroGPU(对 PRO 订阅者可用,或通过申请获得用于 ComfyUI 后端的授权)。
  3. 文件上传: 上传除 models 文件夹之外的所有 ComfyUI 文件夹内容。
  4. 身份验证: 对于受限模型(如 FLUX),在 Space 设置中添加名为 HF_TOKEN 的 Hugging Face 令牌作为密钥。

未来自动化

Hugging Face 计划在 2025 年初实现工作流到应用的自动化与简化,降低手动编码和设置的需求。

Sources