Faiss相关

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个词向量的位置索引

猜你喜欢

转载自blog.csdn.net/qq_38574975/article/details/109323070