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 豪华 ...
随机推荐
- win10家庭版升级专业版的两种方法和密钥
win10家庭版升级专业版密钥:VK7JG-NPHTM-C97JM-9MPGT-3V66T4N7JM-CV98F-WY9XX-9D8CF-369TT FMPND-XFTD4-67FJC-HDR8C-3 ...
- Redis进阶实践之四Redis的基本数据类型(转载4)
Redis进阶实践之四Redis的基本数据类型 一.引言 今天正式开始了Redis的学习,如果要想学好Redis,必须先学好Redis的数据类型.Redis为什么会比以前的Memchaed等内存缓存软 ...
- LeetCode OJ 77. Combinations
题目 Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exa ...
- sqlalchemy 学习-- 多表操作
一对多:一对一 # one -- many class Students(Base): __tablename__ = "students" sid = Column(Intege ...
- 设置DNS 代理
最近烦心事好多啊,坑爹的中介... 公司之前因为断电,导致DNS基础服务故障,很多系统好半天在能使用,所以这次吸取教训,设置备份的DNS server以及使得DNS能够动态迁移,在这种时候就显得格外的 ...
- 学JS的心路历程-JS支持面向对象?(一)
昨天在看Prototype看到JS支持面向对象,被前辈问到说那什么是面向对象?JS是面向对象语言吗? 便开始了一连串艰辛爬文过程,今天就来看一下两者有什么差异吧(rgwyjc)! 首先面向对象有三大特 ...
- hive 解jason字符串
json 字符串为: 字段名为: json {"appId":36222,"deviceId":"12536521-7b3d-41f6-9c09-fd ...
- 历届试题 小数第n位-(同余公式+快速幂)
问题描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数. 如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式. 本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始 ...
- R语言-画散点图
plot()函数 plot(cars$dist~cars$speed, # y~x main="XXX", ...
- SQL Server和MySQL数据库
导读:接下来的网上商城的项目,需要用到MySQL数据库了.这个对于我来说,是一个新接触的东西,按照惯例,在刚开始学习一个东西的时候,先从宏观上去了解它.本篇博客,先介绍SQL Server的基本内容, ...