在 Hugging Face Spaces 上使用 Gradio 运行 ComfyUI 工作流
将 ComfyUI 工作流导出为 Python
要在没有节点式 UI 的情况下运行 ComfyUI 工作流,必须先将工作流导出为纯 Python 脚本。这可以使用 Peyton DeNiro 创建的 ComfyUI-to-Python-Extension 实现。
导出流程:
- 通过 ComfyUI 中的 Custom Nodes Manager 安装
ComfyUI to Python Extension。 - 进入 UI 设置,关闭新菜单,并选择 “Save as Script”。
- 此过程会生成一个 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 函数进行预加载。
部署步骤
- 依赖要求: 将所有
custom_nodes文件夹中的依赖合并到根目录下的单个requirements.txt文件中。 - Space 配置: 创建一个新的 Space 并将硬件设置为 ZeroGPU(对 PRO 订阅者可用,或通过申请获得用于 ComfyUI 后端的授权)。
- 文件上传: 上传除
models文件夹之外的所有 ComfyUI 文件夹内容。 - 身份验证: 对于受限模型(如 FLUX),在 Space 设置中添加名为
HF_TOKEN的 Hugging Face 令牌作为密钥。
未来自动化
Hugging Face 计划在 2025 年初实现工作流到应用的自动化与简化,降低手动编码和设置的需求。