faiss下载及安装。
官网:https://github.com/facebookresearch/faiss/blob/main/INSTALL.md
清华镜像:https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/linux-64/
代码如下:
import numpy as np
import faiss # make faiss available
d = 64 # dimension
nb = 100 # database size
nq = 10 # nb of queries
np.random.seed(1234) # make reproducible
#numpy [nb, d]
xb = np.random.random((nb, d)).astype('float32') # train
#numpy [nq, d]
xq = np.random.random((nq, d)).astype('float32') # query
# 也可以自己创建numpy数据
X = np.array([[0.1,-0.1],
[-0.2,-0.1],
[-0.3,-0.1],
[0.1,0.1],
[0.2,0.1],
[0.3,0.2]
])
Xtype = X.dtype # float64
X = X.astype('float32') # 将转为float32
#建立数据后
, 将维度d输入, 得到索引index
index = faiss.IndexFlatL2(d) # build the index 暴力检索, 欧氏距离.
print(index.is_trained)
#将train数据添加到索X引index中
index.add(xb) # add vectors to the index
print(index.ntotal)
#对query数据进行搜索得到D和I.
k = 4 # we want to see 4 nearest neighbors
#[nq, k] 对query的每行找到k个相应的distance和index
D, I = index.search(xq, k) # actual search (距离, ID)
print(I[:5]) # 输出前5行
print(D[-5:]) # 输出后5行
使用faiss:
上述需要对X转为float32,否则会报错(TypeError: in method ‘IndexFlat_add’, argument 3 of type ‘float const *’),所以在定义train和query的时候要定义数据类型为float32.
另外,
加聚类(提升速度):
(IndexIVFFlat)
nlist = 3 # 聚类质心
quantizer = faiss.IndexFlatL2(d) # IndexFlatL2 & IndexFlatIP -> 欧式距离 & 内积搜索
index = faiss.IndexIVFFlat(quantizer, d, nlist, faiss.METRIC_L2)
assert not index.is_trained
index.train(xb)
assert index.is_trained
index.add(xb)
# METRIC_L2 & METRIC_INNER_PRODUCT -> 欧式距离 & 内积搜索
加聚类、加量化搜索(提升速度、有损压缩):
(IndexIVFPQ)
nlist = 3 # 聚类质心
m = 8 # 压缩到m维度
quantizer = faiss.IndexFlatL2(d) # IndexFlatL2 & IndexFlatIP -> 欧式距离 & 内积搜索
index = faiss.IndexIVFPQ(quantizer, d, nlist, m, 8)
index.train(xb)
index.add(xb)
直接进行检索:IndexFlatL2 和 IndexFlatIP 不需要index.train,可以直接index.add
IndexIVFFlat和IndexIVFPQ加了聚类之后需要index.trian后再index.add
quantizer是加入聚类后,使用的其他索引量化器,相当于近似。
1. module ‘faiss‘ has no attribute ‘StandardGpuResources‘
2. ModuleNotFoundError: No module named '_swigfaiss’
首先遇到问题1,按照参考6、7安装了faiss=1.6.3的版本,但是faiss-gpu的来源是unknown;然后运行代码遇到问题2。
然后根据参考8进行安装,但是没有安装成功;然后按照参考9进行安装,但是按照官网的方法:conda install -c conda-forge faiss-gpu
,faiss是1.4.0版本,因此还是会遇到问题1。
然后根据官网:
conda install -c pytorch/label/nightly faiss-gpu
两个命令的不同是:
conda install -c conda-forge faiss-gpu
(Installing from conda-forge)
conda install -c pytorch/label/nightly faiss-gpu
(Installing Faiss via conda)
参考: