ComfyUI显存故障定位与修复指南
一、快速自检与定位
- 先用nvidia-smi观察显存占用与波动:运行命令 watch -n 1 nvidia-smi --query-gpu=memory.used,memory.total --format=csv,noheader,nounits;若显存占用在多次运行后持续攀升,多半是显存泄漏或缓存未释放。
- 区分报错类型:
- CUDA out of memory(OOM):显存不足或分配失败。
- 采样器错误/非法内存访问:常见于依赖/插件版本不匹配、驱动或CUDA问题。
- 做最小化复现:用默认工作流仅加载SD1.5/SDXL跑一张小图;若正常,再逐步加入LoRA/IPAdapter/ControlNet/视频模型,定位触发点。
- 更新与一致性检查:升级到最新版 ComfyUI;确认NVIDIA 驱动、CUDA、PyTorch版本匹配(如驱动≥535.113、CUDA 11.8/12.0;PyTorch 2.1.x 对应 cu118/cu121)。必要时用 pip show torch 检查实际安装的 CUDA 版本。
二、立即缓解显存占用
- 启动参数与运行策略:
- 显存紧张时优先使用--lowvram;大多数场景可用--fp16降低显存占用。
- 降低分辨率/步数/批量,关闭不必要的高分辨率修复/放大节点。
- 内存分配与碎片控制:
- 在启动脚本或环境里设置:
- os.environ["PYTORCH_CUDA_ALLOC_CONF"] = "max_split_size_mb:128"
- torch.backends.cudnn.benchmark = False
- torch.cuda.set_per_process_memory_fraction(0.9)
- 在关键节点后主动清理:
- torch.cuda.empty_cache(); torch.cuda.ipc_collect(); gc.collect()
- 工作流层面优化:
- 对IPAdapter/Clip Vision/FaceID等“只在前处理用”的模型,采用预计算嵌入并保存,用时直接加载,避免重复占用显存。
- 分阶段执行:先生成中间结果写盘,再加载后续模块,减少同时驻留的模型数量。
三、插件与依赖导致的异常
- 排查插件/自定义节点:某些节点在多轮运行后会造成显存泄漏或内存溢出。做法:暂时移除或禁用非必要插件,用默认节点验证;定位到问题节点后再单独处理或更新。
- 版本匹配与重装:
- 确保PyTorch、torchvision、transformers、diffusers与当前CUDA版本匹配;必要时重装:pip install torch==2.1.0+cu118 torchvision==0.16.0+cu118 torchaudio==2.1.0 --extra-index-url https://download.pytorch.org/whl/cu118(或 cu121 对应版本)。
- 若环境修复失败或依赖混乱,进入 ComfyUI 目录执行:python/python.exe -m pip install -r requirements.txt;必要时 pip cache purge && pip install -U pip。
- 驱动与CUDA一致性:升级NVIDIA 驱动≥535.113;用 nvcc --version 与 torch 输出的 CUDA 版本交叉核对,避免“驱动与工具链不一致”。
四、进阶诊断与长期优化
- 精准定位错误:设置环境变量CUDA_LAUNCH_BLOCKING=1与TORCH_USE_CUDA_DSA=1,可捕获更精确的 CUDA 报错位置(仅在排查时开启,会显著降低性能)。
- 监控与分析:
- 持续用 nvidia-smi 观察显存曲线;
- 使用PyTorch Profiler定位高显存占用算子与阶段,针对性优化或拆分工作流。
- 量化与混合精度:
- 优先尝试--fp16;显存吃紧时用--lowvram触发更激进的INT8量化;复杂场景可对UNet等重点组件做混合精度,兼顾质量与显存。
- 视频/多模型场景:
- 采用块交换(Block Swap)/CPU卸载策略(如将部分模型块交换到 CPU 内存),并降低分辨率/帧数/批量;必要时分阶段处理与中间结果落盘。