ComfyUI:将工作流部署为 API

ComfyUI 是一个强大的工具,用于设计高级扩散工作流。它提供了丰富的资源集合,包括共享工作流和自定义节点,帮助创意工作者和开发者无需处理复杂的代码即可生成内容。然而,将这些工作流部署和提供为可扩展的 API 端点可能复杂且不直观

为了解决部署挑战,BentoML 团队开发了comfy-pack,这是一个全面的工具包,可将 ComfyUI 工作流转换为生产级 API。具体来说,comfy-pack 使您能够

  • 为工作流输入和输出定义标准化 API 模式

  • 将工作流作为可通过标准 API 客户端访问的 HTTP 端点提供

  • 将工作流部署到 BentoCloud,享受企业级功能,如快速自动扩展和内置可观测性

  • 将完整工作空间打包为便携式工件,以实现一致的重现

安装

您可以使用ComfyUI Manager 或 Git 安装 comfy-pack。

  1. 打开 ComfyUI Manager

  2. 搜索 comfy-pack 并点击安装

    Install comfy-pack via ComfyUI Manager
  3. 点击重启并刷新您的 ComfyUI 界面以应用更改。

将仓库克隆到您的 ComfyUI 自定义节点目录中

cd ComfyUI/custom_nodes
git clone https://github.com/bentoml/comfy-pack.git

指定输入和输出节点

将 ComfyUI 工作流作为 API 提供时,一个关键挑战是为工作流输入和输出建立标准化模式。comfy-pack 通过提供专用接口节点来解决这个问题,这些节点可以与现有工作流无缝集成,而不会影响其核心功能。

  1. 右键单击包含要暴露的小部件的节点。

  2. 选择“转换为输入小部件”,然后选择小部件名称。

  3. 添加 comfy-pack 输入节点

    1. 在空白处右键单击。

    2. 导航到“添加节点”>“ComfyPack”>“input”,然后选择所需的输入节点类型

      • 图像输入:接受图像类型输入,类似于官方的 LoadImage 节点。

      • 字符串输入:接受字符串类型输入(例如,提示词)。

      • 整数输入:接受整数类型输入(例如,尺寸、种子)。

      • 文件输入:接受文件类型输入。

      • 任意输入:接受组合类型和其他输入(例如,自定义节点)。

  4. 将 comfy-pack 输入节点连接到您之前转换的小部件。

    Add comfy-pack input node
  5. 添加 comfy-pack 输出节点

    1. 在空白处右键单击。

    2. 导航到“添加节点”>“ComfyPack”>“output”,然后选择所需的输出节点类型

      • 文件输出:将文件路径作为字符串输出,并将文件保存到指定位置。

      • 图像输出:输出图像,类似于官方的 SaveImage 节点。

  6. 将工作流的输出连接到 comfy-pack 输出节点。

    Add comfy-pack output node
  7. 运行工作流以确保其按预期工作。

将工作流作为 API 提供

您可以将 ComfyUI 工作流暴露为可从任何客户端调用的 HTTP API。

  1. 在屏幕顶部的工具栏上,点击“提供服务”(Serve)。

  2. 设置所需端口(默认:3000)。

  3. 点击“启动”(Start)启动服务器。API 将在 http://127.0.0.1:<port> 可用。

  4. 服务器暴露了 /generate 端点。您可以使用它提交包含通过 comfy-pack 节点配置的参数(例如,promptwidthheightseed)的请求。例如

    curl -X 'POST' \
        'http://127.0.0.1:3000/generate' \
        -H 'accept: application/octet-stream' \
        -H 'Content-Type: application/json' \
        --output output.png \
        -d '{
        "prompt": "rocks in a bottle",
        "width": 512,
        "height": 512,
        "seed": 1
    }'
    

    comfy-pack 使用 BentoML 作为其服务框架,允许您使用BentoML Python 客户端进行交互

    import bentoml
    
    with bentoml.SyncHTTPClient("http://127.0.0.1:3000") as client:
        result = client.generate(
            prompt="rocks in a bottle",
            width=512,
            height=512,
            seed=1
        )
    

    重要提示

    API 调用中的参数名称必须与您的 comfy-pack 节点名称匹配。

部署到 BentoCloud

您可以将您的 ComfyUI 工作流部署到 BentoCloud,以获得更好的管理和可扩展性。

  1. 在屏幕顶部的工具栏上,点击“部署”(Deploy)。

  2. 在弹出的对话框中,设置名称并选择所需的模型和系统软件包。

  3. 输入您的 BentoCloud 访问令牌。如果您没有 BentoCloud 账户,请免费注册创建一个令牌

  4. 点击“推送到云”(Push to Cloud),等待您的 Bento 构建完成。

  5. 准备就绪后,点击“立即部署”(Deploy Now)以在 BentoCloud 上打开 Bento 详情页面。

  6. 从 BentoCloud 控制台部署 Bento。

打包和恢复工作空间

您可以将 ComfyUI 工作空间打包成一个便携式工件,确保它可以轻松传输并在其他地方以一致的行为解包。

创建包

  1. 在屏幕顶部的工具栏上,点击“打包”(Package)。

  2. 设置包的名称。

  3. (可选)选择要包含的模型。请注意,只存储模型哈希值,而不是实际文件。这可以最大限度地减小包的大小,同时确保版本准确性。

  4. 点击“打包”(Pack)。您的浏览器将自动下载一个 .cpack.zip 文件。

恢复工作空间

  1. 安装 comfy-pack CLI

    pip install comfy-pack
    
  2. 解包 .cpack.zip 文件

    comfy-pack unpack <workflow_name>.cpack.zip
    

解包时,comfy-pack 通过执行以下步骤来恢复原始 ComfyUI 工作空间

  1. 准备一个带有工作流中使用的精确软件包的 Python 虚拟环境。

  2. 克隆特定的 ComfyUI 版本和自定义节点,固定到工作流所需的精确版本。

  3. 从 Hugging Face 和 Civitai 等常用注册表搜索和下载模型。它使用符号链接实现高效的模型共享(即,模型只下载一次并在工作流之间重用),并通过哈希检查验证模型完整性。