存储索引 - Aim数据如何被索引

背景

在使用Aim跟踪实验元数据时,每个运行都会在Aim仓库中创建独立的隔离空间。这种设计允许多个实验并发运行,无需额外设置负责数据写入同步的服务。当运行完成后,所有跟踪的数据都会被索引。我们将这一步骤称为运行最终化。当训练脚本因SIGTERM信号终止时,Aim会妥善处理,确保运行正确完成且数据被索引。但某些情况下,训练可能异常终止,导致数据未被索引。

过去的工作方式

由于数据块未被索引,这些数据块会保留在运行(runs)的独立存储中,但不会进入索引存储。这意味着查询必须打开多个文件来读取仓库数据。当失败的运行开始累积时,查询速度就会变慢。为了缓解这个问题,我们引入了aim reindex command命令。该命令会扫描aim仓库并索引所有停滞的运行。

自动索引

虽然aim reindex命令可以解决性能问题,但这不是最便捷的方式。诸如"我应该在什么时候运行aim reindex?"或"我应该多久运行一次aim reindex?"这类问题,都取决于实际的aim存储库和使用场景。因此,我们需要实现aim存储库索引的自动化处理。 每次运行aim up命令时,Aim会在启动web服务器的同时创建一个后台线程。该线程会检查未索引的运行记录并逐一进行重新索引。这种方式既能保持查询性能的高效,又不会长时间锁定索引存储。

结论

随着新的自动索引逻辑的启用,用户不再需要手动运行aim reindex命令。该命令仍保留用于需要一次性索引所有运行数据的情况。自动(隐式)和手动(显式)重新索引的结合确保了aim repo在长期使用场景中具有良好的性能,并提供良好的整体用户体验。