用途
Faiss 是一个用于高效相似度搜索和稠密向量聚类的库。它面向需要在大量向量中快速找到相似向量的场景,例如以 L2(欧氏)距离或点积衡量相似度的检索任务。项目由 Meta 基础人工智能研究团队主要开发。
主要能力
Faiss 假设实例以向量表示并由整数标识,向量之间可以用 L2 距离或点积比较。与查询向量相似的是 L2 距离最小或点积最大的向量。由于余弦相似度等价于归一化向量上的点积,Faiss 也支持该度量。
库中包含多种相似度搜索方法:
- 部分方法(如基于二进制向量和紧凑量化编码的方法)仅使用向量的压缩表示,不需要保留原始向量。这通常以精度下降为代价,但可在单台服务器的内存中扩展到数十亿向量。
- 其他方法(如 HNSW 和 NSG)在原始向量之上增加索引结构,使搜索更高效。
Faiss 还包含用于评估和参数调优的辅助代码。
使用方式
Faiss 以 C++ 编写,并提供完整的 Python/numpy 封装。部分最有用的算法在 GPU 上实现。GPU 实现可接受来自 CPU 或 GPU 内存的输入;在有 GPU 的服务器上,GPU 索引可以作为 CPU 索引的直接替代(例如用 GpuIndexFlatL2 替换 IndexFlatL2),GPU 内存的复制会自动处理。如果输入和输出都驻留在 GPU 上,结果会更快。支持单 GPU 和多 GPU 使用。
Faiss 为 Python 提供 Anaconda 预编译库,包括 faiss-cpu、faiss-gpu 和 faiss-gpu-cuvs。库主要用 C++ 实现,唯一依赖是 BLAS 实现。可选 GPU 支持通过 CUDA 或 AMD ROCm 提供,Python 接口也是可选的。NVIDIA cuVS 的后端 GPU 实现也可选择启用。项目使用 cmake 编译,详见 INSTALL.md。
工作原理
Faiss 围绕一种索引类型构建:该类型存储一组向量,并提供用 L2 和/或点积向量比较进行搜索的函数。部分索引类型是简单基线,例如精确搜索。大多数可用索引结构在以下方面存在不同权衡:
- 每个索引向量占用的内存
- 是否需要外部数据用于无监督训练
GPU 实现提供了高速的精确与近似(压缩域)高维向量最近邻搜索、Lloyd's k-means 以及小 k 选择算法。
文档与社区
完整文档位于 wiki 页面,包含教程、FAQ 和故障排查部分。doxygen 文档提供从代码注释中提取的按类信息。若要复现研究论文(如 Polysemous codes、Billion-scale similarity search with GPUs)的结果,可参考 benchmarks README;关于 Link and code: Fast indexing with graphs and compact regression codes,参见 link_and_code README。
公开讨论或提问可访问 GitHub Discussions,仓库也会关注 issues 页面以报告缺陷或提问。
主要作者
- Hervé Jégou 发起 Faiss 项目并编写了第一个实现
- Matthijs Douze 实现了大部分 CPU Faiss
- Jeff Johnson 实现了全部 GPU Faiss
- Lucas Hosseini 实现了二进制索引和构建系统
- Chengqi Deng 实现了 NSG、NNdescent 以及大量加性量化代码
- Alexandr Guzhva 进行了多项优化:SIMD、内存分配与布局、向量编解码器的快速解码内核等
- Gergely Szilvasy 负责构建系统与基准测试框架
许可
Faiss 采用 MIT 许可,详见顶层目录的 LICENSE 文件。版权所有 © Meta Platforms, Inc.。