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版本安装的更多相关文章

  1. 图像重采样(CPU和GPU)

    1 前言 之前在写影像融合算法的时候,免不了要实现将多光谱影像重采样到全色大小.当时为了不影响融合算法整体开发进度,其中重采样功能用的是GDAL开源库中的Warp接口实现的. 后来发现GDAL War ...

  2. 【转】Ubuntu 16.04安装配置TensorFlow GPU版本

    之前摸爬滚打总是各种坑,今天参考这篇文章终于解决了,甚是鸡冻\(≧▽≦)/,电脑不知道怎么的,安装不了16.04,就安装15.10再升级到16.04 requirements: Ubuntu 16.0 ...

  3. Caffe学习笔记2--Ubuntu 14.04 64bit 安装Caffe(GPU版本)

    0.检查配置 1. VMWare上运行的Ubuntu,并不能支持真实的GPU(除了特定版本的VMWare和特定的GPU,要求条件严格,所以我在VMWare上搭建好了Caffe环境后,又重新在Windo ...

  4. TensorFlow在Windows上的CPU版本和GPU版本的安装指南(亲测有效)

    安装说明 平台:Window.Ubuntu.Mac等操作系统 版本:支持GPU版本和CPU版本 安装方式:pip方式.Anaconda方式 attention: 在Windows上目前支持python ...

  5. 学习笔记TF046:TensoFlow开发环境,Mac、Ubuntu/Linux、Windows,CPU版本、GPU版本

    下载TensorFlow https://github.com/tensorflow/tensorflow/tree/v1.1.0 .Tags选择版本,下载解压. pip安装.pip,Python包管 ...

  6. 通过Anaconda在Ubuntu16.04上安装 TensorFlow(GPU版本)

    一. 安装环境 Ubuntu16.04.3 LST GPU: GeForce GTX1070 Python: 3.5 CUDA Toolkit 8.0 GA1 (Sept 2016) cuDNN v6 ...

  7. Win10上安装Keras 和 TensorFlow(GPU版本)

    一. 安装环境 Windows 10 64bit  家庭版 GPU: GeForce GTX1070 Python: 3.5 CUDA: CUDA Toolkit 8.0 GA1 (Sept 2016 ...

  8. windows10安装tensorflow的gpu版本(pip3安装方式)

    前言: TensorFlow 有cpu和 gpu两个版本:gpu版本需要英伟达CUDA 和 cuDNN 的支持,cpu版本不需要:本文主要安装gpu版本. 1.环境 gpu:确认你的显卡支持 CUDA ...

  9. ubuntu安装mxnet GPU版本

    安装mxnet GPUsudo pip install mxnet-cu80==1.1.0 推荐pip安装mxnet,土豪gpu版本: pip install mxnet-cu90==1.0.0 豪华 ...

随机推荐

  1. win10家庭版升级专业版的两种方法和密钥

    win10家庭版升级专业版密钥:VK7JG-NPHTM-C97JM-9MPGT-3V66T4N7JM-CV98F-WY9XX-9D8CF-369TT FMPND-XFTD4-67FJC-HDR8C-3 ...

  2. Redis进阶实践之四Redis的基本数据类型(转载4)

    Redis进阶实践之四Redis的基本数据类型 一.引言 今天正式开始了Redis的学习,如果要想学好Redis,必须先学好Redis的数据类型.Redis为什么会比以前的Memchaed等内存缓存软 ...

  3. LeetCode OJ 77. Combinations

    题目 Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For exa ...

  4. sqlalchemy 学习-- 多表操作

    一对多:一对一 # one -- many class Students(Base): __tablename__ = "students" sid = Column(Intege ...

  5. 设置DNS 代理

    最近烦心事好多啊,坑爹的中介... 公司之前因为断电,导致DNS基础服务故障,很多系统好半天在能使用,所以这次吸取教训,设置备份的DNS server以及使得DNS能够动态迁移,在这种时候就显得格外的 ...

  6. 学JS的心路历程-JS支持面向对象?(一)

    昨天在看Prototype看到JS支持面向对象,被前辈问到说那什么是面向对象?JS是面向对象语言吗? 便开始了一连串艰辛爬文过程,今天就来看一下两者有什么差异吧(rgwyjc)! 首先面向对象有三大特 ...

  7. hive 解jason字符串

    json 字符串为: 字段名为: json {"appId":36222,"deviceId":"12536521-7b3d-41f6-9c09-fd ...

  8. 历届试题 小数第n位-(同余公式+快速幂)

    问题描述 我们知道,整数做除法时,有时得到有限小数,有时得到无限循环小数. 如果我们把有限小数的末尾加上无限多个0,它们就有了统一的形式. 本题的任务是:在上面的约定下,求整数除法小数点后的第n位开始 ...

  9. R语言-画散点图

    plot()函数 plot(cars$dist~cars$speed,           # y~x main="XXX",                            ...

  10. SQL Server和MySQL数据库

    导读:接下来的网上商城的项目,需要用到MySQL数据库了.这个对于我来说,是一个新接触的东西,按照惯例,在刚开始学习一个东西的时候,先从宏观上去了解它.本篇博客,先介绍SQL Server的基本内容, ...