论文状态:已完成

SPFresh: Incremental In-Place Update for Billion-Scale Vector Search

发表:2024/10/18
原文链接PDF 下载
价格:0.100000
价格:0.100000
价格:0.100000
已有 7 人读过
本分析由 AI 生成,可能不完全准确,请以原文为准。

TL;DR 精炼摘要

SPFresh提出了轻量级增量再平衡协议LIRE,实现十亿级向量索引的原地增量更新。该方法仅在分区边界局部调整向量分布,极大降低更新时资源开销与延迟,实验证明其在1%日更新率下,显著提升检索精度和响应速度,同时资源消耗远低于传统全局重建方法。

摘要

Approximate Nearest Neighbor Search (ANNS) is now widely used in various applications, ranging from information retrieval, question answering, and recommendation, to search for similar high-dimensional vectors. As the amount of vector data grows continuously, it becomes important to support updates to vector index, the enabling technique that allows for efficient and accurate ANNS on vectors. Because of the curse of high dimensionality, it is often costly to identify the right neighbors of a single new vector, a necessary process for index update. To amortize update costs, existing systems maintain a secondary index to accumulate updates, which are merged by the main index by global rebuilding the entire index periodically. However, this approach has high fluctuations of search latency and accuracy, not even to mention that it requires substantial resources and is extremely time-consuming for rebuilds. We introduce SPFresh, a system that supports in-place vector updates. At the heart of SPFresh is LIRE, a lightweight incremental rebalancing protocol to split vector partitions and reassign vectors in the nearby partitions to adapt to data distribution shift. LIRE achieves low-overhead vector updates by only reassigning vectors at the boundary between partitions, where in a high-quality vector index the amount of such vectors are deemed small. With LIRE, SPFresh provides superior query latency and accuracy to solutions based on global rebuild, with only 1% of DRAM and less than 10% cores needed at the peak compared to the state-of-the-art, in a billion scale vector index with 1% of daily vector update rate.

思维导图

论文精读

中文精读

1. 论文基本信息 (Bibliographic Information)

  • 标题 (Title): SPFresh: Incremental In-Place Update for Billion-Scale Vector Search (SPFresh:面向十亿级向量搜索的增量式原地更新)
  • 作者 (Authors): Yuming Xu, Hengyu Liang, Jin Li, Shuotao Xu, Qi Chen, Qianxi Zhang, Cheng Li, Ziyue Yang, Fan Yang, Yuqing Yang, Peng Cheng, Mao Yang
  • 隶属机构 (Affiliations): 中国科学技术大学 (University of Science and Technology of China), 微软亚洲研究院 (Microsoft Research Asia), 哈佛大学 (Harvard University)
  • 发表期刊/会议 (Journal/Conference): ACM SIGOPS 29th Symposium on Operating Systems Principles (SOSP '23)。SOSP 是操作系统领域的顶级学术会议,与 OSDI 并列,代表了该领域研究的最高水平,这表明该论文的质量和影响力都非常高。
  • 发表年份 (Publication Year): 2023
  • 摘要 (Abstract): 近似最近邻搜索 (ANNS) 已广泛应用于各种场景,但随着向量数据的持续增长,支持索引更新变得至关重要。现有系统为摊销更新成本,通常采用“日志结构合并”(LSM) 式的思路,将更新累积在辅助索引中,再通过定期的全局重建来合并,但这种方法会导致搜索延迟和精度的剧烈波动,且重建过程资源消耗巨大、耗时极长。本文提出了 SPFresh,一个支持原地更新的向量索引系统。其核心是 LIRE (Lightweight Incremental Rebalancing),一个轻量级的增量式再平衡协议。LIRE 通过在分区边界上仅重新分配少量向量,以低开销的方式适应数据分布的变化。实验表明,在十亿级规模、日更新率 1% 的场景下,SPFresh 相比现有技术,在提供更优查询延迟和精度的同时,峰值资源需求仅为后者的 1% 内存不足 10% 的核心
  • 原文链接 (Source Link):

2. 整体概括 (Executive Summary)

  • 研究背景与动机 (Background & Motivation - Why):

    • 核心问题: 在信息检索、推荐系统等应用中,海量高维向量数据的规模持续增长,需要频繁地对向量索引进行更新(增、删),以保证搜索结果的“新鲜度”。
    • 当前挑战 (Gap): 现有的向量索引更新方法主要是异地更新 (Out-of-place Update) 配合全局重建 (Global Rebuild)。这种方法将新的向量更新先缓存起来,然后定期将整个索引(包括旧数据和新数据)完全重新构建一次。这种方法的缺陷是:
      1. 资源消耗巨大: 全局重建需要极高的内存和 CPU 资源,且耗时漫长(数小时甚至数天)。
      2. 性能不稳定: 在两次重建之间,搜索请求需要查询主索引和辅助索引,导致延迟增加;重建期间,系统性能会急剧下降。
      3. 精度波动: 随着新数据的累积,索引质量会下降,直到下一次重建才能恢复。
    • 切入点/创新思路: 与其进行昂贵的全局重建,不如设计一种原地、增量式的更新机制。当索引的局部数据分布发生变化时,只对受影响的局部区域进行轻量级的调整,从而在维持索引高质量的同时,避免全局操作带来的巨大开销。
  • 核心贡献/主要发现 (Main Contribution/Findings - What):

    • 提出了 SPFresh 系统: 一个支持在十亿级数据集上进行高效、低成本原地更新的磁盘向量索引系统。
    • 设计了 LIRE 协议: 这是 SPFresh 的核心技术。LIRE (Lightweight Incremental REbalancing) 是一个轻量级的增量式再平衡协议,它定义了一套在分区(posting)分裂或合并后,如何智能地、小范围地重新分配向量,以保持索引整体质量的规则。
    • 实现了高效的系统架构: SPFresh 包含一个专门为 LIRE 协议设计的后台本地重建器 (Local Rebuilder) 和一个基于 SPDK 的高性能块控制器 (Block Controller),将更新的关键路径与耗时的平衡操作解耦,并绕过操作系统内核以实现极致的 I/O 性能。
    • 显著的性能优势: 实验证明,SPFresh 实现了低且稳定的搜索/更新延迟和高查询精度,同时资源消耗远低于基于全局重建的方案。

3. 预备知识与相关工作 (Prerequisite Knowledge & Related Work)

  • 基础概念 (Foundational Concepts):

    • 向量搜索 (Vector Search): 指在一个高维向量空间中,根据给定的查询向量,找到与其最相似的一个或多个向量的过程。相似度通常用欧氏距离或余弦相似度等度量。如下图所示,图像、文本等非结构化数据可被模型编码为向量,从而通过向量搜索实现语义相似的查找。

      Figure 1. An example of vector search: to find the most similar images in an image dataset. Query images and data images are all represented as vectors. 图1展示了向量搜索的基本流程:将查询图像和数据集中的图像都转换为高维向量,然后通过计算向量间的相似度来找到最相似的图像。

    • 近似最近邻搜索 (Approximate Nearest Neighbor Search, ANNS): 由于在海量高维数据中进行精确的最近邻搜索计算成本极高(即“维度灾难”),ANNS 是一种权衡了精度、延迟和资源成本的实用方法。它旨在尽可能快地找到足够接近真实最近邻的近似结果,而不是保证找到绝对的最近邻。

    • 向量索引 (Vector Index): 一种用于组织高维向量的数据结构,旨在加速 ANNS 过程。它通过建立向量之间的“快捷方式”(如构建图或进行空间划分)来避免对整个数据集的暴力扫描。

    • 基于图的索引 (Graph-based Index): 例如 HNSWDiskANN。这类索引将每个向量视为图中的一个节点,如果两个向量在空间中距离很近,则在它们之间连接一条边。搜索过程通过在图上进行贪心遍历来找到最近邻。

    • 基于聚类的索引 (Cluster-based Index): 例如 IVFSPANN。这类索引首先将向量空间划分为若干个区域(称为分区 partitionposting list),每个区域有一个中心点(centroid)。搜索时,先找到与查询向量最近的几个中心点,然后只在这些中心点对应的分区内进行精确搜索。

    • 原地更新 (In-place Update) vs. 异地更新 (Out-of-place Update):

      • 原地更新直接在原始数据结构上进行修改。例如,直接在一个分区中添加或删除向量。
      • 异地更新不修改原始数据,而是将更新记录在一个新的位置,通过后续的合并(merge)或重建(rebuild)过程来应用这些更新。这类似于 LSM-Tree 的工作方式。
  • 前人工作 (Previous Works):

    • 基于图的索引的更新问题:DiskANN,更新成本很高。插入一个新节点需要找到它在高维空间中的邻居并建立连接,这可能需要遍历图的大部分区域。删除节点同样复杂。因此,它们通常采用异地更新和全局重建。

    • 基于聚类的索引的更新问题:Vearch 和朴素的 SPANN 更新。虽然局部更新(在分区内增删)很简单,但随着更新累积,会导致:

      1. 分区大小不均: 影响搜索的尾部延迟。

      2. 数据分布漂移: 分区的中心点不再能很好地代表其内部的向量,导致搜索精度(recall)下降。 如下图所示,对 SPANN 进行简单的原地更新会导致精度下降和延迟剧增。

        Figure 2. Recall and tail latency in two system settings, namely, static and in-place update. The static setting refers to an index of 2 million vectors, while the in-place update setting refers to a… 图2显示,与静态构建的索引(static)相比,对一个已有索引进行简单的原地更新(in-place update)后,其搜索精度(Recall)下降,尾部延迟显著增加。

    • 全局重建方案: MilvusADBV 等主流系统都采用这种策略。虽然能保证索引质量,但其资源消耗和时间成本是巨大的。论文中的 Table 1 转录如下,清晰地展示了这一问题。

      转录 Table 1: 十亿级数据集上基于磁盘的 ANNS 索引的全局重建成本

      内存 (Memory) CPU 时间 (Time)
      DiskANN 1100 GB
      64 GB
      32 cores
      16 cores
      2 days
      5 days
      SPANN 260 GB 45 cores 4 days
  • 技术演进与差异化分析 (Technological Evolution & Differentiation):

    • 技术演进的脉络是:从不支持更新的静态索引,到通过全局重建支持更新的系统,再到本文提出的通过增量式本地再平衡来支持原地更新SPFresh
    • SPFresh 的核心创新在于,它用大量、廉价的“本地微调”取代了单一、昂贵的“全局重置”。它认识到,在高质量的聚类型索引中,大多数更新只会对局部区域产生影响,因此通过 LIRE 协议精确地定位并修复这些局部问题,是比全局重建更高效的路径。

4. 方法论 (Methodology - Core Technology & Implementation Details)

SPFresh 的核心是 LIRE 协议,它建立在 SPANN 索引的基础之上。

  • 方法原理 (Methodology Principles):

    • 基础索引 SPANN SPFresh 继承了 SPANN 的基本架构。SPANN 是一种平衡的聚类型索引,它将海量向量划分为大量大小均衡的分区(posting),并将分区的中心点(centroid)组织在内存中以便快速检索。

      Figure 3. SPANN index data architecture. 图3展示了 SPANN 的架构,内存中有一个用于快速导航的中心点索引,磁盘上存储着大量的向量分区(Posting Lists)。

    • 核心思想 LIRE LIRE 的核心思想是维护最近分区分配 (Nearest Partition Assignment, NPA) 属性,即每个向量都应该被分配到离它最近的中心点所在的分区。当更新破坏了这一属性时,LIRE 通过一系列本地操作(分裂、合并、重分配)来修复它。

  • 方法步骤与流程 (LIRE 协议): LIRE 协议包含五种基本操作:InsertDeleteSplitMergeReassign

    1. Insert & Delete 用户发起的插入请求直接将新向量追加到其最近的分区。删除操作则通过一个版本图(version map)标记向量为“已删除”,真正的物理删除被推迟到后续的再平衡阶段,以减少 I/O 开销。

    2. Split (分裂): 当一个分区的向量数量超过预设的上限时,触发分裂操作。该分区会被均匀地分裂成两个新的、更小的分区,并产生两个新的中心点。

    3. Merge (合并): 当一个分区的向量数量低于预设的下限时,触发合并操作。它会与其最近的分区合并成一个。

    4. Reassign (重分配): 这是 LIRE 最关键的操作。分裂或合并都会改变局部区域的中心点布局,从而可能破坏 NPA 属性。

      • 问题图解: 如下图所示,分区 AA 分裂为 A1A2 后,原先属于 AA 的黄色向量现在可能离邻居 BB 的中心点更近;而原先属于 BB 的绿色向量现在可能离新中心点 A2 更近。这两种情况都违反了 NPA

        Figure 4. Posting split violates the NPA property. 图4形象地说明了分裂操作如何导致向量归属关系错乱,破坏了索引的局部结构。

      • 重分配的必要条件: 为了避免对所有向量进行昂贵的检查,LIRE 提出了两个必要条件来筛选出可能需要重分配的向量候选集,从而大大缩小了检查范围:

        1. 对于原分裂分区中的向量 vv(例如图中的黄色向量),如果它离旧中心点 AoA_o 的距离比离两个新中心点 A1,A2A_1, A_2 都近,那么它就有可能需要被重分配。 D(v,Ao)D(v,Ai),i1,2 D ( v , A _ { o } ) \leq D ( v , A _ { i } ) , \forall i \in 1 , 2
        2. 对于邻近分区中的向量 vv(例如图中的绿色向量),如果它离某个新中心点 AiA_i 的距离比离旧中心点 AoA_o 还近,那么它就有可能需要被重分配。 D(v,Ai)D(v,Ao),i1,2 D ( v , A _ { i } ) \leq D ( v , A _ { o } ) , \exists i \in 1 , 2
      • 收敛性证明: 论文证明了 Split-Reassign 的级联过程必定会终止。因为每次分裂操作都会使中心点的总数加一,而中心点的总数不能超过向量总数,所以分裂次数是有限的。

  • 系统实现 (SPFresh Design and Implementation):

    Figure 5. SPFREsH architecture (LR means Local Rebuild). 图5展示了 SPFresh 的整体架构。用户更新请求由 In-place Updater 处理,当需要再平衡时,任务被发送到后台的 Local Rebuilder。所有磁盘操作由 Block Controller 负责。

    • In-place Updater (原地更新器): 负责处理前台的插入和删除请求,使用版本图来处理逻辑删除,并将分裂任务异步地提交给后台。
    • Local Rebuilder (本地重建器): 实现了 LIRE 协议的核心逻辑。它在后台线程中异步执行 splitmergereassign 任务,与前台的查询和更新请求解耦,避免阻塞关键路径。
    • Block Controller (块控制器): 一个为 SPFresh 定制的轻量级存储引擎。
      • 基于 SPDK 它使用 SPDK (Storage Performance Development Kit) 绕过操作系统内核,直接与 NVMe SSD 交互,以实现超低延迟和高吞吐量的 I/O。

      • 追加写优化: 对分区的更新采用仅追加 (Append-only) 的方式,只重写分区的最后一个数据块,极大地减少了写放大。

        Figure 6. SPFREsH storage overview. 图6展示了 Block Controller 的设计,包括内存中的块映射表、空闲块池和 I/O 请求队列,它高效地管理着 SSD 上的数据布局。

5. 实验设置 (Experimental Setup)

  • 数据集 (Datasets):

    • SIFT1B: 一个经典的图像特征向量数据集,包含 10 亿个 128 维向量。这是评估大规模 ANNS 性能的基准数据集。
  • 评估指标 (Evaluation Metrics):

    • RecallK@K (召回率):
      1. 概念定义: 该指标衡量 ANNS 算法返回结果的准确性。它计算的是:在查询真实的前 KK 个最近邻中,算法成功找到了多少个。Recall@10 值为 0.9 意味着算法返回的 10 个结果中,有 9 个是真正的 Top-10 最近邻。值越高,说明搜索结果越准确。
      2. 数学公式: RecallK@K=Y^GG \text{RecallK@K} = \frac{|\hat{Y} \cap G|}{|G|}
      3. 符号解释:
        • Y^\hat{Y}: 算法返回的近似 KK 个最近邻的集合。
        • GG: 数据集中真实的 KK 个最近邻的集合(即基准真相, Ground Truth)。
        • KK: 查询的最近邻数量。
    • 查询延迟 (Query Latency): 处理单个查询请求所需的时间,通常关注平均延迟和尾部延迟(如 P95, P99)。
    • 吞吐量 (Throughput): 系统每秒可以处理的查询或更新请求数量,单位是 QPS (Queries Per Second)。
    • 资源使用 (Resource Usage): 包括内存 (DRAM) 和 CPU 的使用情况。
  • 对比基线 (Baselines):

    • DiskANN: 当前最先进的基于图的磁盘 ANNS 索引之一,采用全局重建进行更新。
    • SPANN: 最先进的基于聚类的磁盘 ANNS 索引之一,同样依赖全局重建。

6. 实验结果与分析 (Results & Analysis)

  • 核心结果分析 (Core Results Analysis):

    Figure 7. SPFResH overall performance (SPACEV: data distribution shifts over time). 图7展示了在数据分布随时间变化的场景下,SPFresh 在插入吞吐量、精度、内存和延迟方面的综合表现。

    • 性能稳定性: SPFresh 的搜索延迟和精度(Recall)在持续更新的情况下保持高度稳定。相比之下,依赖全局重建的方案(未在图中直接展示,但可推断)会因更新累积而性能下降,并在重建时出现服务中断或性能剧降。
    • 资源效率: SPFresh 在整个运行期间的内存使用非常平稳且低廉(约 10GB)。而 DiskANN 的全局重建需要 1100GB 的峰值内存,SPANN 也需要 260GB,SPFresh 的资源优势极其明显。
    • 吞吐量与延迟: SPFresh 实现了高插入吞吐量,同时保持了比 DiskANN 更低的尾部搜索延迟。
  • 可扩展性与压力测试 (Scalability & Stress Tests):

    Figure 8. Search throughput/disk IOPS vs \(\\#\) of SPFRESH search threads on Azure lsv instance \[41\]. 图8显示,随着搜索线程数的增加,SPFresh 的搜索吞吐量(QPS)线性增长,直到达到 NVMe SSD 的 IOPS 瓶颈,证明了其良好的可扩展性。

    该图像是图表,展示了SPFresh在均匀数据集(SIFT)和偏态数据集(SPACV)压力测试下的延迟、吞吐量和IOPS性能指标表现,对比了不同批处理(日)条件下的搜索和插入性能。 图12展示了在混合读写负载下的压力测试结果。SPFresh 能够同时维持高搜索吞吐量和高更新吞吐量,且性能稳定,显示了其在真实生产环境中的强大能力。

  • 消融实验/参数分析 (Ablation Studies / Parameter Analysis):

    • LIRE 各组件的有效性:

      Figure 10. The trade-off on search accuracy and latency with various update techniques under an increasingly skewed data distribution. 图10(原文为Figure 10)是一个关键的消融研究,它显示了仅更新 (update only) 会导致性能严重下降;加入分裂 (split) 能缓解延迟问题但精度受损;而完整的 LIRE 策略(更新+分裂+重分配 reassign)则能在保持高精度的同时,实现低延迟。这证明了 reassign 操作对于维持索引质量至关重要。

    • Reassign 范围的影响:

      Figure 11. Parameter Study: Reassign Range, top64 (nearest 64 postings) is enough for reassign scanning. 图11(原文为Figure 11)探索了在执行重分配检查时需要考虑多少个邻近分区。实验表明,检查最近的 64 个分区(top64)就足以获得接近最优的精度,再增加范围带来的收益很小。这证实了 LIRE 的“轻量级”特性——平衡操作确实是局部的。

    • 线程数配置:

      Figure 12. Foreground Scalability (Background Thread Number \(= 1\) ) and Background Scalability (Foreground Thread Number \(= 8\) 图12(原文为Figure 12)分析了前台(更新)和后台(重建)线程数对性能的影响,为系统调优提供了指导。结果显示,增加前台线程能显著提升更新吞吐量,而后台线程数不需要很多(例如 1-2 个)就足以跟上更新的步伐。

7. 总结与思考 (Conclusion & Personal Thoughts)

  • 结论总结 (Conclusion Summary): 该论文成功地解决了一个在工业界极为重要且具有挑战性的问题:如何为十亿级大规模向量索引提供低成本、高性能、高新鲜度的更新能力SPFresh 通过其核心的 LIRE 协议,用一种轻量级的、增量式的、局部的再平衡机制,巧妙地替代了传统方案中昂贵、笨重的全局重建过程。这不仅带来了显著的资源节省(内存、CPU)和时间效率提升,更重要的是,它提供了稳定、可预测的服务质量(QoS),这对于在线服务至关重要。

  • 局限性与未来工作 (Limitations & Future Work):

    • 局限性:
      1. 该方法目前是基于 SPANN 这种聚类型索引设计的,其思想能否直接或经过改造后应用于基于图的索引(如 DiskANN)尚不明确。
      2. 虽然理论和实验都表明 LIRE 的级联效应是可控的,但在极端的数据分布或更新模式下,是否可能出现意料之外的长时间级联再平衡,仍需进一步验证。
      3. 系统的性能依赖于一些关键超参数(如分裂/合并阈值、重分配范围),这些参数的自适应调整可能是未来的一个优化方向。
    • 未来工作: 作者提出的未来方向可能包括将 LIRE 的思想推广到其他类型的索引,以及研究更智能的再平衡触发策略和参数自适应机制。
  • 个人启发与批判 (Personal Insights & Critique):

    • 启发:
      1. “局部化”是解决大规模系统瓶颈的钥匙。 SPFresh 的成功再次印证了这一经典思想。它将一个全局的、复杂的问题(索引维护)分解为许多局部的、简单的问题(分区再平衡),并高效地解决了它们。
      2. 软硬件协同设计的重要性。 SPFresh 并没有停留在算法层面,而是深入到系统实现,通过设计专门的存储引擎 Block Controller 并利用 SPDK 等底层技术,将算法的优势发挥到极致。这种全栈式的优化思路对于构建高性能系统非常有启发。
      3. “增量”优于“全量”。 在动态数据环境中,增量式处理通常比周期性的全量处理更具优势。SPFresh 的思想可以迁移到许多其他需要维护复杂数据结构的场景,例如图数据库的动态更新、搜索引擎倒排索引的实时构建等。
    • 批判性思考: 这篇论文的工作非常扎实,创新性和实用性都很强。如果一定要提出一点批判性思考,那就是该方案的复杂性相对较高。它引入了一套完整的后台再平衡机制和自定义存储引擎,这在工程实现和维护上会带来一定的成本。相比之下,全局重建虽然低效,但逻辑简单。在一些更新不频繁或对资源不敏感的小规模场景下,简单的全局重建可能仍然是性价比更高的选择。然而,对于论文所瞄准的“十亿级”、“高新鲜度”的大规模应用场景,SPFresh 提供的方案无疑是具有里程碑意义的。

相似论文推荐

基于向量语义检索推荐的相关论文。

暂时没有找到相似论文。