简介
论文题目:GRIP: Multi-Store Capacity-Optimized High-Performance Nearest Neighbor Search for Vector Search Engine,2019年发表在CIKM上,论文作者:Minjia Zha, Yuxiong He,单位:Microsoft AI and Research
GRIP中GRI表示Graph Routing Index,P表示本文对PQ优化时采用的PDV, 即Partial distance value。
主要内容
这篇论文首次研究内存(DRAM)-硬盘(SSD)混合存储下ANNS方案,提出的GRIP在系统效率上(包括搜索延迟和内存消耗两方面)提升了一个数量级,同时实现相当或更高的精度。
背景和动机
当前在ANNS上的研究大多假设整个数据集放在内存中,在这个假设下,如果数据超过一个单机的内存容量,一方面我们可以继续增大单机内存,另一方面我们可以扩展机器采用分布式部署,这两种堆硬件方式都不是内存有效的,会有非常高的成本。
本文考虑利用快速持久存储设备解决容量问题,当前,NVMe-based SSD在延迟和峰值带宽上取得显著提升,且成本接近传统Hard Disk Drive (HDD)。在容量上,SSD是TB级,而DRAM是GB级。在这样的背景下,研究DRAM-SSD混合存储下ANNS是非常有意义的。比如对于内存场景下当前最优导航图算法而言,它们普遍获得低延迟和高召回,然而他们的内存消耗过高,如果将这类方法直接放到SSD上,搜索延迟就会显著增加,因为在导航图上的搜索过程存在大量随机数据访问,这个过程在SSD上会更慢。
本文方法概述
索引
GRIP在DRAM中存向量压缩编码及聚类中心的导航图索引,在SSD上存原始向量。具体地,GRIP将原始向量通过基于PQ的方法压缩,大概是IVFPQ的一个变体,即先对向量聚类,IVFPQ扫描类中心是采用IVF的方式(即线性扫描),本文对类中心建一个HNSW索引,避免暴力线性扫描。本文在IVFPQ的PQ编码基础上有一个小优化,即预先计算一些与查询无关的距离分量,加速搜索时的计算。
搜索
对于给定的查询,GRIP先通过内存中的HNSW索引定位距离较近的一些类中心,然后在定位出的类中通过PQ距离获取距查询较近的一些候选结果,最后从SSD中读取这些候选结果的原始向量以重排候选结果,获取距查询最近的Top-K个结果。在从SSD上读原始向量过程,本文还根据SSD的异步和并行机制进行了优化。
一些细节
1. Challenges
(1) 内存-硬盘的性能差异;
从延迟角度。在DRAM上读几字节的数据需要约60ns,而HDD需要10ms。由于这一巨大的延迟差距,当前ANNS算法的关键假设是数据都放在内存中。最近,基于NVM(Non-Volatile Memory)的SSD实现了60 μ \mu μs的读延迟,这比HDD快1000倍。
从容量角度。DRAM的容量是GB级的,而SSD是TB级的。
从成本角度。DRAM成本是SSD的8倍。
如何利用SSD这一新的存储设备处理ANNS问题值得考虑。
(2) 导航图方法取得最佳延迟和精度权衡,但其非常耗内存,这要求机器有更大的内存容量或有更多的机器数量。直接将导航图算法配置在SSD上导致极高的查询延迟,因为在导航图上搜索存在大量随机数据读取;
(3) 压缩方法(比如PQ)在有限内存下能处理更多数据,但有精度“天花板”;
2. Opportunities
(1) 尽管压缩方法Top-K召回率较低,但如果我们提升召回的数量从K到R(R > K, 但不会比K过大),Top-K召回率将显著提升,下图的Figure 1(a)证实了这一点(采用的是IVFPQ算法)。
(2) 量化压缩方法(主要是IVFPQ)在优化查询延迟上面临一个窘境,查询延迟主要受第一层聚类个数的限制,而聚类个数过多和过少都会带来问题,过多会使 T S T_S TS过大,过少会使 T C T_C TC过大。Figure 1(b)是这两个时间随不同选中类数量个数变化。
(3) Figure 2表明,更大的聚类个数( N C NC NC)减少了在达到相同召回率下需要扫描的向量数。
3. Design Overview
抽象来说,GRIP包含两个阶段:
- preview stage: 一个适配内存的索引,使查询能快速定位候选结果;
- validation stage: 一个轻量级SSD访问机制,用原始向量验证选中的候选获取Top-K结果。
下图是GRIP的概览,DRAM中包含GRI导航图索引和优化的PQ编码(PQ基础上加了PDV),SSD上包含原始向量。
4. Algorithms and Optimizations
-
优化了HNSW索引弱连通性,比如在Deep10M数据集上对200K个质心构建的HNSW(出度为20)约900个顶点入度为0,这些入度为0的顶点是无法从其它顶点到达的。针对这个问题,本文通过对HNSW额外两轮遍历以挑战边,确保所有顶点都是可达的。
-
分析了通过PQ编码近似计算的各距离分量,预计算与查询无关的分量并保存为PDV。(好像FAISS库里面也做了这个事情)
-
因为验证候选并不需要顺序执行,这给利用SSD的并行机制提供可能。本文将候选列表划分为多个batch,然后从SSD中异步载入batch,一旦全精度向量载入DRAM,就会立即验证该候选。这样做有两个优点:(1) 并行载入数据更好利用带宽;(2) 高延迟的操作可以一定程度隐藏。
实验分析
ANNS Performance Comparison
与IVFPQ相比,内存消耗上略高于IVFPQ,原因应该是内存里面增加了导航图索引,且PQ上也附加了PDV;召回和延迟都碾压IVFPQ,应该主要是导航图和原始向量重排的功劳。
与HNSW相比,召回差不多情况下延迟普遍要高于HNSW,内存消耗要远低于HNSW。HNSW有一个值得关注的现象是,召回较高的情况下,继续增加efSearch
并能带来明显性能提升,这可能主要由于上面提到的一些入度为0的顶点导致的。
与L&C相比,在低召回下L&C比GRIP好,在高召回下GRIP显著优于L&C,且L&C内存消耗更大。
Effect of Different Components
GRI和PQ*部分的独立性能和联合性能如下图:
HNSW召回最近的 N s c a n N_{scan} Nscan个类的精度(与真实最近的 N s c a n N_{scan} Nscan个类对比)随着efS的增大而增加; N s c a n N_{scan} Nscan越大,精度越低。
下表表面一个较小的候选尺寸(R)就足够获取高的召回率。
与没有优化从SSD载入数据相比,异步并行优化后效率得到显著提升。
总结
内存导航一下还是挺有用的。