faiss CPU版本+GPU版本安装

faiss安装

faiss是facebook开发的有CPU版本和GPU版本的求密集向量相似性和进行密集向量聚类的库。

faiss用c++编写,安装faiss需要在github上下载其c++源码并用make编译安装

 

faiss仅有的两个依赖包:blas和lapack

 

 CPU 方面,Facebook 大量利用了:

多线程以充分利用多核性能并在多路 GPU 上进行并行搜索。

BLAS 算法库通过 matrix/matrix 乘法进行高效、精确的距离计算。没有 BLAS,高效的强力执行很难达到最优状态。 BLAS/LAPACK 是唯一一个 Faiss 必须的前提软件。

机器 SIMD 矢量化 popcount 被用于加速孤立矢量的距离计算。

GPU方面:

对于从前的相似性搜索 GPU 执行,k-selection(寻找 k-minimum 或 maximum 因子)一直存在性能问题。这是因为普通的 CPU 算法(比如 heap selection)并不适用于 GPU。对于 Faiss GPU,Facebook 设计了学术圈迄今为止最快的小型 k-selection 算法(k <= 1024)。所有中间状态都完全保存在寄存器中,进一步提升了速度。它能够将输入数据以 single pass 进行  k-select,运行于潜在峰值性能的 55%,取决于峰值 GPU 显存带宽。由于其状态只存储在注册表中,并可与其他 kernels 融合,使它成为超级快的 exact  approximate 搜索引擎。

研究领域的许多注意力被放到了高效的 tiling 策略,面向 approximate 搜索的 kernels 执行。多 GPU 支持用过粉碎或复制数据来提供。开发者并不会受单 GPU 显存大小的限制。半精度浮点支持  (float16) 也有提供,可在支持的 GPU 上进行完整 float16 运算,或者更早 GPU 架构所提供的的中级 float16 存储。我们发现 float16  这样的编码矢量能在几乎不损失精度的前提下进行加速。

一、CPU版本的编译(实际上并不是安装,只是在faiss文件夹中编译出可import的py,pyc,so文件(默认就放在faiss文件夹下)即可,并不会在faiss文件夹以外的地方添加任何东西)

关键:先在faiss文件夹下make编译,然后再在faiss文件夹下make py编译出python文件。

前提:仔细读makefile和makefile.inc,配置好所需so库(/usr/lib)。c++项目编译出python文件需要安装swig命令(环境变量/etc/profile)。

1、从github上将c++项目clone下来

git clone https://github.com/facebookresearch/faiss

 

2、打开下载的项目,如下

 

错误1:

发现有名为makefile的文件,则直接make命令编译项目,发现报错,说缺少makefile.inc文件

经过查资料,发现使用make编译的项目一定有makefile文件,同时在makefile文件中,还可能会引用makefile.inc文件

看到项目中有一个example_makefiles文件夹,进入,看到里面有多种inc文件,因为是ubuntu,我选用makefile.inc.Linux,将这个文件拷贝到faiss目录中,改名为makefile.inc

 

错误2:

再次执行make命令编译,结果发现报错如下:

undefined reference to错误,就是有函数没有定义

 

一开始以为clone的时候没有下全,重新下了一遍还是这样(后来想想真蠢)

然后我打开报错的文件,utils.cpp 和 VectorTransform.cpp看了一下,发现报错的这几个函数确实只有声明,没有定义

 

看到上面注释中说,这些函数是lapack中的,于是我以为是因为没有安装lapack,又去官网下载安装lapack,下载编译安装lapack之后发现还是不行,我又重新下载了最新版的lapack,重新编译安装发现还是不行(而且还出现了新的错误)。。。

然后我又注意到上面的注释中说“see http://www.netlib.org/clapack/old/single/sgeqrf.c”

我就又去下载了sgeqrf.c放到faiss文件夹下,还是不行。然后我又想把sgeqrf.c的代码放到utils.cpp中,但是sgeqrf中又引用了其他不存在的函数,永远也引不完的啊,这错误肯定不会是这么解决的,所以再次推倒重来。

 

最后,发现了,是动态链接库的问题!!

 

就是说,c++工程,没必要所有函数都在cpp文件中写好,可以在编译过程中调用动态链接库(动态链接库即.so文件)。所以一般地,我们需要在makefile或makefile.inc中配置好所要用的动态链接库(即.so文件)的路径。像lapack,blas,这样的软件,在安装的时候会自动将它的.so文件安装到系统中的默认位置,然后一般从github上clone下来的项目中,也会在makefile或makefile.inc文件中预先配置好这个默认位置。

但关键在于,这个默认位置,不同系统不一样!!不同linux版本ubuntu和centos也不一样!!

facebook发布在github上的faiss项目的makefile.inc文件中,调用blas和lapack的.so文件的路径默认是centos下的,而我是在ubuntu下,所以我一直各种下载,安装,还是显示有函数未定义的错误,因为makefile.inc找不到它需要的.so文件!

所以我打开faiss的makefile.inc文件,找到BLASDFLAGS这一行,将这一行配置的libopenblas.so.0文件和liblapack.so.0文件,在命令行下用find搜索一下,或者直接切到/usr/lib下搜索一下,将其正确的路径配置上。

然后make,就编译成功了。

ubuntu中,一般地,so文件放在/usr/lib下,但也有放在/lib下的,也有放在/usr/local/lib下的,关于/lib,/usr/lib,/usr/local/lib三个lib目录的区别参见:http://blog.csdn.net/zhuying_linux/article/details/6195774

 

错误3:

编译完成后发现faiss文件夹下多了几个.pyc文件,但注意安装方式不是把这几个pyc文件复制到python的库目录(ubuntu下/usr/lib/python2.7/site-packages或/usr/lib/python2.7/dist-packages 这两个库目录的区别参见:https://www.cnblogs.com/kevin922/p/3161411.html)!!而是根据教程,继续执行make py命令,执行make py命令之后,发现报错

找不到swig命令

 

搜索了一下swig是什么,原来swig是c/c++和python的“粘合剂”,参见http://blog.csdn.net/soaringlee_fighting/article/details/61925620

那么解决思路就是安装swig并将swig命令添加到环境变量

安装swig:

1. 下载 swig 源码

http://www.swig.org/survey.html

填写一个简单的问卷,即可进入 sourceforge 下载。

2. 安装 g++

sudo apt-get install g++

如果安装过,无需再次安装。步骤 3 同理。

检验一下你的系统是否安装了 g++,输入

g++ -version

3. 安装 pcre

sudo apt-get install libpcre3 libpcre3-dev

4. 解压 swig 源码 

chmod 777 swig-2.0.11.tar.gz // 改变权限

tar -xzvf swig-2.0.11.tar.gz // 解压

5. 配置、编译和安装 swig

cd 到刚才解压的目录里面

 

./configure --prefix=/swig目录 // 指定安装目录

make // 编译

make install // 安装

如果想让默认安装的话,可以直接执行./configure

 

配置环境变量:

修改/etc/profile文件

“export PATH=/swigtool安装目录/bin:$PATH” 添加到文件末尾单独一行,即可(原理是在每次系统启动时自动读取该文件中的命令并执行)

这样,在其他路径下就可以执行 swig 命令。

查看swig命令安装是否成功

 

然后在faiss文件夹中执行make py,执行完成。

测试:在faiss文件夹下,进入python2命令行,import faiss测试一下(注意,如果不在faiss目录下import还是会提示包不存在的,或者你可以先配置一下PYTHONPATH环境变量,将faiss中python库的安装目录加入到PYTHONPATH中):

 

faissCPU版本安装成功!

 

二、GPU版本的编译(实际上并不是安装,只是在faiss文件夹中编译出可import的py,pyc,so文件(默认就放在faiss文件夹下)即可,并不会在faiss文件夹以外的地方添加任何东西)

关键:编译完CPU版本之后,进入faiss/gpu文件夹下执行make py即可编译出GPU版本需要的python文件。

前提:在CPU版本编译完成的基础之上进行,需要先安装好cuda,导入cudnn关联,配置cuda相关的三个环境变量。

完整的安装版本过程如下,但是注意:(1)我司的simple上已经安装好了cuda并配置好了关联,我们只需要从1.2开始即可。(2)我们刚才已经安装好了CPU版本,请注意不需要再make了,配置好cuda的环境变量后直接进入faiss的gpu文件夹执行make py即可。(3)每次在faiss文件夹中执行make clean之后都要重新make+make py(in faiss)+make py(in faiss/gpu)才能正常import faiss

完整的安装步骤:

  • 搭建 GPU 开发环境 
    – 安装 CUDA 并导入 CuDNN 关联 
    – 配置环境变量
  • C++ GPU 开发环境
  • Python GPU 开发环境
  • 结束

1、搭建 GPU 开发环境

GPU 开发环境是 GPU-FAISS 开发的基础,主要分为安装CUDA并导入CuDNN关联、配置环境变量三部分。

1.1、安装CUDA并导入CuDNN关联

CUDA Compute Unified Device Architecture, 是 NVIDIA 推出的通用并行计算框架。CuDNN 是 NVIDIA 提供的 GPU 计算加速方案。 
快捷下载云盘 密码:77bg

安装CUDA

# 修改权限

chod +x cuda_8.0.44_linux.run# 安装CUDA

bash cuda_8.0.44_linux.run

 

!注意 不要选择重装显卡驱动,操作如下:

 

关联 CuDNN

# 解压文件。

tar -xzvf cudnn-8.0-linux-x64-v5.1.tgz# root权限# 拷贝到指定目录下。

cp -a ./cuda/include/* /usr/local/cuda/include/

cp -a ./cuda/lib64/* /usr/local/cuda/lib64/

1.2、配置环境变量

为开发用户定制环境变量。

# 编辑文件。 vim $HOME/.bash_profile # 添加 CUDA 和 CuDNN 的支持。 export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64" export CUDA_HOME=/usr/local/cuda export PATH="$PATH:/usr/local/cuda/bin" # 加载。 source $HOME/.bash_profile

2、安装

# 进入gpu目录 &编译。 cd gpu make py

测试:在faiss文件夹下,进入python2命令行,执行import faiss,import _swigfaiss_gpu,执行 成功则安装成功。

 

原文地址:https://www.cnblogs.com/zealousness/p/8757290.html