Faiss+cuVS向量搜索实操:极速构建索引,效率暴增12倍!

咱们跨境圈的朋友们,大家可能都深有体会,随着业务越做越大,数据量也像雪球一样越滚越多。尤其是现在大语言模型(LLMs)应用越来越普及,海量的非结构化数据处理需求简直是指数级增长。想想看,咱们做RAG(检索增强生成)这种高级信息查找,面对几TB甚至PB级别的数据,过去可能要花上几个小时甚至几天才能搞定。而像广告推荐系统这种在线搜索应用,想要在CPU上实现即时响应,那得堆多少服务器、多少CPU?光是基础设施成本就让人头疼!
今天,咱们就来聊聊一个能彻底解决这些痛点,让你的数据处理能力和搜索速度实现质的飞跃的“秘密武器”——英伟达(NVIDIA)的cuVS技术,如何与Meta公司旗下的Faiss库深度融合。新媒网跨境获悉,cuVS借助GPU的强大算力,不仅能大幅加速向量搜索索引的构建,还能让实际搜索过程快如闪电。这不光能极大提升效率,降低成本,还能在CPU和GPU之间实现无缝衔接,灵活性十足。
接下来,我就手把手带大家深入了解:
- cuVS和Faiss强强联手的核心优势在哪里?
- cuVS到底在哪些环节能让向量搜索性能更上一层楼?
- GPU加速下的倒排索引(IVF)和图索引(Graph-based indexes)表现究竟如何?
- 实战演练!通过具体的代码示例,教你如何轻松搭建和搜索基于cuVS的Faiss索引。
1. cuVS与Faiss深度融合,优势究竟在哪?
无论你是需要每秒查询数百万个向量,还是处理大规模的多模态嵌入,亦或是用GPU构建巨型索引,cuVS与Faiss的结合都能彻底释放性能潜力,带来前所未有的灵活性。具体来说,它能帮你实现:
- 索引构建速度飞跃: 在保证95%召回率的前提下,GPU上构建索引的速度最高可提升12倍!
- 搜索延迟大幅降低: 同样是95%的召回率,搜索延迟最高能降低8倍!
- CPU-GPU无缝切换: 索引可以在GPU和CPU环境之间轻松迁移,灵活匹配你的部署需求。
(1)Faiss库里的GPU加速新纪元
Faiss作为向量搜索领域的老牌劲旅,在学术研究和生产环境中都备受青睐。它既能独立使用,也能与PyTorch集成,甚至还能嵌入到像RocksDB、OpenSearch和Milvus这样的向量数据库中。早在2018年,Faiss就率先引入了GPU支持,并在此后不断发展。到了2021年外媒NeurIPS大会上的大型ANN基准测试竞赛,英伟达(NVIDIA)凭借其GPU加速算法一举夺魁,这些先进方法后来都贡献给了Faiss,并最终演变成了咱们现在用的开源cuVS库。
从Faiss v1.10.0版本开始,用户就可以选择启用cuVS,来享受更强大的倒排索引算法,比如IVF-PQ、IVF-Flat、Flat(也就是暴力搜索),以及专为GPU从零开始打造的高性能图索引——CAGRA(Cuda Anns GRAph-based)。
(2)CPU-GPU无忧互操作,这是咱们跨境人的大福音!
通过cuVS加速Faiss中的GPU索引,咱们解锁了CPU和GPU之间全新的互操作性。这意味着什么呢?你可以在GPU上快速构建索引,然后轻松将其部署到CPU上进行搜索!这对于咱们跨境从业者来说,简直是太实用了——既能享受GPU构建索引的极速体验,又能沿用现有的CPU搜索架构,控制成本。整个过程在Faiss库里就能无缝完成,根本不用操心。
举个例子,HNSW(Hierarchical Navigable Small-World)索引在CPU上构建速度是出了名的慢,尤其是数据量大的时候,可能要花上好几个小时甚至几天。而CAGRA索引呢?构建速度最高能快12倍!更厉害的是,这些CAGRA图索引可以在Faiss中直接转换为HNSW格式,然后部署到CPU上进行搜索,性能依然可圈可点。新媒网跨境认为,这种CPU-GPU的灵活切换,对于我们跨境人来说,简直是太实用了,既快又省!
2. Faiss结合cuVS,实战跑分怎么样?
为了让大家看得更明白,咱们来看看Faiss在启用和未启用cuVS两种情况下的性能对比。测试是在英伟达H100 Tensor Core GPU和英特尔(Intel)至强铂金8480CL CPU上进行的,用了两个典型数据集:
- Deep100M: 来自Deep1B数据集的一个子集,包含1亿个向量(96维)。
- 外媒OpenAI文本嵌入: 包含500万个向量(1536维),来自text-embedding-ada-002模型。
重点关注了三个指标:
- 索引构建时间: 索引搭得有多快?
- 单查询延迟(在线搜索): 一个请求过来,多久能出结果?
- 大批量吞吐量(离线搜索): 大规模任务,每秒能处理多少查询?
要知道,非结构化数据增长速度非常惊人,所以索引构建性能的提升至关重要。但是,光看构建时间没意义,还得结合搜索性能和最终模型的质量。因此,测试团队设计了专门的索引构建基准测试方法,具体细节大家可以参考cuVS的官方文档。
除了搜索性能和质量,咱们还要确保比较是在最佳参数设置下进行的,这就要用到Pareto曲线。本文中所有关于延迟和吞吐量的加速比,都是在95%召回率这个基准上进行比较的,这样才公平公正。
(1)倒排索引(IVF):cuVS与Faiss经典GPU实现对比
首先,我们对比了IVF索引家族中的IVF-Flat和IVF-PQ,看看Faiss经典的GPU实现和新加入cuVS支持的变体有何不同。
- 构建时间: 使用cuVS后,IVF-PQ和IVF-Flat的构建速度最高提升了4.7倍(图1)。
- 延迟: 对于IVF-PQ,搜索延迟最高降低了8倍;对于IVF-Flat,搜索延迟更是降低了90%(图1)!
- 吞吐量: 对于大批量搜索任务,cuVS在两个数据集上都将IVF-PQ的吞吐量提高了3倍(图2),而IVF-Flat的性能也能保持一致。这意味着,对于高并发、大规模离线搜索场景,cuVS简直是神来之笔。
在线延迟表现
图1a和图1b展示了不同IVF索引变体的在线搜索延迟和构建时间。可以看到,与Faiss经典GPU实现相比,cuVS始终能够更快地构建索引,并显著降低搜索延迟,无论是图像数据还是文本数据,表现都非常出色。

批量(离线)吞吐量表现
图2展示了不同IVF索引变体的批量吞吐量。cuVS显著提升了批量处理性能,在图像和文本嵌入数据上每秒处理的查询量都远超以往。

这些提升可不是凭空而来,它背后是更优秀的GPU聚类算法(比如平衡K-means)、更丰富的参数支持(比如IVF-PQ有了更多的子量化器),以及代码层面的深度优化。
(2)图索引: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大幅加速了索引构建,并显著降低了在线查询延迟——在Deep100M数据集上,搜索速度比CPU HNSW快了4.7倍!

批量(离线)吞吐量表现
图4展示了GPU CAGRA与CPU HNSW的批量吞吐量。在批量场景下,CAGRA实现了极高的吞吐量——每秒处理数百万次查询,在两个数据集上都超越了基于CPU的HNSW。

3. Faiss集成cuVS,咱们怎么上手?
这一节,我给大家简单介绍一下如何安装支持cuVS的Faiss,并提供一些Python代码示例,手把手教你创建和搜索索引。
(1)安装指引
你可以选择从源码构建支持cuVS的Faiss,也可以直接使用预构建的Conda包,非常方便:
# Conda安装方式 (支持CUDA 12.4)
conda install -c rapidsai -c conda-forge -c nvidia pytorch::faiss-gpu-cuvs 'cuda-version>=12.0,<=12.9'
如果你想尝鲜最新的版本,也可以安装每夜构建(nightly build)的cuVS版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'
(2)内存管理小技巧
为了提升性能,我强烈建议大家启用GPU内存池,可以参考下面这个代码片段来配置RMM:
import rmm
pool = rmm.mr.PoolMemoryResource(
rmm.mr.CudaMemoryResource(),
initial_pool_size=2**30
)
rmm.mr.set_current_device_resource(pool)
(3)用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') # 100万个96维的基向量
xq = np.random.random((10000, 96)).astype('float32') # 1万个96维的查询向量
xt = np.random.random((100000, 96)).astype('float32') # 10万个96维的训练向量
res = faiss.StandardGpuResources()
# 禁用默认的临时内存分配,因为咱们已经设置了RMM内存池。
res.noTempMemory()
# 场景1: 直接创建cuVS GPU索引
config = faiss.GpuIndexIVFPQConfig()
config.interleavedLayout = True
# 使用cuVS扩展的参数集,比如这里的bits per code = 6
index_gpu = faiss.GpuIndexIVFPQ(res, 96, 1024, 96, 6, faiss.METRIC_L2, config)
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) # 将CPU索引克隆到GPU
# 现在的cuVS索引会使用训练好的量化器作为其IVF中心点。
assert(index_gpu.is_trained)
index_gpu.add(xb) # 添加基向量
k = 10
D, I = index_gpu.search(xq, k) # 执行搜索,找到最相似的k个邻居
(4)构建一个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: 添加100万个向量到索引
n = 1000000
data = np.random.random((n, 96)).astype('float32')
gpu_cagra_index.train(data) # 训练索引 (CAGRA通常不需要显式训练步骤,这里是添加数据)
gpu_cagra_index.add(data) # 将数据添加到索引中
# 步骤4: 搜索索引,为每个查询找到Top 10的邻居。
xq = np.random.random((10000, 96)).astype('float32')
D, I = gpu_cagra_index.search(xq,10) # 执行搜索
(5)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 # 初始化HNSW基础层,并关联CAGRA图。
gpu_cagra_index.copyTo(cpu_hnsw_index) # 将GPU CAGRA索引的内容复制到CPU HNSW索引中
# 添加新的向量到这个HNSW层次结构中。
newVecs = np.random.random((100000, 96)).astype('float32')
cpu_hnsw_index.add(newVecs) # 添加新向量
更完整的代码示例,大家可以去Faiss cuVS的官方notebook里看看。
4. 玩转你的向量数据,让效率飞起来!
英伟达(NVIDIA)cuVS与Faiss的深度融合,无疑给近似最近邻(ANN)搜索带来了里程碑式的性能和扩展性提升。无论是传统的倒排索引(IVF),还是先进的图索引方法,Faiss集成cuVS都能让你:
- 索引构建更快: GPU上最高可加速12倍!
- 搜索延迟更低: 实时搜索性能最高提升4.7倍!
- CPU-GPU协同无忧: 既可以在GPU上构建,也能在CPU上搜索,灵活部署!
同时,团队还推出了专为GPU打造的高性能图索引CAGRA,它在构建时间和吞吐量上都超越了传统的CPU HNSW。更棒的是,CAGRA图还能转换为HNSW格式,用于高效的CPU推理——这为混合部署提供了两全其美的解决方案。
对于咱们跨境从业者来说,无论是需要扩展搜索基础设施以应对每秒数百万次的查询,还是快速试验新的嵌入模型,Faiss与cuVS的结合都能助你一臂之力,让你更快行动、更智能迭代、更自信地部署。
还等什么呢?赶紧安装faiss-gpu-cuvs包,动手实践一下示例notebook吧!新媒网跨境预测,未来更多这样的技术融合将进一步赋能咱们的跨境业务,让出海之路更加顺畅高效。
新媒网(公号: 新媒网跨境发布),是一个专业的跨境电商、游戏、支付、贸易和广告社区平台,为百万跨境人传递最新的海外淘金精准资讯情报。
本文来源:新媒网 https://nmedialink.com/posts/faiss-cuvs-vector-search-12x-boost.html








粤公网安备 44011302004783号 














评论(0)