标签:cuda 使用 2.0 改变权限 strong 目录 就是 tool include
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 这样的编码矢量能在几乎不损失精度的前提下进行加速。
1、从github上将c++项目clone下来
git clone https://github.com/facebookresearch/faiss
2、打开下载的项目,如下
发现有名为makefile的文件,则直接make命令编译项目,发现报错,说缺少makefile.inc文件
经过查资料,发现使用make编译的项目一定有makefile文件,同时在makefile文件中,还可能会引用makefile.inc文件
看到项目中有一个example_makefiles文件夹,进入,看到里面有多种inc文件,因为是ubuntu,我选用makefile.inc.Linux,将这个文件拷贝到faiss目录中,改名为makefile.inc
再次执行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
编译完成后发现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,执行完成。
完整的安装步骤:
GPU 开发环境是 GPU-FAISS 开发的基础,主要分为安装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/
为开发用户定制环境变量。
# 编辑文件。 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
# 进入gpu目录 &编译。 cd gpu make py
标签:cuda 使用 2.0 改变权限 strong 目录 就是 tool include
原文地址:https://www.cnblogs.com/zealousness/p/8757290.html