Cluster vocabulary caches for old embedding models are never pruned (~5 MB each, forever)

该问题出现在使用 InvokeAI 的图像索引(image index)功能、并多次切换 image_index_model (CLIP Vision 等嵌入模型)的场景中:每个曾经配置过的嵌入模型都会在 databases 目录留下一个约 5 MB 的 cluster_vocab_<model_t

快速结论:该问题出现在使用 InvokeAI 的图像索引(image index)功能、并多次切换 image_index_model(CLIP Vision 等嵌入模型)的场景中:每个曾经配置过的嵌入模型都会在 databases 目录留下一个约 5 MB 的 cluster_vocab_<model_tag>.npz 文件,即使模型已被卸载也不会被清理。优先检查 databases 目录下的 cluster_vocab_*.npz 是否随模型切换持续堆积。

适用环境:Issue 中确认的测试环境为 Windows、Python 3.12、CPU/测试环境(未声明 GPU 与 CUDA 版本)。涉及代码位于 invokeai/app/services/image_index/image_index_default.py::_build_vocab_embeddings 与 start() / _launch_worker() 中的清理逻辑。

最快修复方案:Issue 中的解决方案为在 fork 上实现并通过测试的补丁(commit 5d1c313864),尚未确认并入上游正式版本。因此面向原版用户的“暂无确认的一步修复方案”;如需修复,可优先尝试升级到包含该清理逻辑的版本,或参考该补丁自行处理。

注意事项:不要手工用宽泛的 glob 直接删除 databases 目录下的文件,因为标签存在 [:24] 截断,且可能有并发实例正在写入 .tmp.npz 暂存文件;Issue 也明确提到清理需排除暂存文件、符号链接和目录。Windows 下符号链接相关行为未被执行验证,不能作为已确认结论。

问题场景

用户在 InvokeAI 中启用图像索引功能,将 image_index_model 设置为某个 CLIP Vision 模型并等待词表构建,会生成 cluster_vocab_<tagA>.npz;随后切换为另一个模型并重启,会再生成 cluster_vocab_<tagB>.npz。卸载旧模型后,旧文件仍长期保留在 databases 目录中。此前因文件名 bug 缓存实际未持久化,问题不明显;修复持久化后,文件开始真实累积。

报错原文

Cluster vocabulary caches for old embedding models are never pruned (~5 MB each, forever)
cluster_vocab_<model_tag>.npz
Observed: cluster_vocab_<tagA>.npz remains indefinitely.
Expected: it is removed alongside the embeddings that were dropped for the same model.

原因分析

主要原因:_build_vocab_embeddings 按模型写入 cluster_vocab_{model_tag}.npz 缓存,但 start() 中只通过 delete_embeddings_for_other_models 清理数据库中不再使用模型的嵌入记录,没有对应的文件清理逻辑。databases 目录中也没有其他代码按 glob 扫描这些文件,因此孤儿文件不会引发错误,只持续占用磁盘。按真实文件测算,一个缓存约 5.1 MB((1675, 768) float32 矩阵加指纹),每个曾配置的嵌入模型都会永久保留一份。

此外,model_tag 由 self._model_id.replace(":", "_")[:24] 生成,截断导致标签有损;清理时必须以截断后的标签比较,而不能用完整模型 ID。

环境排查

  • 确认 InvokeAI 版本是否已包含 Issue 中提到的缓存持久化修复(否则可能观察不到文件累积)。
  • 确认 image_index_model 当前配置及历史切换过的嵌入模型。
  • 查看 InvokeAI 配置中的 db_path,检查其父目录(databases 目录)下是否存在多个 cluster_vocab_*.npz。
  • 确认是否有多个 InvokeAI 实例并发运行,避免误删其他实例的 .tmp.npz 暂存文件。
  • Windows 环境下如需验证符号链接行为,注意权限限制(Issue 中 WinError1314 导致符号链接测试跳过)。

解决步骤

  1. 先确认问题范围:在 databases 目录中列出 cluster_vocab_*.npz,对照当前 image_index_model 的截断标签,识别非当前模型的陈旧缓存。
  2. 可优先尝试升级到包含该清理补丁的 InvokeAI 版本;目前该实现位于 fork 的 commit 5d1c313864,上游采纳情况需以发布说明为准。
  3. 若需自行参考实现:扩展 _launch_worker() 中与嵌入退役并行的清理逻辑,覆盖启动和运行时编码器激活/替换场景。
  4. 清理范围应仅限当前规范化的 24 字符截断标签对应的 bundled/custom 归档之外的文件,并排除两代暂存文件名、符号链接、目录及其他命名空间。
  5. 将删除操作做成 best-effort:逐文件隔离失败,单个文件无法删除不应中断扫描或索引启动。
  6. 手工清理仅作为临时手段:先停止 InvokeAI,按截断标签精确核对后删除陈旧 .npz,切勿匹配 .tmp.npz 或使用宽泛通配符。

验证方法

保持当前 image_index_model 不变并重启 InvokeAI,databases 目录中应仅保留当前模型的 cluster_vocab_*.npz,旧模型对应的文件被删除;图像索引功能仍可正常构建和运行。Issue 中的测试结果为:pytest tests/app/services/image_index -q -n 0 为 236 passed、1 skipped,相关清理用例 6 passed、1 skipped,可作为回归验证参考。

参考来源

invoke-ai/InvokeAI #9625

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 31625

发表回复

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