简介: Faiss是Facebook AI团队开源的针对聚类和相似性搜索库,为稠密向量提供高效相似度搜索和聚类,支持十亿级别向量的搜索,是目前最为成熟的近似近邻搜索库。它包含多种搜索任意大小向量集(备注:向量集大小由RAM内存决定)的算法,以及用于算法评估和参数调整的支持代码。Faiss用C++编写,并提供与Numpy完美衔接的Python接口。除此以外,对一些核心算法提供了GPU实现。

应用场景: 人脸识别,以图搜图 …

作者: Facebook

1. 新建一个conda环境

这里新建一个conda环境,用于安装各个软件,并做相应的测试。

  1. 新建conda环境

conda create -n faiss python==3.7.7

  1. 安装faiss-cpu

官方给的安装方案pytorch源下的安装。但是这速度很慢,其次容易出现:Intel MKL FATAL ERROR: Cannot load libmkl_avx.so or libmkl_def.so。这里用清华的pytorch源

conda install faiss-cpu -c pytorch

  1. 用清华的pytorch源安装
source activate faiss
conda install faiss-cpu --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/

可能问题

  • Intel MKL FATAL ERROR: Cannot load libmkl_avx.so or libmkl_def.so

用清华源安装faiss-cpu

3. 测试

硬件

  • 用命令看cpu型号,cat /proc/cpuinfo
    Intel® Core™ i7-8700K CPU @ 3.70GHz

code

import faiss
import numpy as np 
import time

d = 64
nb = 100000
nq = 10000
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.

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)

k = 4                          # we want to see 4 nearest neighbors
start_t = time.time()
D, I = index.search(xb[[1,10,20,30,40]], k) # D:匹配的索引,I:D索引对应的L2距离
print("use time:",time.time() - start_t)
print(I)
print(D)

start_t = time.time()
D, I = index.search(xq, k)     # actual search
print("use time:",time.time() - start_t)
print(I[:5])                   # neighbors of the 5 first queries
print(I[-5:])                  # neighbors of the 5 last queries

True
100000
use time: 0.0044291019439697266
[[ 1 762 167 1115]
[ 10 819 522 388]
[ 20 319 754 50]
[ 30 553 628 707]
[ 40 91 736 692]]
[[0. 5.8098564 7.0517216 7.0524645]
[0. 5.7370405 6.1728783 6.3311534]
[0. 5.8789406 6.379945 6.4565234]
[0. 6.3657794 6.4845867 6.486966 ]
[0. 6.7513127 6.7710495 6.922102 ]]
use time: 0.803516149520874
[[710 724 700 707]
[ 4 39 643 516]
[ 13 358 618 169]
[290 264 424 37]
[463 790 401 356]]
[[ 9201 9618 9177 9079]
[ 9240 10550 9507 9225]
[ 9665 9903 9887 10331]
[ 9758 9663 10844 9799]
[ 9926 8750 9507 9940]]

解析

  • 看代码中的注释
  • 在10w的底库中,检索1w,才0.8s。

reference

  1. https://www.cnblogs.com/yhzhou/p/10568728.html
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐