Nivdia向量数据库图检索最新标杆——CAGRA

nivdia,cagra · 浏览次数 : 0

小编点评

本文介绍了CAGRA,这是N社在RAFT项目中最新的ANN向量索引。CAGRA是一种高性能的、GPU加速的基于图的方法,特别适用于小批量情况。与其他基于图的方法(如HNSW、SONG等)相似,CAGRA在索引训练阶段构建了一个优化的k-最近邻(k-NN)图。CAGRA算法的特点包括:单层图结构、高并行度、高召回率以及满足GPU加速要求。 1. CAGRA构建了一个优化的k-NN图,以便在保持合理召回率的同时实现高效的搜索。 2. CAGRA算法采用单层图结构,为了满足GPU计算加速的要求,图的并行度和召回率都要高。 3. CAGRA在构建和查询阶段进行了特殊优化,以确保图中的所有节点都是相互可达的。 4. CAGRA通过计算强连通分量(Strong Connected Components, CC)的个数来评估图中任意节点之间的可达性。 5. CAGRA通过计算平均2跳节点数(Average 2-hop Node Count)来衡量在特定搜索迭代步骤中可以探索的节点数量。 6. CAGRA算法的构建训练过程包括初始化knn图和优化其中的边关系,使用IVF-PQ和NN-Descent算法进行优化。 7. CAGRA在查找阶段通过提高吞吐量来覆盖尽可能多的点,从而提高召回率和GPU利用率。 总之,CAGRA是一种高性能、GPU加速的基于图的方法,适用于小批量情况。通过构建优化的k-NN图和特殊优化,CAGRA在保持合理召回率的同时实现高效的搜索。

正文

本文连接:https://wanger-sjtu.github.io/CARGA/

CAGRA 是 N社在RAFT项目中 最新的 ANN 向量索引。这是一种高性能的、 GPU 加速的、基于图的方法,尤其是针对小批量情况进行了优化,其中每次查找只包含一个或几个查询向量。

与其他像HNSW、SONG等这类基于图的方法相似,CAGRA在索引训练阶段构建了一个经过优化的 k-最近邻(k-NN)图。这个图具备多种优良特性,能够在保持合理召回率的同时实现高效的搜索。与NSW、HNSW算法不同的是,CARGA算法是单层的图,为了适用GPU计算加速,在构建和查询阶段做了特殊的优化。

using namespace raft::neighbors;
// use default index parameters based on shape of the dataset
ivf_pq::index_params build_params =   ivf_pq::index_params::from_dataset(dataset);
ivf_pq::search_params search_params;
auto knn_graph      = raft::make_host_matrix<IdxT, IdxT>(dataset.extent(0), 128);

// create knn graph
cagra::build_knn_graph(res, dataset, knn_graph.view(), 2, build_params, search_params);
auto optimized_gaph = raft::make_host_matrix<IdxT, IdxT>(dataset.extent(0), 64);
cagra::optimize(res, dataset, knn_graph.view(), optimized_graph.view());
// Construct an index from dataset and optimized knn_graph

auto index = cagra::index<T, IdxT>(res, build_params.metric(), dataset,
                                   optimized_graph.view());

CAGRA构建的图有几个不同之处:

  • 每个节点有固定的出度
  • 构建的图是一个有向图
  • 不同于HNSW,CAGRA构建的图是单层的

构建

为了满足GPU加速的要求,并行度要高、且召回率也要准确,构建的图得满足:

  1. 任意节点间的遍历能力:这是为了确保图中的所有节点都是相互可达的。如果一个图中存在某些节点无法从其他节点访问,那么这些孤立的节点在搜索过程中将永远不会被考虑,这可能导致搜索结果的不完整或不准确。确保所有节点都是相互可达的,有助于提高搜索算法的覆盖率和准确性。

  2. 指定遍历次数内的节点访问数量:这个指标用来衡量从任一节点出发,在有限的步骤内能够探索到的节点的多样性和数量。在ANNS中,通常希望在较少的遍历步骤内能够访问到更多的节点,这样可以更快地找到可能的最近邻。如果一个节点在几步之内能够访问到很多其他节点,那么搜索算法的效率和召回率(即找到真正最近邻的概率)可能会更高。

所以就涉及到了图构建过程中的优化目标:

  • 强连通分量(Strong Connected Components, CC) 的个数
    通过计算图中的强连通分量数量来评估图中任意节点是否能够到达其他任意节点。强连通分量是图中的子图,其中每个节点都可以直接或间接地到达子图中的任何其他节点。

    A smaller number of strong CC are preferred because a larger number of CC can lead to more unreachable nodes starting from a search start node.

  • 平均 2 跳节点数(Average 2-hop Node Count)
    这个指标衡量的是从任一节点在两次遍历内能够到达的节点数量,用以评估在特定搜索迭代步骤中可以探索的节点数量。

构建过程

CAGRA算法的构建训练过程,先初始化一个knn graph,然后优化其中的边关系。

  1. 初始knn-graph创建:比较简单,这里实际上可以理论上依赖任何一种已有的算法,但在实现上选了IVF-PQ、和NN-Descent算法。这里就不过多展开了

    步骤一结束后,每个节点都有k个邻居节点,并且通常按距离排序

  2. 基于rank的重排序:这里每个节点出边按照初始rank重新排序,并且过滤掉一些边
    • 左侧:来自节点X及其他相关边的初始排名。

    • 中间:可能的两跳路径(XAB、XBC、XCD、XAC、XDC),根据方程3被分类为可绕路和不可绕路的。我们使用排名代替距离。

      \[\]

      \[\]

    • 右侧:连接到节点X的每个节点的可绕路路径数量。根据可绕路路径数量,从列表末尾开始丢弃边。

  3. 构建反向图
    同样的思路构建反向图。
  4. 融合两张图

查找

之前的HNSW一类算法之所以不能满足GPU计算主要原因就是并行度不够,很难去发挥GPU多线程计算的优势。CAGRA不同之处在于在构图的时候尽可能保证了任意两点的可达性,在查找的时候放弃了按照最近路径找到目标节点的优化思路,而是通过提高吞吐量来尽可能覆盖尽可能多的点来提高召回率和GPU利用率。

这里需要特别提一点就是这里的buffer。其实是两部分的,前半部分top-M的,我猜测是有序的,后半部是候选访问区,不必一定保证有序。

计算过程:

  1. 随机选取E个节点,计算他们与 query 的距离,并存在 candidate buffer 中
  2. 在 top-M buffer(这里应该是上一轮的结果,初始阶段为空) 和 candidate buffer 中选取 top M 个结果存储在 Top-M buffer中
  3. 在Top-M buffer中选取一个还没有被 traverse 的离 query 最近的节点
  4. 选取与 Step 3 中选择的节点近邻的E个没有访问的节点,并计算他们与query的距离,然后存储在 Candidate buffer 中
    一直计算到收敛(topM buffer全部是已访问状态)

参考:

  1. https://github.dev/facebookresearch/faiss
  2. https://arxiv.org/pdf/2308.15136
  3. kimi_chat

与Nivdia向量数据库图检索最新标杆——CAGRA相似的内容:

Nivdia向量数据库图检索最新标杆——CAGRA

本文连接:https://wanger-sjtu.github.io/CARGA/ CAGRA 是 N社在RAFT项目中 最新的 ANN 向量索引。这是一种高性能的、 GPU 加速的、基于图的方法,尤其是针对小批量情况进行了优化,其中每次查找只包含一个或几个查询向量。 与其他像HNSW、SONG等这

使用 TensorRT C++ API 调用GPU加速部署 YOLOv10 实现 500FPS 推理速度——快到飞起!!

NVIDIA ® TensorRT ™ 是一款用于高性能深度学习推理的 SDK,包含深度学习推理优化器和运行时,可为推理应用程序提供低延迟和高吞吐量。YOLOv10是清华大学研究人员近期提出的一种实时目标检测方法,通过消除NMS、优化模型架构和引入创新模块等策略,在保持高精度的同时显著降低了计算开销...

[转帖]NVIDIA超级AI服务器NVIDIA DGX GH200性能介绍

https://zhuanlan.zhihu.com/p/633219396 2023 年 5 月 28 日NVIDIA宣布推出 NVIDIA DGX GH200,这是首款 100 TB级别的GPU 内存系统。据英伟达称,Meta、微软和谷歌已经部署了这些集群,预计在 2023 年底之前全面上市。

LLM推理 - Nvidia TensorRT-LLM 与 Triton Inference Server

1. LLM部署-TensorRT-LLM与Triton 随着LLM越来越热门,LLM的推理服务也得到越来越多的关注与探索。在推理框架方面,tensorrt-llm是非常主流的开源框架,在Nvidia GPU上提供了多种优化,加速大语言模型的推理。但是,tensorrt-llm仅是一个推理框架,可以

使用Triton部署chatglm2-6b模型

一、技术介绍 NVIDIA Triton Inference Server是一个针对CPU和GPU进行优化的云端和推理的解决方案。 支持的模型类型包括TensorRT、TensorFlow、PyTorch(meta-llama/Llama-2-7b)、Python(chatglm)、ONNX Run

[转帖]Linux查看显卡型号

Linux查看显卡型号 https://blog.yelvlab.cn/archives/602/ 可以通过查看PCI设备来看显卡型号: lspci | grep -i nvidia c1:00.0 VGA compatible controller: NVIDIA Corporation Devi

CUDA C编程权威指南:1-基于CUDA的异构并行计算

什么是CUDA?CUDA(Compute Unified Device Architecture,统一计算设备架构)是NVIDIA(英伟达)提出的并行计算架构,结合了CPU和GPU的优点,主要用来处理密集型及并行计算。什么是异构计算?这里的异构主要指的是主机端的CPU和设备端的GPU,CPU更擅长逻

pytorch(GPU版)安装

确认有无英伟达显卡,有才能安装GPU版的pytorch,否则只能装CPU版 1.任务管理器->性能: 设备管理器->显示适配器,也可以: nvidia驱动安装地址(大部分电脑自带,不需要额外安装): https://www.nvidia.cn/Download/index.aspx?lang=cn

CUDA C编程权威指南:1.1-CUDA基础知识点梳理

主要整理了N多年前(2013年)学习CUDA的时候开始总结的知识点,好长时间不写CUDA代码了,现在LLM推理需要重新学习CUDA编程,看来出来混迟早要还的。 1.CUDA 解析:2007年,NVIDIA推出CUDA(Compute Unified Device Architecture,统一计算设

深入了解 GPU 互联技术——NVLINK

随着人工智能和图形处理需求的不断增长,多 GPU 并行计算已成为一种趋势。对于多 GPU 系统而言,一个关键的挑战是如何实现 GPU 之间的高速数据传输和协同工作。然而,传统的 PCIe 总线由于带宽限制和延迟问题,已无法满足 GPU 之间通信的需求。为了解决这个问题,NVIDIA 于 2018 年