
Faiss 向量检索快速指南从第一次搜索到 GPU 加速的 5 个步骤【免费下载链接】faissA library for efficient similarity search and clustering of dense vectors.项目地址: https://gitcode.com/GitHub_Trending/fa/faiss你要在一千万个实体向量里找出和查询最接近的那几个暴力遍历太慢、全量向量又放不下内存——这就是 Faiss 要解决的向量检索问题。它是 Meta 开源的 C 库带完整的 Python 封装核心是一个索引把向量存进去用 L2 距离或点积搜出最近的邻居部分索引还能放到 GPU 上跑。它能替你做哪几件事你不需要记 Faiss 的全部索引类型只需要知道它围绕存向量、搜邻居干三类事搜邻居L2 距离、点积对归一化向量就是余弦相似度从精确的暴力搜索到各种近似搜索都有压缩存储用乘积量化PQ、标量量化SQ等编码代替原向量换来单机内存里装下十亿级向量的能力加速同一套 Python 接口索引可以直接搬到 GPU 上当作 CPU 索引的替换件用3 分钟装好 Faiss 并跑通第一次搜索 最省事的方式是 conda官方支持的安装途径见 INSTALL.mdconda install -c pytorch -c conda-forge faiss-cpu1.15.0想要源码编译命令是cmake -B build .然后make -C build -j faiss可选参数如-DFAISS_OPT_LEVELavx2开 SIMD 优化。装好后跑这段最小代码改编自 tutorial/python/1-Flat.pyimport numpy as np import faiss d, nb 64, 100000 # 维度、库大小 xb np.random.random((nb, d)).astype(float32) index faiss.IndexFlatL2(d) # 精确暴力搜索 index.add(xb) D, I index.search(xb[:5], 4) # 用库内前5个向量自搜 print(I, D)跑通后你应该看到I是 5×4 的索引矩阵每行第 0 列就是向量自己D对应位置是0.0。这个自搜距离为 0是最简单的正确性检查。如果想跑 C 侧的完整流程编译并运行 demos/demo_ivfpq_indexing.cppmake -C build demo_ivfpq_indexing ./build/demos/demo_ivfpq_indexingINSTALL.md 里给了参考耗时普通机器约 20 秒配了 Intel MKL 的 BLAS 约 2.5 秒。你大概率会碰到的三个任务把数据装进近似索引向量超过几十万就别用 Flat 了。IVFPQ 是典型选择先用 k-means 聚出nlist个簇再用乘积量化压缩每条向量教程里nlist100、m8即每个子向量 8 bit 编码quantizer faiss.IndexFlatL2(d) index faiss.IndexIVFPQ(quantizer, d, 100, 8, 8) index.train(xb) # 必须先训练 index.add(xb)注意 IVF 系索引add之前必须trainFlat 索引不需要。把同一套索引放到 GPU 上 ⚡装的是 faiss-gpu 包或源码开-DFAISS_ENABLE_GPUON时CPU 索引可以整体搬过去参考 tutorial/python/4-GPU.pyres faiss.StandardGpuResources() # 申请 GPU 资源 gpu_index faiss.index_cpu_to_gpu(res, 0, index) # 0 号卡 D, I gpu_index.search(xq, k) # 用法和 CPU 完全一致搬运 CPU/GPU 之间的数据由库自动处理单卡、多卡都支持。搜不准时怎么调两条最直接的路都在仓库里有现成脚本调nprobeIVF 索引默认nprobe1即每个查询只查 1 个最近的簇召回自然低。教程里把它调到 10代价是搜索时间随 nprobe 近似线性增长加精排层faiss.index_factory(d, PQ32x4fs,Refine(SQ8))先用压缩编码粗筛再用 SQ8 存的原向量重算距离tutorial/python/9-RefineComparison.py 里用IndexRefineSearchParameters(k_factor3.0)控制粗筛放大倍数并对比了 FP16 与 SQ8 两种精排存储的精度差异懒得手动试参的话demos/demo_auto_tune.py 会自动在IVF4096,Flat、IVF4096,PQ32等一组索引配置上扫参数、按召回率找最优点在 SIFT1M 数据集上跑结果图输出到tmp/目录。调参与踩坑关键取舍你的处境怎么选具体数字百万以内、精度优先IndexFlatL2精确搜索10 万条 64 维 float32 向量约 25MB内存毫无压力要省内存换IndexIVFPQm8时每条向量只占 8 字节约为 Flat 的 1/32召回不够调大nprobe从 1 提到 10精度上去了搜索耗时也线性上去向量装不进 RAM磁盘索引contrib/ondisk.py 用IO_FLAG_MMAP映射倒排列表总量可以超过内存CPU 距离计算慢开 SIMD MKL-DFAISS_OPT_LEVELavx2编译demo 耗时从 ~20s 降到 ~2.5s见 INSTALL.md一个容易忽略的点IndexFlatL2的距离是 L2平方不是开方后的欧氏距离跨系统对数值时要注意。延伸入门从 README.md 和 tutorial/python/ 目录的 9 个递进示例开始想复现论文里的基准数字看 benchs/README.md它对应Billion-scale similarity search with GPUs等论文的实验脚本。把nprobe和m摸熟之后大部分检索场景的参数问题你都能自己回答了。【免费下载链接】faissA library for efficient similarity search and clustering of dense vectors.项目地址: https://gitcode.com/GitHub_Trending/fa/faiss创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考