ComfyUI MiniMaxH3 HostBuffer.read_file_slice failed + CUDA OOM 故障分析

17次阅读
没有评论

核心报错摘要

plaintext

[ERROR] aimdo: src/hostbuf.c:283:ERROR:hostbuf_read_file_slice: device copy failed result=2
RuntimeError: HostBuffer.read_file_slice failed
CUDA error: out of memory
Model MiniMaxH3 prepared for dynamic VRAM loading. 19995MB Staged.
  • 根因:MiniMax H3 使用 AIMDO 动态 VRAM 分块加载(dynamic VRAM loading),预调度要搬运 19995MB 权重,你的显卡显存不足以支撑模型 + 采样时中间张量,发生设备拷贝 OOM;HostBuffer.read_file_slice 是 OOM 之后的次级报错,不是根源,是显存耗尽后显存拷贝 API 直接失败。
  • 内存日志:GPU reserved 5984MiB,峰值 5603MiB,说明你的显卡总显存大约 6GB,而 H3 模型动态加载就预分配接近 20GB 的 staged 权重,6G 显存硬件不足以完整跑通。

注意:日志里CUDA OOMs:0是 PyTorch 统计,OOM 发生在aimdo hostbuf 底层 CUDA 拷贝,不在 PyTorch 分配器统计内,所以计数器为 0,属于 AIMDO 后端典型现象。

完整修复方案(按优先级从上到下尝试)

1. 降低模型动态加载预算,强制更激进的 VRAM 卸载(最关键)

MiniMaxH3 的 aimdo 动态加载会预申请很大 staged 缓冲区,6G 显卡扛不住 19995MB staged。

启动 ComfyUI 时增加环境变量,修改 run_nvidia_gpu.bat,在 python 之前加入:

bat

set AIMDO_MAX_GPU_MEM=4096
set AIMDO_DISABLE_ASYNC_PREFETCH=1
set COMFYUI_VRAM_MODE=GPU_ONLY

AIMDO_MAX_GPU_MEM=4096:限制 AIMDO 最多使用 4G 显存,强制更多权重留在系统内存,减少 GPU 侧同时驻留块;

AIMDO_DISABLE_ASYNC_PREFETCH=1:关闭异步预取,避免后台偷偷往 GPU 塞权重导致瞬间爆显存,代价速度变慢。

修改后完整 bat 片段示例:

bat

@echo off
set AIMDO_MAX_GPU_MEM=4096
set AIMDO_DISABLE_ASYNC_PREFETCH=1
set COMFYUI_VRAM_MODE=GPU_ONLY
python main.py
pause

保存,完全关闭现有 ComfyUI 进程,重新双击 bat 启动

2. ComfyUI 模型内存策略设置

WebUI 设置 → Settings → Memory

  1. 模型加载策略:CPU fallback / Normal不要选Speed(更多VRAM)
  2. 勾选:Always offload from GPU after generating
  3. gpu vram reserve预留调大到 1024MB
  4. 关闭:Enable fast model prefetch(这个就是 aimdo 异步预取,和上面环境变量对应) 保存设置,重启 ComfyUI。

3. 降低生成分辨率 & batch size

你虽然模型是动态加载,但采样阶段 latent、cond、controlnet 中间张量依然吃显存

  • 分辨率:优先不要超过 1024×1024;6G 卡建议 768‑768 以内测试
  • batch size=1,不要做多图 batch;关闭任何 ControlNet、IP‑Adapter 先做最小复现测试。

4. 系统层面:增大 Windows 虚拟内存

AIMDO 动态加载大量依赖系统 RAM 做权重缓冲:

  1. Win 设置 → 系统 → 高级系统设置 → 高级 → 性能设置 → 高级 → 虚拟内存更改
  2. 取消自动管理;给 SSD 盘设置自定义大小:初始 16384,最大 32768(16‑32G)
  3. 设置后重启电脑。

必须 SSD,机械硬盘会极慢甚至 IO 报错。

5. 排查冲突:ComfyUI‑llama‑cpp 干扰

日志末尾:

plaintext

File "ComfyUI‑llama‑cpp\nodes.py", line 296, in patched_unload_all_models

ComfyUI‑llama‑cpp打补丁劫持了模型卸载逻辑,OOM 崩溃清理阶段会二次调用 cuda 同步,加重报错。

  • 临时测试:把 custom_nodes/ComfyUI‑llama‑cpp改名备份,重启 ComfyUI 跑 H3 工作流,确认是否改善。

很多 H3 + llama‑cpp 共存场景会出现卸载逻辑冲突。

6. 降级备选:关闭 AIMDO 动态 VRAM(会非常吃内存)

如果上面依旧报错,直接禁用 aimdo 动态加载,全部走 Comfy 原生 CPU‑GPU 卸载:

bat

set AIMDO_DISABLE=1

副作用:加载模型极慢,需要很大系统内存(32G+),但可以绕开 hostbuf 拷贝代码路径。

调试手段,定位问题

在 bat 增加调试环境变量,复现问题看详细 aimdo 日志:

bat

set CUDA_LAUNCH_BLOCKING=1
set AIMDO_LOG_LEVEL=debug

CUDA_LAUNCH_BLOCKING=1 会把异步 CUDA 错误变成同步,报错栈会精准定位是哪一步拷贝 OOM,用于进一步排查。

硬件现实说明

MiniMax H3 完整权重动态加载 staged 就需要接近 20GB 缓冲,6GB 物理显存属于硬件下限,很难跑高分辨率,会频繁触发 hostbuf 拷贝失败 OOM

  • 稳定运行建议显卡 ≥12GB VRAM;6G 显卡只能小分辨率 + 关闭预取 + 严格限制 aimdo 显存上限使用。

排错顺序总结

  1. 修改 bat 加入 AIMDO_MAX_GPU_MEM=4096 + AIMDO_DISABLE_ASYNC_PREFETCH=1,重启 ComfyUI
  2. ComfyUI 设置关闭 fast model prefetch,预留 1024MB vram
  3. 测试小分辨率 768×768,不加载 ControlNet/IP‑Adapter
  4. 增大 SSD 虚拟内存 16‑32G,重启电脑
  5. 临时移除 ComfyUI‑llama‑cpp custom node 做排除测试
  6. 依旧失败:设置AIMDO_DISABLE=1绕开 aimdo 后端
正文完
可以使用微信扫码关注公众号(ID:xzluomor)
post-qrcode
 0
评论(没有评论)
验证码