1 .安装
- 更新conda
conda update conda - 先安装mkl
conda install mkl - faiss提供gpu和cpu版,根据服务选择
- cpu版本
conda install faiss-cpu -c pytorch - gpu版本 – 记得根据自己安装的cuda版本安装对应的faiss版本,不然会出异常。使用命令:nvcc -V 查看
conda install faiss-gpu cudatoolkit=8.0 -c pytorch # For CUDA8
conda install faiss-gpu cudatoolkit=9.0 -c pytorch # For CUDA9
conda install faiss-gpu cudatoolkit=10.0 -c pytorch # For CUDA10 - 校验是否安装成功
python -c “import faiss”
2.运行
2.1暴力查找(没有训练步骤)
为向量集构建IndexFlatL2索引,它是最简单的索引类型,执行强力L2距离搜索
vec = 200 # 词向量维度
index = faiss.IndexFlatL2(vec) # 构建FlatL2索引
index.add(np_kd_datas) # 添加训练样本
dist, ind = index.search(np.array(待查找词向量).astype('float32'), k=10)
dist:查找后前k个词向量与待查找词向量的距离
ind:查找后前k个词向量的位置索引
2.2建立索引,加快搜索速度
使用用K-means建立聚类中心,然后通过查询最近的聚类中心,然后比较聚类中的所有向量得到相似的向量。
vec = 200 # 词向量维度
n_list = 3 # 聚类中心的个数
# faiss定义了两种衡量相似度的方法(metrics),faiss.METRIC_L2-欧式距离 faiss.METRIC_INNER_PRODUCT-向量内积
index = faiss.IndexFlatL2(vec) # 创建索引作为量化器
index = faiss.IndexIVFFlat(index, vec, n_list, faiss.METRIC_L2)
index.train(np_kd_datas) # 训练样本
index.add(np_kd_datas) # 添加训练样本
dist, ind = index.search(np.array(待查找词向量).astype('float32'), k=10)
dist:查找后前k个词向量与待查找词向量的距离
ind:查找后前k个词向量的位置索引
2.3减少内存
IndexFlatL2和IndexIVFFlat都会全量存储所有的向量在内存中,为满足大的数据量的需求,faiss提供一种基于Product Quantizer(乘积量化)的压缩算法编码向量大小到指定的字节数。此时,存储的向量是压缩过的,查询的距离也是近似的。
vec = 200 # 词向量维度
m = 8 # number of bytes per vector
n_list = 3 # 聚类中心的个数
index = faiss.IndexFlatL2(vec) # 构建FlatL2索引
index = faiss.IndexIVFPQ(index, vec, n_list, m, 8) #8为每个向量压缩的字节大小
index.train(np_kd_datas) # 训练样本
index.add(np_kd_datas) # 添加训练样本
dist, ind = index.search(np.array(待查找词向量).astype('float32'), k=10)
dist:查找后前k个词向量与待查找词向量的距离
ind:查找后前k个词向量的位置索引
2.4简化索引
IndexIVFFlat和IndexIVFPQ的构造需要先提供另外一个index,faiss提供了通过字符串表达的方式构造索引。
vec = 200 # 词向量维度
n_list = 32 # 查找聚类中心的个数
index = faiss.index_factory(vec, " IVF200,Flat") # 构建字符串索引
index.train(np_kd_datas) # 训练样本
index.add(np_kd_datas) # 添加训练样本
index.nprobe = n_list
dist, ind = index.search(np.array(待查找词向量).astype('float32'), k=10)
dist:查找后前k个词向量与待查找词向量的距离
ind:查找后前k个词向量的位置索引