随着各机构收集的非结构化数据越来越多,并越来越多地使用大型语言模型(LLM),他们需要更快、更可扩展的系统。用于信息查找的高级工具,例如检索增强生成(RAG),处理海量数据可能需要数小时甚至数天——有时数据规模达到TB或PB级别。

与此同时,像广告推荐系统这样的在线搜索应用在CPU上难以提供即时结果。要满足实时速度要求,可能需要数千个CPU,从而增加了基础设施成本。

本文探讨了如何使用NVIDIA cuVS与某中心的Faiss库来解决这些挑战,以实现高效密集向量相似性搜索和聚类。cuVS利用GPU加速,极大地加快了搜索索引的创建过程和实际搜索过程。其结果是性能更快、成本更低、效率更高,同时保持了CPU和GPU之间的无缝兼容性。

具体来说,本文涵盖:

  • 集成cuVS和Faiss的优势
  • cuVS在何处以及如何改进向量搜索性能
  • 使用GPU加速的倒排文件索引(IVF)和基于图的索引的性能
  • 展示如何使用Faiss构建和搜索由cuVS驱动的索引的基准测试和Python代码示例

集成cuVS和Faiss有什么好处?

无论您每秒查询数百万个向量、处理大型多模态嵌入,还是使用GPU构建海量索引,cuVS与Faiss的集成都将开启性能与灵活性的新高度。

cuVS使您能够:

  • 在GPU上以95%召回率构建索引的速度提升高达12倍
  • 在95%召回率下实现搜索延迟降低高达8倍
  • 轻松地在GPU和CPU环境之间移动索引以满足部署需求

Faiss中的GPU加速

Faiss是研究和生产环境中广泛使用的向量搜索库。它支持独立使用、与PyTorch集成,以及嵌入到RocksDB、OpenSearch和Milvus等向量数据库中。

Faiss于2018年率先支持GPU,并自此不断发展。在NeurIPS 2021的big-ann-benchmarks竞赛中,某机构凭借GPU加速算法获得了第一名。这些方法后来被贡献给Faiss,并现已成为开源cuVS库的一部分。

自Faiss v1.10.0起,用户可以选择启用cuVS以使用增强版的倒排文件索引算法:IVF-PQ、IVF-Flat、Flat(也称为暴力搜索)和CAGRA——一种为GPU从头构建的高性能基于图索引。

轻松的CPU-GPU互操作性

通过cuVS加速Faiss中的GPU索引,开启了CPU-GPU互操作性的新水平。借助Faiss,您可以在GPU上构建索引,然后将其部署到CPU上。这使Faiss用户能够利用GPU加速索引构建,同时保持其CPU搜索架构。这一切都可以在Faiss库中无缝完成。

举例来说,分层导航小世界(HNSW)索引在CPU上构建速度极慢,尤其是在大规模时,可能需要几个小时甚至几天。另一方面,CAGRA索引的构建速度最多可快12倍。这些CAGRA图可以在Faiss中被格式化为HNSW索引,然后部署到CPU上进行搜索。

使用cuVS对Faiss进行基准测试

在以下两个数据集上进行了性能基准测试,比较启用和未启用cuVS的Faiss:

  • Deep100M:Deep1B数据集(96维)的100M向量子集。
  • OpenAI文本嵌入:来自text-embedding-ada-002模型的5M向量(1,536维)。

测试在某个机构的H100 Tensor Core GPU和某个机构的Xeon Platinum 8480CL CPU上运行。测量了以下指标:

  • 索引构建时间
  • 单查询延迟(在线搜索)
  • 大批量吞吐量(离线搜索)

由于非结构化数据的增长如此之快,索引构建性能的持续提升至关重要。然而,如果不考虑搜索性能和结果模型的质量,单独测量索引构建时间是没有意义的。因此,团队创建了自己的索引构建基准测试方法。更多详细信息,请参阅cuVS文档。

除了考虑搜索性能和质量,还需要根据最佳性能参数设置来比较模型。这通过使用帕累托曲线来确保每次比较都是公平的。在95%召回率水平下,比较各种索引的延迟和吞吐量加速比。

IVF:cuVS对比Faiss GPU经典版本

我们首先对IVF索引IVF-Flat和IVF-PQ进行基准测试,比较Faiss经典GPU实现与新的支持cuVS的Faiss变体:

  • 构建时间:使用cuVS构建IVF-PQ和IVF-Flat的速度最多提升4.7倍(图1)
  • 延迟:IVF-PQ的搜索延迟最多降低8倍,IVF-Flat降低90%(图1)
  • 吞吐量:cuVS将IVF-PQ在两个数据集上的大批量搜索吞吐量最多提升3倍(图2),同时保持IVF-Flat的吞吐量相当。这使其非常适合高容量和大型离线搜索工作负载。
在线延迟

图1a和1b显示了在线搜索延迟和跨IVF索引变体的构建时间。与经典Faiss相比,cuVS在两个数据集上持续提供更快的索引构建和显著更低的搜索延迟。

图1a. 对于Deep100M图像(100M x 96),在特定召回水平下最佳性能配置(最低在线延迟)的平均索引构建时间(左),以及单查询在线搜索在k=10时的搜索延迟帕累托前沿——越低越好(右)

图1b. 对于OpenAI文本嵌入,最佳性能配置的平均索引构建时间(左)和搜索延迟帕累托前沿——越低越好(右)

批量(离线)吞吐量

图2显示了跨IVF索引变体的批量吞吐量。cuVS提升了批处理性能,在图像和文本嵌入两个数据集上都显著增加了每秒服务的查询数。

图2. 包含10,000个查询的批次的搜索吞吐量,表示每秒服务的查询数(越高越好),针对Deep100M图像(左)和OpenAI文本嵌入(右)

这些改进源于更好的GPU聚类(例如,平衡的k-means)、扩展的参数支持(例如,IVF-PQ的更多子量化器)以及代码级优化。

基于图的索引:cuVS CAGRA对比Faiss HNSW(CPU)

CAGRA是一种GPU优化的、固定度数的平面图索引,与基于CPU的HNSW相比具有显著的性能优势,包括:

  • 构建时间:CAGRA构建速度最快提升12.3倍(图3)
  • 延迟:在线搜索速度最快提升4.7倍(Deep100M)(图3)
  • 吞吐量:在离线搜索场景中,CAGRA对于图像数据的吞吐量最多提升18倍,对于文本嵌入提升超过8倍(图4),这使其非常适合需要低延迟高容量推理的工作负载。

cuVS使CAGRA图能够直接转换为HNSW图,这允许图在GPU上构建得更快,同时在CPU上进行搜索,并具有相当的速度和质量。

在线延迟

图3a和3b显示了GPU CAGRA与CPU HNSW的在线延迟和构建时间。CAGRA极大地加速了索引构建并降低了在线查询延迟——与CPU上的HNSW相比,对于Deep100M的搜索速度最多提升4.7倍。

图3a. 对于Deep100M(100M x 96)的GPU CAGRA与CPU HNSW比较:跨召回水平的最佳性能配置的平均索引构建时间(左)和单查询搜索的搜索延迟帕累托前沿——越低越好(右)

图3b. 对于OpenAI文本嵌入(5M x 1,536)的GPU CAGRA与CPU HNSW比较:最佳性能配置的平均索引构建时间(左)和搜索延迟帕累托前沿——越低越好(右)

批量(离线)吞吐量

图4显示了GPU CAGRA与CPU HNSW的批量吞吐量。CAGRA在批量场景中实现了高吞吐量——每秒服务数百万个查询,并在两个数据集上都优于基于CPU的HNSW。

图4. 包含10,000个查询的批次的搜索吞吐量,表示每秒服务的查询数(越高越好),针对Deep100M图像(左)和OpenAI文本嵌入(右)

如何在Faiss中开始使用cuVS

本节简要介绍安装支持cuVS的Faiss的过程,并提供使用Python创建和搜索索引的简要代码示例。

安装

您可以使用预构建的Conda包或从源代码构建支持cuVS的Faiss:

# Conda安装(CUDA 12.4)
conda install -c rapidsai -c conda-forge -c nvidia pytorch::faiss-gpu-cuvs 'cuda-version>=12.0,<=12.9'

或者,您可以使用以下命令安装最新的cuVS-enabled Faiss包的每夜构建版本:

conda install -c rapidsai -c rapidsai-nightly -c conda-forge -c nvidia pytorch/label/nightly::faiss-gpu-cuvs 'cuda-version>=12.0,<=12.9'
内存管理

使用以下代码片段启用带有RMM的GPU内存池(推荐)。这种方法可以提高性能。

import rmm
pool = rmm.mr.PoolMemoryResource(
    rmm.mr.CudaMemoryResource(),
    initial_pool_size=2**30)
rmm.mr.set_current_device_resource(pool)
使用cuVS构建IVFPQ索引

安装faiss-gpu-cuvs包后,cuVS会自动用于支持的索引类型——无需更改代码即可受益于其性能改进。下面是一个使用cuVS后端创建IVFPQ索引的示例:

import faiss
import numpy as np

np.random.seed(1234)
xb = np.random.random((1000000, 96)).astype('float32')
xq = np.random.random((10000, 96)).astype('float32')
xt = np.random.random((100000, 96)).astype('float32')

res = faiss.StandardGpuResources()
# 禁用默认的临时内存分配,因为已经设置了RMM池资源。
res.noTempMemory()

# 案例1:创建cuVS GPU索引
config = faiss.GpuIndexIVFPQConfig()
config.interleavedLayout = True
index_gpu = faiss.GpuIndexIVFPQ(res, 96, 1024, 96, 6, faiss.METRIC_L2, config) # 使用cuVS扩展参数集(每码位数=6)。
index_gpu.train(xt)
index_gpu.add(xb)

# 案例2:将CPU索引克隆为cuVS GPU索引
quantizer = faiss.IndexFlatL2(96)
index_cpu = faiss.IndexIVFPQ(quantizer,96, 1024, 96, 8, faiss.METRIC_L2)
index_cpu.train(xt)
co = faiss.GpuClonerOptions()
index_gpu = faiss.index_cpu_to_gpu(res, 0, index_cpu, co)
# cuVS索引现在使用训练好的量化器作为其IVF质心。
assert(index_gpu.is_trained)
index_gpu.add(xb)
k = 10
D, I = index_gpu.search(xq, k)
构建cuVS CAGRA索引

以下示例演示了如何使用Faiss和cuVS加速来构建和查询CAGRA索引。

import faiss
import numpy as np

# 步骤1:创建CAGRA索引配置
config = faiss.GpuIndexCagraConfig()
config.graph_degree = 32
config.intermediate_graph_degree = 64

# 步骤2:初始化CAGRA索引
res = faiss.StandardGpuResources()
gpu_cagra_index = faiss.GpuIndexCagra(res, 96, faiss.METRIC_L2, config)

# 步骤3:向索引添加1M向量
n = 1000000
data = np.random.random((n, 96)).astype('float32')
gpu_cagra_index.train(data)

# 步骤4:搜索索引,为每个查询找到前10个邻居。
xq = np.random.random((10000, 96)).astype('float32')
D, I = gpu_cagra_index.search(xq,10)
将CAGRA转换为HNSW(用于CPU搜索)

CAGRA索引可以通过新的faiss.IndexHNSWCagra CPU类自动转换为HNSW格式,从而实现GPU加速的索引构建,随后进行基于CPU的搜索:

# 为96维向量创建HNSW索引对象。
M = 16
cpu_hnsw_index = faiss.IndexHNSWCagra(96, M, faiss.METRIC_L2)
cpu_hnsw_index.base_level_only=False

# 用CAGRA图初始化HNSW基础层。
gpu_cagra_index.copyTo(cpu_hnsw_index)

# 向层次结构添加新向量。
newVecs = np.random.random((100000, 96)).astype('float32')
cpu_hnsw_index.add(newVecs)

完整代码示例,请参阅Faiss cuVS notebook。

从您的向量中获取更多价值

将NVIDIA cuVS集成到Faiss中,为近似最近邻(ANN)搜索带来了速度和可扩展性的显著提升。无论您使用倒排文件(IVF)索引还是基于图的方法,Faiss与cuVS的集成都能提供:

  • 更快的索引构建:在GPU上加速高达12倍
  • 更低的搜索延迟:实时搜索提升高达4.7倍
  • 轻松的CPU-GPU互操作性:在GPU上构建,在CPU上搜索,反之亦然

团队还引入了CAGRA,一种为GPU从头构建的高性能基于图索引,它在构建时间和吞吐量上都优于传统的基于CPU的HNSW。更好的是,CAGRA图可以转换为HNSW,以实现高效的基于CPU的推理——为混合部署提供两全其美的方案。

无论您是在扩展搜索基础设施以处理每秒数百万个查询,还是在快速试验新的嵌入模型,将Faiss与cuVS集成都能为您提供更快行动、更智能迭代和更自信部署的工具。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)或者 我的个人博客 https://blog.qife122.com/
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐