ComfyUI Durable 发布:崩溃后自动重启并从断点继续任务
Stopping Comfy UI Crashes – ComfyUI Durable
ComfyUI Durable 是一个 ComfyUI 自定义节点,在 ComfyUI 崩溃或被杀掉后自动重启进程、恢复队列,并从最后保存的采样步继续任务,而不是从第 1 步重跑。
ComfyUI 崩溃时,你的工作不会丢失。
这是真实录屏,不是动画。我们在 120 步中的第 65 步附近用 kill -9 停止 ComfyUI。Durable 会重新启动 ComfyUI。任务从第 65 步继续并完成。完整视频:docs/kill-test.mp4。
问题所在
你把十个视频任务放进队列。然后你去睡觉。
到第四个任务时,ComfyUI 用尽所有内存并停止。
早上,队列是空的。运行过的任务丢失了。你必须重新开始。
Durable 做什么
- 它会重新启动 ComfyUI。如果 ComfyUI 在任务期间停止,Durable 会用相同的设置再次启动它。
- 它会把你的队列放回去。任务会按相同顺序回到队列中。
- 它会从最后一步继续任务。它不会从第 1 步重新开始任务。
- 它会保留已完成的工作。如果崩溃发生在采样之后,ComfyUI 不会再次进行采样。
- 它会在“内存不足”错误后重试。它会释放内存,然后再次运行任务。
- 它给你一个暂停按钮。暂停会停止任务并释放 GPU 内存。恢复会从同一步继续任务。
你不需要添加节点。你不需要更改工作流。你不需要更改启动 ComfyUI 的方式。
安装
-
在你的
ComfyUI/custom_nodes文件夹中打开终端。 -
运行此命令:
git clone https://github.com/castor639/comfyui-durable.git
-
再次启动 ComfyUI。
为确保 Durable 正常工作,请在 ComfyUI 日志中查找这一行:[durable] protecting jobs。你还会在 ComfyUI 页面左下角看到一个小标签。
Durable 不添加新的依赖项。它只使用 Python 标准库,以及 ComfyUI 已有的 torch、aiohttp 和 psutil。
30 秒内看到它工作
- 在 ComfyUI 中启动一个长时间任务。例如,使用一个 100 步的 KSampler。
- 当任务进行到大约一半时,停止 ComfyUI 进程。在 Linux 或 macOS 上,运行
kill -9 $(pgrep -f 'main\.py( |$)')。 在 Windows 上,打开任务管理器。找到占用内存最多的python.exe进程,然后点击结束任务。 - 等待大约 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
