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,执行 成功则安装成功。
faiss CPU版本+GPU版本安装的更多相关文章
- 图像重采样(CPU和GPU)
1 前言 之前在写影像融合算法的时候,免不了要实现将多光谱影像重采样到全色大小.当时为了不影响融合算法整体开发进度,其中重采样功能用的是GDAL开源库中的Warp接口实现的. 后来发现GDAL War ...
- 【转】Ubuntu 16.04安装配置TensorFlow GPU版本
之前摸爬滚打总是各种坑,今天参考这篇文章终于解决了,甚是鸡冻\(≧▽≦)/,电脑不知道怎么的,安装不了16.04,就安装15.10再升级到16.04 requirements: Ubuntu 16.0 ...
- Caffe学习笔记2--Ubuntu 14.04 64bit 安装Caffe(GPU版本)
0.检查配置 1. VMWare上运行的Ubuntu,并不能支持真实的GPU(除了特定版本的VMWare和特定的GPU,要求条件严格,所以我在VMWare上搭建好了Caffe环境后,又重新在Windo ...
- TensorFlow在Windows上的CPU版本和GPU版本的安装指南(亲测有效)
安装说明 平台:Window.Ubuntu.Mac等操作系统 版本:支持GPU版本和CPU版本 安装方式:pip方式.Anaconda方式 attention: 在Windows上目前支持python ...
- 学习笔记TF046:TensoFlow开发环境,Mac、Ubuntu/Linux、Windows,CPU版本、GPU版本
下载TensorFlow https://github.com/tensorflow/tensorflow/tree/v1.1.0 .Tags选择版本,下载解压. pip安装.pip,Python包管 ...
- 通过Anaconda在Ubuntu16.04上安装 TensorFlow(GPU版本)
一. 安装环境 Ubuntu16.04.3 LST GPU: GeForce GTX1070 Python: 3.5 CUDA Toolkit 8.0 GA1 (Sept 2016) cuDNN v6 ...
- Win10上安装Keras 和 TensorFlow(GPU版本)
一. 安装环境 Windows 10 64bit 家庭版 GPU: GeForce GTX1070 Python: 3.5 CUDA: CUDA Toolkit 8.0 GA1 (Sept 2016 ...
- windows10安装tensorflow的gpu版本(pip3安装方式)
前言: TensorFlow 有cpu和 gpu两个版本:gpu版本需要英伟达CUDA 和 cuDNN 的支持,cpu版本不需要:本文主要安装gpu版本. 1.环境 gpu:确认你的显卡支持 CUDA ...
- ubuntu安装mxnet GPU版本
安装mxnet GPUsudo pip install mxnet-cu80==1.1.0 推荐pip安装mxnet,土豪gpu版本: pip install mxnet-cu90==1.0.0 豪华 ...
随机推荐
- iptables学习
droidwall.sh #!/system/bin/sh IPTABLES=iptables BUSYBOX=busybox GREP=grep ECHO=echo # Try to find bu ...
- StarRatingBar星星切换动画《IT蓝豹》
StarRatingBar星星切换动画 StarRatingBar星星切换动画,很久没有学习一下这个RatingBar了,今天来看看这个RatingBar的动画切换效果,本例子主要是RatingBar ...
- Redis Cluster在线迁移
由于之前的redis cluster物理硬件性能不足.决定升级到更好的服务器上.考虑到redis是核心生产数据库,决定在线迁移,迁移过程,不中断服务. 下面是测试环境的完成迁移步骤:1. 原环境(测试 ...
- centos 卸载和安装软件
rpm -qa 列出所有已安装软件包 rpm -e packagename 删除软件包 rpm -e --nodeps packagename 强制删除软件和依赖包 rpm -q 包名 查 ...
- vue分页 点击(非下拉)
1.主页面 <template> <div class="list"> <template v-if="count"> 55 ...
- mysql查询记录修改时间于现在大于30分钟
(unix_timestamp(now())-`updatetime`)>1800
- get请求中url传参中文乱码问题--集锦
一:get请求url中带有中文参数,有三种方式进行处理防止中文乱码 1.如果使用tomcat作为服务器,那么修改tomcat配置文件conf/server.xml中,在 <Connector ...
- 使用jquery如何获取现在时间、并且格式化
参考网址:https://www.jb51.net/article/94626.html var now=new Date(); $("#total").html(formatTi ...
- centos 升级sqlite3
1.yum remove sqlite3 2. 下载: wget -O sqlite-autoconf-.tar.gz https://www.sqlite.org/2019/sqlite-autoc ...
- zxing解析带logo二维码会报com.google.zxing.NotFoundException
参考原文:https://blog.csdn.net/cyl1226541/article/details/70557232 //复杂模式,开启PURE_BARCODE模式(☆☆☆) HINTS.pu ...