在 2023 年的人工智能领域,向量搜索成为最热门的话题之一,因为它在大语言模型(LLM)和生成式人工智能中发挥了重要作用。语义向量搜索实现了一系列重要任务,如检测欺诈交易、向用户推荐产品、使用上下文信息增强全文搜索以及查找潜在安全风险的参与者。

数据量持续飙升,传统的逐一比较的方法在计算上变得不可行。向量搜索方法使用近似查找,这种查找更具可扩展性,可以更有效地处理大量数据。正如我们在这篇文章中所展示的,在 GPU 上加速向量搜索不仅提供了更快的搜索时间,而且索引构建时间也可以更快。

本文内容如下:

  • 向量搜索简介及流行应用综述
  • 在 GPU 上加速向量搜索的 RAFT 库综述
  • GPU 加速向量搜索索引与 CPU 上最新技术的性能比较

本系列的第二篇文章深入探讨了每一个 GPU 加速指数,并简要解释了算法的工作原理以及微调其行为的重要参数摘要。想要了解更多信息,请访问 加速向量搜索:微调 GPU 索引算法

什么是向量搜索?

Diagram shows a list of vectors that may have been encoded from sources like images, documents, or videos and a query vector for which you would like to find the closest vectors from the list.

图 1。向量搜索过程

图 1 显示了向量搜索需要创建一个向量索引,并执行查找以在索引中找到一些最接近查询向量的向量。向量可以小到激光雷达点云中的三维点,也可以是文本文档、图像或视频中的较大嵌入向量。

向量搜索是查询数据库以查找最相似向量的过程。这种相似性搜索是在可以表示任何类型对象的数字向量上进行的(图 2)。这些向量通常是从多媒体(如图像、视频和文本片段)或整个文档中创建的嵌入向量,这些文档经过深度学习模型将其语义特征编码为向量形式。

嵌入向量通常具有比原始文档更小的对象(维度更低)的优势,同时保持尽可能多的源信息。因此,两个相似的文档通常具有相似的嵌入向量。

Image of a 3D point cloud such as one created from LIDAR.

图 2:向量表示更高维度的数据点

图 2 中的点是 3D 的,但它们可能是 500 维甚至更高。

这使得比较对象更容易,因为嵌入向量更小,并且保留了大部分信息。当两个文档共享相似的特征时,它们的嵌入向量通常在空间上接近或相似。

向量搜索的近似方法

为了有效地处理较大的数据集,通常使用近似最近邻(ANN)方法进行向量搜索。神经网络方法通过逼近最接近的向量来加快搜索速度。这避免了精确暴力方法通常需要的穷举距离计算,该方法需要将查询与数据库中的每个向量进行比较。

除了搜索计算成本外,存储许多向量还可能消耗大量内存。为了确保快速搜索和低内存使用率,必须以高效的方式对向量进行索引。正如我们稍后所概述的,这有时可以从压缩中受益。向量索引是建立在数学模型上的一种空间有效的数据结构,用于一次有效地查询多个向量。

当索引需要数小时甚至数天才能建立时,更新索引(例如插入和删除向量)可能会导致问题。事实证明,这些索引通常可以在 GPU 上更快地构建。我们稍后将在帖子中展示这一表现。

LLM 中的向量搜索

LLM 由于捕捉和保存原始文档的语义和上下文而变得流行起来。这意味着可以使用向量相似性搜索。此搜索可查找恰好包含相似单词、形状或移动对象的项目。它还发现了在上下文和语义上意味着相似事物的向量。

这种语义搜索不依赖于精确的单词匹配。例如,在图像数据库中搜索术语“我想买一辆肌肉车”应该能够将句子置于上下文中,以理解以下内容:

  • 买车和租车不同,所以你希望找到更接近汽车经销商和购车者评论的载体,而不是租车公司。
  • 肌肉车不同于健美运动员,所以你会期望找到道奇充电器的向量,而不是阿诺德·施瓦辛格。
  • 购买肌肉车与购买肌肉放松剂或经济型汽车不同。

最近出现了基于大型语言 transformer 的模型,如NeMo和 BERT,它们提供了重大的技术飞跃,提高了模型的上下文意识,使其更加有用,适用于更多的行业。

除了创建可以存储和稍后搜索的嵌入向量外,这些新的 LLM 模型还在管道中使用语义搜索,这些管道从通过查找类似向量收集的上下文中生成新内容。如图 3 所示,这个内容生成过程称为检索增强了生成人工智能。

在向量数据库中使用向量搜索

向量数据库存储高维向量(例如,嵌入向量),并促进基于向量相似性的快速准确搜索和检索(例如,ANN 算法)。一些数据库是专门为向量搜索而构建的(例如 Milvus)。其他数据库包括向量搜索功能作为附加功能(例如 Redis)。

选择要使用的向量数据库取决于工作流的要求。

检索增强语言模型允许通过使用已由 LLM 编码为向量并存储在向量数据库中的附加上下文来增强搜索,从而为特定产品、服务或其他领域特定用例定制预训练的模型。

更具体地说,搜索被编码为向量形式,并且在向量数据库中找到相似的向量以增强搜索。然后将向量与 LLM 一起使用,以形成适当的响应。检索增强 LLM 是生成人工智能的一种形式,它们彻底改变了聊天机器人和语义文本搜索行业。

Workflow diagram shows how vector search is often combined with LLMs to perform semantic search.

图 3。使用 RAPIDS RAFT 进行向量搜索的文本检索应用程序的示例工作流程

向量相似性搜索的其他应用

除了用于生成人工智能的检索增强 LLM 之外,嵌入向量已经存在了一段时间,并在现实世界中发现了许多有用的应用:

  • 推荐系统:根据用户的兴趣或互动行为,提供个性化建议。
  • 财务:欺诈检测模型将用户交易向量化,从而可以确定这些交易是否与典型的欺诈活动相似。
  • 网络安全:使用嵌入向量对不良行为者和异常活动的行为进行建模和搜索。
  • 基因组学:在基因组学分析中,我们可以发现相似的基因和细胞结构,如单细胞 RNA 分析。
  • 化学:对化学结构的分子描述符或指纹进行建模,以便比较它们或在数据库中找到类似的结构。

RAPIDS RAFT 向量搜索库

RAFT 是一个可组合构建块库,用于加速 GPU 上的机器学习算法,例如最近邻居和向量搜索中使用的算法。ANN 算法是构成向量搜索库的核心构建块之一。最重要的是,这些算法可以极大地受益于 GPU 加速。

有关 RAFT 的核心 API 及其包含的各种加速构建块的更多信息,请参阅RAPIDS RAFT 中的机器学习和数据分析的可复用计算模式

用于快速搜索的ANN

除了精确搜索的暴力法(Brute-Force),RAFT 目前为 ANN 搜索提供了三种不同的算法:

算法的选择可能取决于您的需求,因为它们各自提供不同的优势。有时,暴力甚至是更好的选择。更多内容将在即将发布的版本中添加。

由于这些算法没有进行精确的搜索,可能会遗漏一些高度相似的向量。这个 recall 度量可以用于表示结果中有多少邻居是查询的实际最近邻居。我们的大多数基准都以 85% 及更高的召回率为目标,这意味着检索到 85%(或更多)的相关向量。

要针对不同的召回级别调整结果索引,请在训练近似近邻算法时使用各种设置或超参数。降低召回率通常会提高搜索速度,而提高召回则会降低搜索速度。这就是所谓的召回-速度权衡。

想要了解更多信息,请访问 加速向量搜索:微调 GPU 索引算法

性能比较

GPU 擅长一次处理大量数据。当一次计算数千或数万个点的最近邻居时,刚才提到的所有算法都可以优于 CPU 上的相应算法。

然而,CAGRA 是专门为在线搜索而设计的,这意味着即使一次只查询几个数据点的最近邻居,它的性能也优于 CPU 。

图 4 和图 5 显示了我们通过在 100M 向量上构建索引并一次只查询 10 个向量来执行的基准测试。在图 4 中,CAGRA 在原始搜索性能方面优于 HNSW,HNSW 是 CPU 上最受欢迎的向量搜索索引之一,即使是 10 个向量的极小批量。然而,这种速度是以内存为代价的。在图 5 中,可以看到 CAGRA 的GPU内存占用比其他近邻方法略高。

Bar chart compares throughput performance (queries per second) for RAFT’s GPU algorithms against HNSW on the CPU.

图 4。DEEP-100M 数据集上 95%召回率的向量搜索吞吐量,批量大小为 10

在图 5 中,IVF-PQ 的主机内存用于可选的细化步骤。

Bar chart compares memory usage for RAFT’s GPU algorithms against HNSW on the CPU.图 5。 GPU 内存使用情况

图 6 显示了索引构建时间的比较,并表明索引通常可以在 GPU 上更快地构建。

Bar chart compares index build time for RAFT’s GPU algorithms against HNSW on the CPU.

图 6。召回率为 95%时表现最好的索引的构建时间

总结

从特征库到生成人工智能,向量相似性搜索可以应用于每个行业。 GPU 上的向量搜索以较低的延迟执行,并为在线和批量处理的每一级调用实现更高的吞吐量。

RAFT 是一组可组合的构建块,可用于加速任何数据源中的向量搜索。它为 Python 和 C++预先构建了 API。Milvus、Redis 和 FAISS 的 RAFT 集成正在进行中。

:相关PR见reference连接)

除了最先进的 ANN 算法,RAFT 还包含了如矩阵和向量运算、迭代求解器和聚类算法等其他 GPU 加速构建块。在本系列的第二篇文章中,我们深入探讨了每种 GPU 加速索引方法,并简要解释了算法的工作原理,以及总结重要的微调参数。有关详细信息,请参阅 加速向量搜索:微调 GPU 索引算法

目的

  1. 了解RAPIDS RAFT中的三种不同算法:IVF-FlatIVF-PQCAGRA, 并且调用RAPIDS RAFT 向量搜索库的相关接口工程实践下;
  2. 借鉴RAPIDS RAFT 库在 Milvus、Redis 和 FAISS 中的集成;
  3. 将开源改吧改吧,结合业务场景,某种商业目的变成闭源,然后美其名曰自研,岂不“妙哉”;)
  4. 学废了,然后吐出来,当个搬运工,换个说法,看是否可以换些银子;

Reference

  1. https://developer.nvidia.com/blog/accelerating-vector-search-using-gpu-powered-indexes-with-rapids-raft/

  2. https://github.com/rapidsai/raft#what-is-raft

  3. https://github.com/RedisAI/VectorSimilarity/pull/413

  4. https://github.com/milvus-io/knowhere/pull/712

    https://github.com/milvus-io/knowhere/pull/953

  5. https://github.com/zilliztech/knowhere/pull/10

  6. https://github.com/facebookresearch/faiss/pull/2521

    https://github.com/facebookresearch/faiss/pull/2707

  7. https://github.com/facebookresearch/faiss/pull/3044