cuVS GPU支持
cuVS 概述
cuVS 提供了多种先进的近似最近邻(Approximate Nearest Neighbors)和聚类(Clustering)算法的GPU实现。cuVS的主要目标是简化在向量相似度检索(Vector Similarity Search)和聚类任务中使用GPU的流程。cuVS 构建于高性能机器学习基础库 RAPIDS RAFT 之上。
支持的索引类型
cuVS 已集成至 Faiss,用户可以根据需求,在受支持算法中选择经典实现或 cuVS 实现。GPU 索引类型如 GpuIndexFlat、GpuIndexIVFFlat 和 GpuIndexIVFPQ 均可采用 cuVS 版本。此外,基于图的 CAGRA 索引也被加入到 Faiss,可通过 GpuIndexCagra 索引类型在高召回率场景下获得更快的搜索速度。
CAGRA
CAGRA(即 (C)UDA (A)NN (GRA)ph-based),是一种全新的基于图的近似最近邻索引,通过 cuVS 支持,可直接在 Faiss 使用。CAGRA 基于知名的小世界可导航图(NSG, Navigable Small World Graph)算法,专门为GPU环境重新设计和优化。其工作原理为:首先构建训练数据的 kNN(k近邻)图,然后去除冗余的邻域连接,形成简化的扁平化图结构。
CAGRA 算法的基本步骤包括:
- 构建 kNN 图(k近邻图)
- 从 kNN 图中裁剪冗余路径
cuVS 在构建初始 kNN 图时,提供了 IVF-PQ(倒排文件-产品量化)和 NN-Descent(近邻下降)等多种策略。用户可在索引参数对象中自由选择。通过 Faiss 不仅能构建 cuVS CAGRA 索引,还能够序列化为 CPU 上的 HNSW(分层可导航小世界图)索引,从而有效提升 HNSW 索引构建阶段的GPU性能。相关细节将在后续章节展开。
CAGRA索引非常适合大规模、高召回率的场景,比如推荐系统、图像搜素和文本相似度查找等任务。
相比经典 Faiss GPU 索引的改进
- 对
GpuIndexIVFPQ(GPU倒排文件产品量化)参数设置更加灵活:- 用于表示向量的子量化器(subquantizer)个数不再局限于固定取值,只要小于等于原始维度即可。经典IVF-PQ索引最多支持96个子量化器。
- 当
GpuIndexIVFPQ的每个编码(code)为64字节或以上时,不再需要float16查找表处理残差距离。 - cuVS 支持每个编码的bit数在 [4, 8] 闭区间配置(即每个code的位宽可以是4到8),而经典 Faiss GPU IVFPQ 仅支持8比特。
- 集成RMM(RAPIDS Memory Manager,RAPIDS内存管理器),可以自动分配临时内存并进行内存池管理,让用户更轻松地控制内存分配方式。
- 性能优化:cuVS索引的构建速度有显著提升。
- 融入了如CAGRA这类高效的新算法,进一步丰富了算法选择。
RMM 可以帮助用户更高效地管理和复用GPU显存资源,降低内存碎片化问题。
限制说明
- cuVS索引暂不支持多GPU环境。
- 使用 cuVS 构建的
GpuIndexIVFPQ不支持预计算表(precomputed tables)。 - cuVS 索引下,
GpuIndexIVFPQ或GpuIndexIVFFlat不支持用reserveVecs预分配内存空间。 - IVF类型索引在已预分配质心的情况下,cuVS 索引不支持使用
searchPreassigned方法查找最近邻。 - cuVS 索引仅支持
indexes_64_BIT存储选项。 - 从源码构建Faiss(启用cuVS时)构建速度会比未启用时慢。
cuVS 目前不支持多GPU部分,可能无法满足超大规模数据的跨卡分布式查询需求。如需处理超大数据集,请关注官方未来的多GPU支持进展。