Faiss学习
Faiss
Faiss是一个高效的相似搜索和密集向量聚类库。它包含了搜索任意大小的向量集合的算法,其中包括那些可能不适合RAM的向量。它还包含用于评估和参数调优的支持代码。Faiss是用c++编写的,带有针对Python/numpy的完整包装器。一些最有用的算法是在GPU上实现的。它是由Facebook人工智能研究公司开发的。
Introduction
Faiss包含了几种相似搜索方法。它假设实例用向量表示,并用一个整数标识,并且这些向量可以与L2(欧几里得)距离或点积进行比较。与查询向量相似的向量是那些与查询向量有最低L2距离或最高点积的向量。它还支持余弦相似度,因为这是规范化向量的点积。
大多数方法,如基于二进制矢量和紧凑型量化码的方法,只使用矢量的压缩表示,不需要保持原始矢量。这通常是以不太精确的搜索为代价的,但这些方法可以在单个服务器的主存中扩展到数十亿个向量。
GPU实现可以接受来自CPU或GPU内存的输入。在一个有GPU的服务器上,GPU索引可以用来替代CPU索引(例如,将IndexFlatL2替换为GpuIndexFlatL2),并自动处理从GPU内存的复制。然而,如果输入和输出都留在GPU上,结果会更快。支持单gpu和多gpu使用。
Building
这个库主要是用c++实现的,通过CUDA提供了可选的GPU支持,以及一个可选的Python接口。CPU版本需要BLAS库。它可以用Makefile编译,也可以打包到docker映像中。See INSTALL.md for details.
How Faiss works
Faiss是围绕一个索引类型构建的,该索引类型存储了一组向量,并提供了一个函数来使用L2和/或点积向量比较在其中进行搜索。有些索引类型是简单的基线,如精确搜索。大多数可用的索引结构对应于关于
- search time
- search quality
- memory used per index vector
- training time
- need for external data for unsupervised training
的各种权衡。
可选的GPU实现提供了可能是(截至2017年3月)最快的精确和近似(压缩域)最近邻搜索实现高维向量,最快的Lloyd's k-means,以及已知最快的小k选择算法。这里详细介绍了实现。
Full documentation of Faiss
The following are entry points for documentation:
- the full documentation, including a tutorial, a FAQ and a troubleshooting section can be found on the wiki page
- the doxygen documentation gives per-class information
- to reproduce results from our research papers, Polysemous codes and Billion-scale similarity search with GPUs, refer to the benchmarks README. For Link and code: Fast indexing with graphs and compact regression codes, see the link_and_code README