faiss安装

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

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

 

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

 

 CPU 方面,Facebook 大量利用了:

多线程以充分利用多核性能并在多路

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 策略,面向

一、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、打开下载的项目,如下

 

GPU集群 模型并行 gpu集群软件_GPU集群 模型并行

 

错误1:

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

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

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

 

GPU集群 模型并行 gpu集群软件_python_02

 

错误2:

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

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

 

GPU集群 模型并行 gpu集群软件_GPU集群 模型并行_03

 

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

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

 

GPU集群 模型并行 gpu集群软件_python_04

 

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

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

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

 

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

 

GPU集群 模型并行 gpu集群软件_CUDA_05

 

就是说,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目录的区别参见:

 

错误3:

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

找不到swig命令

 

GPU集群 模型并行 gpu集群软件_CUDA_06

 

搜索了一下swig是什么,原来swig是c/c++和python的“粘合剂”,参见

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

安装swig:

1. 下载 swig 源码

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

填写一个简单的问卷,即可进入

2. 安装 g++

sudo apt-get install 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文件

这样,在其他路径下就可以执行

查看swig命令安装是否成功

 

GPU集群 模型并行 gpu集群软件_CUDA_07

 

 

然后在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

 

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

 

GPU集群 模型并行 gpu集群软件_so文件_08

 

关联

# 解压文件。

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,执行 成功则安装成功。

 

GPU集群 模型并行 gpu集群软件_python_09