1、安装组件
- gfortran:yum install gcc-gfortran,下载并安装;gfortran --version查看版本;
- OpenBLAS(基础线性代数子程序库),GitHub - OpenMathLib/OpenBLAS: OpenBLAS is an optimized BLAS library based on GotoBLAS2 1.13 BSD version.,so库复制到系统路径下;
- faiss,git clone GitHub - facebookresearch/faiss: A library for efficient similarity search and clustering of dense vectors.,./configure --without-cuda,make,复制so及h文件;
2、索引类型:
a、IndexFlatL2(精确索引):
- 精确索引通过遍历计算来查询向量与被查询向量的L2精确距离,在构建索引时需提供向量维数作为参数(不需要训练操作),构建完成后可以通过add添加数据和search查询数据;
b、IndexIVFFlat(倒排索引):
- 倒排索引需要对数据做预处理来提高索引效率,将数据库向量通过聚类方法分割成若干类,查询时选择距离最近的类中心,在类中采用精确方法查询,通过增加相邻类查询来提高精确度;
- nlist参数控制将数据集向量聚类的总数,nprobe参数控制在多少个类范围内进行查询,伴随nprobe参数值增加,精度值增加,同时时间开销增加,当nprobe=nlist时,与IndexFlatL2索引等效;
c、IndexIVFPQ(乘积量化索引):
- 当数据量非常大超出内存限制时,采用乘积量化方法保存原始向量的有损压缩形式,创建索引的时候需要指定量化器的个数与每个量化器编码字节长度;
- 在查询阶段返回的结果是近似值,实验显示,乘积量化后查询返回的距离值与真实值相比偏小,此外,索引的初始化过程的耗时也比较久一些;
3、索引样例:
(图片丢失)
4、性能对比:
- 索引创建:
- 索引查询:
5、官方性能:
- Deep1B 数据集上测试,30%的1-recall@1,在每向量0.5ms左右的时间,40%的1-recall@1,少于每向量2ms的检索时间,以2ms的检索时间计算,单核可达到500 QPS;
- 与业内最先进的研究相比,Babenko 和 Lempitsky 在 CVPR 2016 上发表的论文:“Efficient Indexing of Billion-Scale Datasets of Deep Deors”显示需要 20 ms 来获取 45% 的 1-recall@1;
- 单个 GPU 的速度一般比 CPU 快五到十倍,新的帕斯卡架构 GPU 硬件,比如英伟达 P100,快 20 倍有余;