核心报错摘要
plaintext
MemoryError
aimdo: xfer_file_read: worker failed
HostBuffer.read_file_slice failed
这是 aimdo(ComfyUI 新内存卸载后端)读取模型分片文件失败,发生在 MiniMaxH3 动态 VRAM 加载过程。
日志:
Model MiniMaxH3 prepared for dynamic VRAM loading. 19995MB Staged,模型已经分阶段卸载到磁盘,采样阶段需要从磁盘读取权重分片,读文件直接失败抛出 MemoryError。
根因分类(按概率排序)
- aimdo 磁盘内存卸载(Dynamic VRAM)BUG / 兼容性问题:MiniMax‑H3 大模型开启动态分块加载,aimdo worker 读取权重分片失败,不是传统 CUDA OOM,是文件 IO / 内存映射层报错。
- 模型文件损坏、下载不完整,大分片 offset 读取失败
offset=16500285728 size=67108864。 - 磁盘空间不足、硬盘掉速、SSD 过热、磁盘 IO 压力过高。
- Windows 便携版 python_embeded 下 aimdo 原生库兼容性缺陷。
- 系统虚拟内存不足,aimdo 需要大量宿主内存做文件缓冲区。
修复方案,按顺序尝试
方案 1:关闭 aimdo 动态 VRAM(最高效,优先试)
aimdo 是 ComfyUI 新版低显存卸载后端,MiniMaxH3 对此兼容性差。
启动 ComfyUI 时增加环境变量,禁用 aimdo:
bat
set COMFYUI_DISABLE_AIMDO=1
便携版修改 run_nvidia_gpu.bat,在文件最开头加入:
bat
@echo off
set COMFYUI_DISABLE_AIMDO=1
然后重启 ComfyUI。
设置后会回退到老版 model_management 卸载逻辑,不再出现
aimdo、HostBuffer.read_file_slice相关报错;代价是宿主内存占用会升高。
方案 2:校验 MiniMax‑H3 模型文件完整性
报错出现巨大文件偏移量读取失败,极有可能模型分片损坏:
- 核对模型文件大小、哈希;重新下载损坏的权重文件。
- 不要使用断点续传得到的不完整 bin/safetensors。
错误日志
offset=16500285728 size=67108864,程序尝试读取文件十几 GB 偏移位置,文件实际长度不够就直接 worker 失败。
方案 3:系统层面调整
- 检查磁盘剩余空间:模型分阶段 staged 会在磁盘生成临时缓存,至少预留 30‑40GB 空闲。
- Windows 虚拟内存调大:系统设置 → 高级系统设置 → 高级 → 性能设置 → 高级 → 虚拟内存,设置系统托管或者手动设置 32GB 以上。aimdo 需要大量主机内存做文件缓冲。
- 如果是机械硬盘,不要跑这个模型;必须 SSD。SSD 如果温度过高降速也会触发该 worker 失败。
方案 4:调整 ComfyUI 显存策略,关闭动态预取
如果不想禁用 aimdo,修改模型加载策略:
- 模型加载设置:不使用动态 VRAM 预取(prefetch),关闭
model_prefetch预取队列。 - 降低
gpu_split,调高 cpu 内存卸载比例;不要开 force preload。 日志可见Force pre‑loaded 210 weights,强制预加载部分权重,可以关掉这个选项。
方案 5:版本降级 / 更新
- 更新 ComfyUI 到最新版本,aimdo 库
comfy‑aimdo还在快速迭代,部分版本对超大模型有 bug。 - 如果更新后报错依旧,就固定使用
COMFYUI_DISABLE_AIMDO=1,避开 aimdo。
补充说明堆栈解读
虽然很长一长串采样 traceback,采样代码本身没有 bug。
真正的错误源头在最上方:
plaintext
MemoryError
aimdo: src/xfer-file.c:118:ERROR:xfer_file_read: worker failed
HostBuffer.read_file_slice failed
后面一大段采样、unet forward 栈,仅仅是上层调用栈,是报错发生时正在运行的代码,不是故障根源。
现象表现:模型初始化进度 0/20,卡住一分钟左右直接崩溃,就是 aimdo 后台 worker 线程读取磁盘权重分片失败。
快速验证
加上 COMFYUI_DISABLE_AIMDO=1 启动,如果不再报aimdo、HostBuffer.read_file_slice,确认就是 aimdo 组件和 MiniMax‑H3 不兼容。
如果设置后报真正 CUDA out‑of‑memory,那就是物理显存不够,需要进一步调低分辨率、开启更多 CPU 卸载。