深入理解Faiss 原理&源码 (一) 编译

摘要:
目录:深入了解Faiss的原理和源代码(I)编译Mac,安装Macxcode工具包,安装openblas,安装swig,安装libomp,编译Faiss。附录:深入了解Faiss的原理和源代码(I)编译Faiss系列,从独立库到构建大规模分布式矢量检索系统。让我告诉你费斯是什么?Faiss是面向Facebook AI团队的开源集群和相似性搜索库。它为密集向量提供了高效的相似性搜索和聚类,支持数十亿向量的搜索,是目前最成熟的近邻搜索库。Faiss是用C++编写的,它提供了一个与Numpy完美连接的Python接口。

目录

深入理解Faiss 原理&源码 (一) 编译

Faiss系列, 从单机lib到构建大规模分布式向量检索系统, 且听我娓娓道来

Faiss是什么?

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

mac下安装

安装mac xcode工具包

xcode-select --install

因为是通过源码编译, 需要依赖gcc系列工具包, 所以要先执行这一步

安装 openblas

brew install openblas

BLAS是 Basic Linear Algebra Subprograms (基本线性代数子程序)的首字母缩写,主要用来做基础的矩阵计算,或者是向量计算。它分为三级:

  • BLAS 1级,主要做向量与向量间的dot或乘加运算,对应元素的计算;

  • BLAS 2级,主要做矩阵和向量,就类似PPT中蓝色部分所示,矩阵A*向量x, 得到一个向量y。除此之外,可能还会有对称的矩阵变形;

  • BLAS 3级,主要是矩阵和矩阵的计算,最典型的是A矩阵B矩阵,得到一个C矩阵。由矩阵的宽、高,得到一个mn的C矩阵。

为什么BLAS是一个非常重要的库或者接口,是因为它是很多科学计算的核心之一。每年做超级计算机的排行榜,都要做LINPACK测试,该测试很多部分就是做BLAS 3级矩阵和矩阵的计算。此外,还有很多科学和工程的模拟,在转换后都变成了一种矩阵上的操作。如果你把矩阵优化的特别好的话,对整个应用的提升,都是非常有帮助的。

安装swig

brew install swig

简单包装界面产生器(英语:Simplified Wrapper and Interface Generator, SWIG)是一个开源软件工具,用来将C语言或C++写的计算机程序或函式库,连接脚本语言,例如Lua, Perl, PHP, Python, R, Ruby, Tcl, 和其它语言,例如C#, Java, JavaScript, Go, D, OCaml, Octave, Scilab以及Scheme. 也可以输出成XML格式。

安装libomp

brew install libomp

OpenMP(Open Multi-Processing)是一套支持跨平台共享内存方式的多线程并发的编程API,使用C,C++和Fortran语言,可以在大多数的处理器体系和操作系统中运行,包括Solaris, AIX, HP-UX, GNU/Linux, Mac OS X, 和Microsoft Windows。包括一套编译器指令、库和一些能够影响运行行为的环境变量。

编译faiss

  • 下载代码, 此处选择最新v1.7.1 tag
git clone https://github.com/facebookresearch/faiss.git

cd faiss

git checkout v1.7.1
  • cmake参数选择
vim CMakeLists.txt

此处不需要gpu索引和python版本, 修改CMakeLists.txt 对应设置

option(FAISS_OPT_LEVEL "" "generic")
option(FAISS_ENABLE_GPU "Enable support for GPU indexes." OFF)
option(FAISS_ENABLE_PYTHON "Build Python extension." OFF)
option(FAISS_ENABLE_C_API "Build C API." ON)

cmake 依赖校验

cmake -B build .
  • 开始编译
make -C build -j faiss

533cd0d20bfddb78d2d0e27a25d1f8bb.png

  • 生成c++ lib
make -C build install

ec21f321b2aea0d19c07ee877309d173.png

  • 跑下测试用例
make -C build install

889a995935a98d97f913161e6940269c.png

  • 跑下 ivfpq的例子
make -C build demo_ivfpq_indexing

66b2e729e089b8dbc4c74581528cbd4e.png

至此, 安装验证完成, 下一篇将会剖析下 c++版本 flat索引 原理+源码

对向量检索感兴趣以及对搜索&推荐感兴趣的小伙伴的欢迎加qq 564790073 讨论, 一线大厂搜索中心长期招人

github: https://github.com/hashyong

未经允许禁止转载 谢谢

附录

免责声明:文章转载自《深入理解Faiss 原理&源码 (一) 编译》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【LiteOS】STM32F103-LiteOS移植教程(详细篇)iview table表头自定义筛选下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

原!linux机器 配置自动scp脚本

 方式一: 1.安装相关依赖包 yum install -y tcl tclx tcl-develyum -y install expect 2.脚本 scp.sh #!/usr/bin/expect #获取输入参数set f1 [lindex $argv 0]set f2 [lindex $argv 1]set dir [lindex $argv 2]s...

骨牌覆盖问题 KxM

 前面我们说了一些简单的骨牌覆盖问题,有了上面的经验,我们可以尝试解决K*M的 思路和上一篇文章所提到的3*N的 很类似; 依然是矩阵快速幂。我们需要把一个小的边固定下来作为的已知边,然后进行矩阵快速幂,要进行矩阵快速幂,我们需要知道初始矩阵,与构造出的递推矩阵; 我们如何得到这两个矩阵? 初始矩阵:矩阵宽度为 2^n  次方;第一排只可能出现,0或者横...

几种常用库在CentOS下的编译

1操作环境 通过命令查看操作系统版本信息: [root@localhost ~]# cat /proc/version Linux version 3.10.0-327.el7.x86_64 (builder@kbuilder.dev.centos.org) (gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (G...

第一篇:CUDA 6.0 安装及配置( WIN7 64位 / 英伟达G卡 / VS2010 )

前言        本文讲解如何在VS 2010开发平台中搭建CUDA开发环境。        当前配置:               系统:WIN7 64位               开发平台:VS 2010               显卡:英伟达G卡               CUDA版本:6.0        若配置不同,请谨慎参考本文。 第一...

ORBSLAM2 初体验 —— 配置安装

转载请注明出处,谢谢原创作者:MingruiYU原创链接:https://www.cnblogs.com/MingruiYu/p/12286752.html ORB-SLAM2作为目前应用最广泛的视觉SLAM系统,其经典和重要程度毋庸置疑。ORB-SLAM2的github文档中,提供了详尽的ORB-SLAM2配置教程,上手应该是比较容易的。本文将跟随其g...

GCC编译器原理(一)------交叉编译器制作和GCC组件及命令

1.1 交叉编译器制作 默认安装的 GCC 编译系统所产生的代码适用于本机,即运行 GCC 的机器,但也可将 GCC 安装成能够生成其他的机器代码。安装一些必须的模块,就可产生多种目标机器代码,而且可通过命令行选择一种希望使用的代码。 1.1.1 目标机 从网站 http://gcc.gnu.org/install/specific.html 可以得到有可...