pip安装
直接使用pip安装pip install faiss
在python环境中import faiss会报错
使用如下的命令安装可以成功
pip –default-time=1000 install -i https://pypi.tuna.tsinghua.edu.cn/simple faiss-cpu
conda安装
只安装cpu版本
$ conda install -c pytorch faiss-cpu
安装gpu+cpu版本
$ conda install -c pytorch faiss-gpu
指定cuda版本
$ conda install -c pytorch faiss-gpu cudatoolkit=10.2 # for CUDA 10.2
faiss的简单使用
构建数据集
使用xb
矩阵建立索引,xb的每一行都是被检索的对象,维度是(nb,d)
。xq
矩阵,是用来检索的向量集合的矩阵,对其中的每个向量,需要找到它的前K个相似向量,维度是(nq,d)
。当只检索一个向量的时候,nq=1
。
import numpy as np
d = 64 # dimension
nb = 100000 # database size
nq = 10000 # nb of queries
np.random.seed(1234) # make reproducible
xb = np.random.random((nb, d)).astype('float32')
xb[:, 0] += np.arange(nb) / 1000.
xq = np.random.random((nq, d)).astype('float32')
xq[:, 0] += np.arange(nq) / 1000.
建立索引并加入向量
Faiss中有多种类型的索引,使用最简单的索引类型:IndexFlatL2,这是暴力检索L2距离,也就是最常规的计算距离的方式。对于大部分索引类型而言,在建立它们时都包含训练阶段,但是对于IndexFlatL2这个索引,可以跳过这一步。 当索引被建立和训练之后,可以调用add和search这两种方法。 还可以使用两种查找索引状态的方法 is_trianed,来表明索引是否已经被训练过。ntotal来得到当前索引中向量的个数。对于一些类型的索引来说,还可以存储每个向量对应的整数ID(IndexFlatL2不行),如果没有提供ID,那么索引就是的第一个向量索引为0,第二个向量索引为1,以此类推。
import faiss # make faiss available
index = faiss.IndexFlatL2(d) # build the index
print(index.is_trained)
index.add(xb) # add vectors to the index
print(index.ntotal)
- 第一个print的结果:True,已经经过训练,IndexFlatL2不需要训练,因此为True
- 第二个print的结果:10000,
xb
得维度是10000
检索
对于每个检索向量,都能从索引中得到前K近个向量。
k = 4 # we want to see 4 nearest neighbors
D, I = index.search(xb[:5], k) # sanity check
print(I)
print(D)
D, I = index.search(xq, k) # actual search
print(I[:5]) # neighbors of the 5 first queries