Blur operations running slow on CPU; [W101 …] Could not initialize NNPACK!

在使用 ComfyUI Impact Pack 的 Gaussian Blur Mask、Upscaler (SEGS) 等节点做羽化/模糊时,如果 CPU 不支持 AVX 等指令集,PyTorch 会回退到效率极低的 CPU 路径并打印 NNPACK 警告;优先排查掩膜模糊运算是否跑在了 CPU

快速结论:在使用 ComfyUI Impact Pack 的 Gaussian Blur Mask、Upscaler (SEGS) 等节点做羽化/模糊时,如果 CPU 不支持 AVX 等指令集,PyTorch 会回退到效率极低的 CPU 路径并打印 NNPACK 警告;优先排查掩膜模糊运算是否跑在了 CPU 而不是 ComfyUI 配置的设备(GPU)上。该问题已由 PR #1198 修复并合并进 Main,更新 Impact Pack 即为首选处理方式。

适用环境:Issue 报告的运行环境为 ComfyUI Impact Pack,显卡为 RTX 4080(验证时使用 42 组 CPU/CUDA 用例),触发问题的机器为不支持 AVX 指令的旧 CPU。Issue 未明确给出 Python、CUDA、PyTorch 具体版本号,请以自身实际安装为准。

最快修复方案:将 Impact Pack 更新到最新 Main 分支(修复提交 1d12240b633325226ba442de61a427e00de2430b,来自 PR #1198)。在旧版本上,可优先尝试以下手工补丁:在 modules/impact/utils.py 中,把高斯模糊调用的输入显式转移到 ComfyUI 配置的设备上执行,并将结果转回原设备。

注意事项:手工补丁只是 Issue 作者在若干节点上验证过的临时方案,作者本人说明仅测试了少数节点,若代码中存在“先模糊掩膜、再与图像混用但未显式统一设备”的路径,仍可能出现设备不一致问题,需要进一步调整。补丁中类似 image = image.cpu() 的强制回 CPU 语句作者认为可能可以删除,但未确认其必要性,不建议随意改动。

问题场景

在 ComfyUI 中使用 Impact Pack 的节点处理图像与掩膜时触发,典型场景包括:

  • 运行 Gaussian Blur Mask 节点,例如 kernel_size 设为 24;
  • 运行 Upscaler (SEGS) 节点,例如 feather(羽化)设为 20。

在旧 CPU 上,一次本应很快的模糊运算会拖到数分钟甚至数十分钟。Issue 作者实测:未打补丁时 Gaussian Blur Mask 执行耗时 183.66 秒;打补丁后同一提示词在 GPU 上仅 0.21 秒。Upscaler (SEGS) 的处理时间也从超过 10 分钟降到不足 90 秒。

报错原文

got prompt
[W101 16:54:13.026243409 NNPACK.cpp:56] Could not initialize NNPACK! Reason: Unsupported hardware.
Prompt executed in 183.66 seconds

对应的现象关键词:Blur operations running slow on CPU。

原因分析

核心问题不在 Impact Pack 本身,而是 PyTorch 张量运算落到了不支持 AVX 等指令集的旧 CPU 上执行。NNPACK 初始化失败后,高斯模糊这类运算在 CPU 上极其缓慢。

Issue 作者定位到的具体位置是 modules/impact/utils.py 中的高斯模糊相关代码:torchvision.transforms.GaussianBlur 的输入掩膜没有显式放到 ComfyUI 配置的设备上,导致模糊在 CPU 上执行。修复讨论进一步指出,PR 合并前的辅助函数丢弃了 .to(...) 的返回值,即设备转移实际未生效。

因此,真正的问题是 模糊运算的设备没有按配置落到 GPU,NNPACK 警告只是这一情况的伴随信号,表示硬件不支持相关加速路径。

环境排查

  • 确认 Impact Pack 版本是否早于修复提交 1d12240b633325226ba442de61a427e00de2430b(即是否已包含 PR #1198)。
  • 确认 ComfyUI 启动参数中配置的执行设备为 GPU,而非 --cpu。
  • 确认 PyTorch 为 CUDA 版本且能正常识别显卡;若 torch.cuda.is_available() 为 False,模糊仍会退回 CPU。
  • 确认 CPU 是否支持 AVX 指令集(可参考 CPU 型号规格);不支持 AVX 的旧 CPU 更容易暴露该问题。
  • 检查 modules/impact/utils.py 中 utils.tensor_gaussian_blur_mask() 相关代码是否已包含设备转移修复。

解决步骤

  1. 首选:把 Impact Pack 更新到最新 Main 分支,确保包含提交 1d12240b633325226ba442de61a427e00de2430b(PR #1198)。该提交修正了模糊前把掩膜转移到 ComfyUI 配置设备、模糊后再转回输入设备的逻辑。
  2. 若暂时无法更新,可临时手工修改 modules/impact/utils.py:在 apply gaussian blur 处,将模糊输入改为在目标设备上执行,例如 GaussianBlur(...)(mask.to(device)),而不是直接传入 mask。
  3. 同时检查 region1、region2 的索引切片是否显式转到了掩膜设备(.to(device=mask.device)),避免后续拼接或合成时出现 “Expected all tensors to be on the same device”。
  4. 修改后重启 ComfyUI,再分别用 Gaussian Blur Mask 和 Upscaler (SEGS) 节点重新运行相同工作流做对照。
  5. 如更新后仍异常,请核对 modules/impact/segs_nodes.py 与 modules/impact/impact_pack.py 中是否存在多余的强制 .cpu() 调用;Issue 作者认为这些调用可能可以移除,但并未给出确定结论。

验证方法

  • 观察控制台是否仍出现 Could not initialize NNPACK! 警告。
  • 对比同一提示词的执行耗时:修复前在原问题机器上为 183.66 秒量级,修复后 GPU 执行约 0.21 秒;Upscaler (SEGS) 由 10 分钟以上降到 90 秒以内。
  • PR 验证方式可作为参考:在 RTX 4080 上以 42 组 CPU/CUDA 用例覆盖执行设备检查、原设备恢复、与 CPU 结果比对,以及 SEGS 模糊节点下游的 NumPy 转换;修复后代码在配置为 CUDA 时使用 CUDA 执行。

参考来源

ltdrdata/ComfyUI-Impact-Pack #1171

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 31591

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注