跳到主要内容

cuVS GPU支持

cuVS 概述

cuVS 提供了多种先进的近似最近邻(Approximate Nearest Neighbors)和聚类(Clustering)算法的GPU实现。cuVS的主要目标是简化在向量相似度检索(Vector Similarity Search)和聚类任务中使用GPU的流程。cuVS 构建于高性能机器学习基础库 RAPIDS RAFT 之上。

支持的索引类型

cuVS 已集成至 Faiss,用户可以根据需求,在受支持算法中选择经典实现或 cuVS 实现。GPU 索引类型如 GpuIndexFlatGpuIndexIVFFlatGpuIndexIVFPQ 均可采用 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 算法的基本步骤包括:

  1. 构建 kNN 图(k近邻图)
  2. 从 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 索引下,GpuIndexIVFPQGpuIndexIVFFlat 不支持用 reserveVecs 预分配内存空间。
  • IVF类型索引在已预分配质心的情况下,cuVS 索引不支持使用 searchPreassigned 方法查找最近邻
  • cuVS 索引仅支持 indexes_64_BIT 存储选项
  • 从源码构建Faiss(启用cuVS时)构建速度会比未启用时慢
注意

cuVS 目前不支持多GPU部分,可能无法满足超大规模数据的跨卡分布式查询需求。如需处理超大数据集,请关注官方未来的多GPU支持进展。

参考文献和扩展阅读