跳到正文
Hacker News· bharathontop·· 5 天前AI 评分62

ComfyUI Durable 发布:崩溃后自动重启并从断点继续任务

Stopping Comfy UI Crashes – ComfyUI Durable

AI 导读

ComfyUI Durable 是一个 ComfyUI 自定义节点,在 ComfyUI 崩溃或被杀掉后自动重启进程、恢复队列,并从最后保存的采样步继续任务,而不是从第 1 步重跑。

正文 · AI 翻译

ComfyUI 崩溃时,你的工作不会丢失。

A ComfyUI job is stopped with kill -9. Durable starts ComfyUI again. The job continues at step 65 of 120 and completes.

这是真实录屏,不是动画。我们在 120 步中的第 65 步附近用 kill -9 停止 ComfyUI。Durable 会重新启动 ComfyUI。任务从第 65 步继续并完成。完整视频:docs/kill-test.mp4。

问题所在

你把十个视频任务放进队列。然后你去睡觉。

到第四个任务时,ComfyUI 用尽所有内存并停止。

早上,队列是空的。运行过的任务丢失了。你必须重新开始。

Durable 做什么

  • 它会重新启动 ComfyUI。如果 ComfyUI 在任务期间停止,Durable 会用相同的设置再次启动它。
  • 它会把你的队列放回去。任务会按相同顺序回到队列中。
  • 它会从最后一步继续任务。它不会从第 1 步重新开始任务。
  • 它会保留已完成的工作。如果崩溃发生在采样之后,ComfyUI 不会再次进行采样。
  • 它会在“内存不足”错误后重试。它会释放内存,然后再次运行任务。
  • 它给你一个暂停按钮。暂停会停止任务并释放 GPU 内存。恢复会从同一步继续任务。

你不需要添加节点。你不需要更改工作流。你不需要更改启动 ComfyUI 的方式。

安装

  1. 在你的 ComfyUI/custom_nodes 文件夹中打开终端。

  2. 运行此命令:

    git clone https://github.com/castor639/comfyui-durable.git
  3. 再次启动 ComfyUI。

为确保 Durable 正常工作,请在 ComfyUI 日志中查找这一行:[durable] protecting jobs。你还会在 ComfyUI 页面左下角看到一个小标签。

Durable 不添加新的依赖项。它只使用 Python 标准库,以及 ComfyUI 已有的 torch、aiohttp 和 psutil。

30 秒内看到它工作

  1. 在 ComfyUI 中启动一个长时间任务。例如,使用一个 100 步的 KSampler。
  2. 当任务进行到大约一半时,停止 ComfyUI 进程。在 Linux 或 macOS 上,运行 kill -9 $(pgrep -f 'main\.py( |$)')。 在 Windows 上,打开任务管理器。找到占用内存最多的 python.exe 进程,然后点击结束任务。
  3. 等待大约 10 秒。ComfyUI 会自行重新启动。页面会自行重新连接。任务会从停止的步骤继续。

你会看到什么

左下角的标签显示状态:

标签 含义 按钮
Protected: 2 jobs Durable 保留 2 个任务的记录。 暂停会在任务当前步骤停止它们。
Paused: 2 jobs 有 2 个任务在等待你。 恢复会从任务停止的步骤继续它们。
Durable 队列中没有任务。 没有按钮。

当 Durable 执行操作时,右上角会显示一条消息。例如:Resumed sampling at step 65/120 instead of starting over。

每种情况下会发生什么

事件 结果
ComfyUI 在任务期间停止(崩溃、kill -9、内存全部用尽) Durable 会重新启动 ComfyUI。队列会恢复。任务会从最后保存的步骤继续。
ComfyUI 在 VAE 解码期间停止 任务不会再次进行采样。它只进行解码。在我们的测试中,任务在重启后 7 秒完成。
某个节点显示 GPU“内存不足”错误 Durable 会释放内存。然后再次运行任务,最多 2 次。
你点击暂停 任务会在当前步骤停止。GPU 内存会被释放。
你点击恢复 任务会从停止的步骤继续。当你重启 ComfyUI 时,已暂停的任务会保持暂停。
你自己停止 ComfyUI(Ctrl+C,或正常的 kill) Durable 不会重新启动 ComfyUI。下次你启动 ComfyUI 时,你的任务会显示为已暂停。点击恢复来运行它们。
在 Windows 上,你关闭 ComfyUI 控制台窗口 Durable 不会再次启动 ComfyUI。下次你启动 ComfyUI 时,你的任务会显示为已暂停。
在 Windows 上,你在任务管理器中使用 结束任务 Windows 会以与崩溃相同的方式停止进程。如果队列中有任务,Durable 会再次启动 ComfyUI。

Durable 如何做到这一点

  • 在采样过程中,Durable 会将当前的 latent 保存到磁盘。它每 10 秒执行一次(你可以更改此设置)。latent 很小,只有几 MB,视频也是如此。
  • Durable 会将普通节点的输出保存到磁盘:latents、图像、蒙版和文本条件。每个输出的键包含 ComfyUI 缓存键,以及该输出使用的每个模型文件的大小和修改时间。
  • Durable 会将队列中的每个任务写入磁盘。
  • 一个小型看门狗进程会监控 ComfyUI。如果 ComfyUI 在队列中有任务时停止,看门狗会使用相同的命令行再次启动 ComfyUI。

测试结果

我们在 NVIDIA A10G GPU 上、在 Linux 和 Windows(ComfyUI 便携版)上运行了这些测试。在每个测试中,我们在采样过程中停止了 ComfyUI:在 Linux 上使用 kill -9,在 Windows 上使用 结束任务(TerminateProcess)。然后我们将结果与没有崩溃的运行进行了比较。两次运行都使用了相同的种子。

采样器 模型 与无崩溃运行的差异
euler SD 1.5 无。结果逐位相同。
euler_ancestral SD 1.5 无。结果逐位相同。
dpmpp_2m SD 1.5 0.08%
dpmpp_2m_sde SD 1.5 0.14%
uni_pc Wan 2.1 1.3B 视频 1.7%。你在帧中看不出差异。
WanVideoWrapper 中的 unipc Wan 2.1 1.3B 视频 5.3%(所有帧的 PSNR 为 31.8 dB)。你在帧中看不出差异。

为什么某些采样器会产生微小差异:

  • Ancestral 和 SDE 采样器在每一步都会添加随机噪声。Durable 会将噪声生成器恢复到相同位置。因此结果是精确的。
  • 多步采样器(dpmpp_2m、uni_pc、deis 等)使用最后几步的数据。Durable 不会保存这些数据。因此重启后的第一步不够精确,结果会有微小变化。

Windows 上的结果与 Linux 上相同:euler 和 euler_ancestral 逐位相同,dpmpp_2m 为 0.08%,Wan uni_pc 为 1.7%。

其他测试结果:

  • VAE 解码期间崩溃:任务在重启后 7 秒完成,因为采样的 latent 来自磁盘。
  • 暂停:GPU 内存降至 373 MiB。恢复后,图像逐位相同。
  • “内存不足”错误(模拟):Durable 再次运行了该任务,任务完成。
  • 速度:一个 20 步的 SD 1.5 任务使用 Durable 耗时 2.01 秒,不使用 Durable 也耗时 2.01 秒。一个 Wan 2.1 1.3B 任务(33 帧,30 步)使用 Durable 耗时 153 秒,不使用 Durable 耗时 152 秒。

设置

所有设置都是可选的。要更改设置,请在启动 ComfyUI 之前设置环境变量。

变量 默认值 作用
DURABLE_SNAPSHOT_SECONDS 10 两次保存采样器 latent 之间的最短时间(秒)。
DURABLE_CACHE_GB 20 磁盘缓存的最大大小。当缓存已满时,Durable 会先删除最旧的输出。
DURABLE_CACHE_ENTRY_GB 4 Durable 不会保存大于此值的输出。
DURABLE_OOM_RETRIES 2 在出现“内存不足”错误后,Durable 再次运行任务的次数。
DURABLE_WATCHDOG 1 设置为 0 可停止 ComfyUI 的自动重启。
DURABLE_DISABLE 未设置 设置为 1 可停止 Durable 的所有功能。

Durable 将其数据保存在 ComfyUI/user/durable/<port>/ 中。要删除所有 Durable 数据,请删除此文件夹。

限制

  • 当看门狗在 Linux 或 macOS 上再次启动 ComfyUI 时,ComfyUI 会在后台运行。ComfyUI 的输出会写入 ComfyUI/user/durable/<port>/relaunch.log。要停止此 ComfyUI,请使用 kill <pid>。在正常 kill 后,Durable 不会再次启动 ComfyUI。
  • 当看门狗在 Windows 上再次启动 ComfyUI 时,ComfyUI 会在新的控制台窗口中打开。浏览器不会打开新标签页。
  • Durable continues these sampler nodes at the last saved step:
    • ComfyUI 采样器节点:KSampler、KSamplerAdvanced 和 SamplerCustom。
    • 来自 ComfyUI-WanVideoWrapper 的 WanVideoSampler 节点。Durable 使用此节点的 samples 和 start_step 输入。Wan 2.2 高噪声和低噪声工作流使用相同的输入。
  • 对于 WanVideoWrapper,Durable 不会继续使用上下文窗口、FreeInit、multitalk、部分去噪或不常见嵌入类型的作业。这些作业会从第 1 步重新开始。
  • 其他拥有自己采样循环的自定义节点会从第 1 步重新开始。Durable 仍会保留它们的输出,并将它们的作业放回队列。
  • 有些采样器不会在每一步提供 Durable 所需的数据(例如 dpm_adaptive)。这些采样器会正常运行,但在崩溃后会从第 1 步重新开始。
  • 如果由 systemd、Docker 或其他监督程序启动 ComfyUI,Durable 不会再次启动 ComfyUI。监督程序会执行此操作。Durable 只会将队列放回。
  • Durable 不会将合作伙伴节点的 API 密钥写入磁盘。重启后,使用这些密钥的作业需要再次提供密钥。
  • 如果你使用 --cache-none 启动 ComfyUI,ComfyUI 不会生成节点缓存键。这样 Durable 就不会保存采样器步骤或节点输出。
  • 我们在 Windows 上使用 ComfyUI 便携版构建(Windows Server 2022、NVIDIA A10G)测试了 Durable。我们没有测试 ComfyUI 桌面应用。

许可证

GPL-3.0。这与 ComfyUI 的许可证相同。

来源:Hacker News · github.com