Files
windecay 4028c10945 feat(ram-cache): 优化执行器缓存检测逻辑,新增测试并更新文档
重构执行器缓存检测的核心逻辑,新增对新版_execute_async方法的检测支持;当无法获取源码时采用保守策略限制模式切换,避免空回调风险;新增完整的兼容性单元测试;更新中英文README文档补充相关说明。
2026-09-22 12:30:59 +08:00

145 lines
7.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
简体中文 | [English](./README.md)
# ComfyUI_Dynamic_RAMCache
一个ComfyUI的自定义节点,用于在工作流中控制RAM缓存对象、更新清理阈值,并触发主动内存清理。
## 功能特点
- **动态缓存模式控制**:支持在CLASSIC(无内存回收)和RAM_PRESSURE(自动内存清理)模式之间调整
- **智能内存管理**:在RAM_PRESSURE可用时清理 RAM 缓存,当内存不足时释放不必要的缓存数据
- **自定义清理阈值**:支持新版 `--cache-ram active inactive` 两个 RAM 阈值
- **缓存数据迁移**:在模式变化时保留现有缓存数据,减少重复计算
- **直观的节点接口**:简单易用的参数设置,适用于不同水平的用户
- **极限清理节点**:一次性强清理(包含虚拟内存占用)并自动恢复清理前的模式与阈值
## 安装方法
1. 确保已安装包含`RAMPressureCache`的ComfyUI版本(上游从2025-10-31开始提供)
2. 克隆或下载本仓库
3. 将`ComfyUI_Dynamic-RAMCache`文件夹复制到ComfyUI的`custom_nodes`目录下
4. 重启ComfyUI
## 使用方法
1. 在ComfyUI中,从`utils/dynamic_ramcache`类别中添加`DynamicRAMCacheControl`节点
2. 配置以下参数:
- **mode**:选择缓存模式(CLASSIC或RAM_PRESSURE)
- **cleanup_threshold**:设置 active cache 空闲内存阈值(GB)
- **inactive_threshold**:可选。设置 inactive cache / pinned memory 阈值(GB),填 `0` 或旧工作流缺少此项时沿用 ComfyUI 当前值
3. 可以选择性地连接任意输入到`any_input`端口(节点会透传此输入)
4. 可选:在工作流末尾添加`RAMCacheExtremeCleanup`节点,执行一次性清理并恢复之前状态
5. 运行工作流
## 参数说明
### mode(模式)
- **CLASSIC (No Eviction)**:传统缓存模式,不会自动清理缓存,可能导致内存使用持续增长
- **RAM_PRESSURE (Auto Purge)**:RAM_PRESSURE缓存模式。执行器以该模式开始时,每个节点后会自动清理;从CLASSIC开始时,本节点只在自身执行时主动清理
### cleanup_threshold(active 阈值)
- 类型:浮点数(0.1-256.0 GB)
- 默认值:2.0 GB
- 说明:对应新版 `--cache-ram` 的第一个值。可用内存低于此值时,RAM_PRESSURE模式会清理 active cache
### inactive_threshold(inactive 阈值)
- 类型:浮点数(0-256.0 GB)
- 默认值:0
- 说明:对应新版 `--cache-ram` 的第二个值。旧版 ComfyUI 不使用该参数时会自动忽略;`0` 表示不改 ComfyUI 当前值;大于 `0` 时会更新 inactive cache / pinned memory 阈值
### 极限清理参数
- **purge_threshold**:一次性清理时使用的临时阈值(默认 256.0 GB)
- **恢复行为**:自动恢复清理前的模式、active 阈值和 inactive 阈值
### 输出
- **output_passthrough**:如果连接了输入,则透传输入值;否则返回None
## 工作原理
该节点通过以下机制工作:
1. 检测ComfyUI的`PromptExecutor`实例
2. 根据所选模式在`RAMPressureCache`和`HierarchicalCache`之间切换
3. 在切换过程中保留现有的缓存数据
4. 当处于RAM_PRESSURE模式时,按 active / inactive 两个阈值处理缓存清理;执行器级别的每节点自动释放只在prompt开始前已经启用RAM_PRESSURE时生效
## 上游变更日期
- 2025-10-31:ComfyUI加入`RAMPressureCache`模式,提交`513b0c46`(Add RAM Pressure cache mode)
- 2026-04-29:`PromptExecutor.execute_async()`开始直接调用prompt开始时保存的`ram_release_callback`,提交`fce03984`(dynamicVRAM + --cache-ram 2)
- 2026-05-21:RAM cache成为默认缓存模式,并加入active/inactive双阈值,提交`5aa5ccc9`(Multi-threaded load of models from disk)
本节点的新版兼容处理主要针对2026-04-29之后的prompt-local RAM释放回调行为,以及2026-05-21之后默认启用RAM cache的行为。
## 新版ComfyUI行为说明
部分新版ComfyUI会在一个prompt开始时保存RAM释放回调。自定义节点是在prompt运行中执行的,这时再把执行器从CLASSIC改成RAM_PRESSURE,可能触发`NoneType object is not callable`。
为避免这个错误,节点会检测这种执行器实现:
- 同时检查 `execute_async()` 和新版的 `_execute_async()`;无法读取实现时,仍限制执行中切换模式,避免调用任务开始时为空的回调。
- 新版ComfyUI通常已经以RAM_PRESSURE/RAM cache模式开始,节点会保持这个状态,更新阈值,并保留每个节点执行后的自动清理行为
- 如果执行器以CLASSIC开始,节点会启用RAMPressureCache对象、迁移缓存并执行一次主动清理,但不会在当前prompt内改执行器模式
- 如果工作流请求CLASSIC,节点会在新版prompt-local回调实现中保留RAM_PRESSURE,避免把下一次prompt带入CLASSIC状态
- 需要完整的每节点自动清理时,请保持prompt开始前已经处于RAM_PRESSURE;如果你的ComfyUI版本不是默认RAM cache,再使用`--cache-ram`
## 兼容性要求
- **ComfyUI版本**:需要包含RAMPressureCache类的版本;新版和旧版`--cache-ram`参数形式都会处理
- **Python环境**:与ComfyUI兼容的Python环境
- **依赖**:使用ComfyUI内置的caching和execution模块
## 故障排除
### 常见问题
1. **"RAMPressureCache class not available"错误**
- 原因:使用的ComfyUI版本过低
- 解决方案:更新ComfyUI到2025.10.31或更高版本
2. **"Failed to import execution module"错误**
- 原因:ComfyUI的模块结构可能已更改
- 解决方案:检查ComfyUI版本,确认是否需要更新插件
3. **内存清理不生效**
- 原因:可能清理阈值设置过高,或当前prompt是从CLASSIC执行器模式开始
- 解决方案:尝试降低cleanup_threshold值;需要每个节点执行后的自动清理时,保持prompt开始前已经处于RAM_PRESSURE
4. **出现"executor mode kept as CLASSIC"警告**
- 原因:当前ComfyUI在prompt开始时保存RAM释放回调,节点避免在prompt运行中改变执行器模式
- 影响:节点仍会更新阈值、迁移缓存并执行主动清理,但当前prompt不会获得执行器级别的每节点自动释放
5. **出现"CLASSIC requested, RAM_PRESSURE kept active"警告**
- 原因:新版ComfyUI默认已经是RAM cache模式,节点忽略工作流里的CLASSIC切换请求,避免后续prompt从CLASSIC开始
- 影响:RAM cache继续启用;如果确实要关闭RAM cache,请在prompt外调整ComfyUI启动参数或全局设置
## 注意事项
- 在大型工作流中,过低的清理阈值可能导致频繁的缓存清理,反而降低性能
- 建议根据系统实际RAM大小调整清理阈值,一般建议设置为总内存的10-20%
- 首次使用RAM_PRESSURE模式时可能需要一些时间来初始化新的缓存系统
## 日志信息
该节点会在以下情况输出日志:
- 缓存模式变化
- 清理阈值更新
- 新版ComfyUI中保留CLASSIC执行器模式的兼容警告
- 错误和警告信息
日志可在ComfyUI的控制台或日志文件中查看,前缀为`[DynamicRAMCache]`
## 许可证
[MIT License](LICENSE)
## 贡献
欢迎提交问题报告和拉取请求!