手把手教你安装Faiss(Linux)

前言

由于最近项目组引用Faiss库(Faiss是由Facebook AI Research研发的为稠密向量提供高效相似度搜索和聚类的框架),百度上一搜一大波安装教程,大部分其实都是通过Faiss项目中的INSTALL.md来进行安装的,不过教程确实时间久远,又很多东西和INSTALL.md对不上,尝试了很多版本都没法成功安装,最后还是根据官方的INSTALL.md文档才把Faiss安装好的。(这个故事告诉我们编译源码最好是看官方文档,不要畏惧英文,毕竟谷歌翻译很强大哈哈)。

Linux软件编译基本知识

PS:这一部分自己也是一知半解,大家可以自行了解,仅对不太熟悉编译知识的同学进行普及。

正式安装之前先补充一些关于Linux上的开源软件安装流程知识,一般分为三步(./configure && make && make install):

  • ./configure 是用来检测你的安装平台的目标特性,比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,在安装之前需要先运行configure命令设置一些参数来对安装进行控制,比如:./configure -prefix = /usr 意思是把该软件安装在/usr 下,有一些软件还可以加上 –with、–enable、–without、–disable 等等参数对编译加以控制,你可以通过允许 ./configure –help 察看详细的说明帮助。
  • make 就比较简单了,就是通过MAKEFILE 执行编译
  • make install 安装软件,一般是将编译好的库或者头文件放置到/usr/lib 或者/usr/local/lib、/usr/include、/usr/local/include中供其他使用

编译 Faiss(CentOS 7.4)

如果你只是想在python中使用Faiss库,只用看下文的第一点(利用Anaconda3构建开发环境即可),编译C++直接参考第二点)。

(1)利用Anaconda3直接安装Python环境

步骤一:安装anaconda3


# 下载
wget https://repo.anaconda.com/archive/Anaconda3-5.3.0-Linux-x86_64.sh

# 权限
chmod +x Anaconda3-5.3.0-Linux-x86_64.sh

# 安装
bash Anaconda3-5.3.0-Linux-x86_64.sh

安装过程中需不需要加入环境变量选的是No就手工添加


# 编辑
vi $HOME/.bashrc

# 添加
export PATH="$HOME/anaconda3/bin:$PATH"

# 启用
source $HOME/.bashrc

检查一下是否安装成功


conda list

步骤二:安装Faiss-cpu /Faiss-gpu


# CPU version only
conda install faiss-cpu -c pytorch

# Make sure you have CUDA installed before installing faiss-gpu, otherwise it falls back to CPU version

conda install faiss-gpu -c pytorch # [DEFAULT]For CUDA8.0
conda install faiss-gpu cuda90 -c pytorch # For CUDA9.0
conda install faiss-gpu cuda91 -c pytorch # For CUDA9.1

# cuda90/cuda91 shown above is a feature, it does not install CUDA for you.


(2)编译源码(C++环境)

步骤一:环境安装,安装gcc及g++


# 安装gcc:
yum install gcc 

# 安装g++:
yum install gcc-c++ (权限不够,用在root权限下安装)

# 查看gcc版本,如果是gcc4.8以下建议升级到gcc4.8
gcc -v

步骤二:安装Faiss依赖的数学库(openblas 和 lapack,库的功能请自行百度)

  • 安装OpenBLAS

#没有安装git,先安装git,CentOS安装git
#yum install git

git clone https://github.com/xianyi/OpenBLAS.git
cd OpenBLAS

#如果没有安装gfortran
#yum install gcc-gfortran (unbuntu版 执行 sudo apt-get install gfortran)
make FC=gfortran

#将OpenBLAS安装在/opt下
make install

#之后将编译好的动态库链接至/usr/lib目录下
ln -s /opt/OpenBLAS/lib/libopenblas.so  /usr/lib/libopenblas.so

在 /etc/profile中加入


LD_LIBRARY_PATH=/opt/OpenBLAS/lib
export LD_LIBRARY_PATH

  • 安装lapack

# 下载lapack源码
wget http://www.netlib.org/lapack/lapack-3.4.2.tgz
tar -zxf lapack-3.4.2.tgz

# 首先当然是进入lapack-3.4.2文件夹,然后根据平台的特点,将INSTALL目录下对应的make.inc.XXX复制一份到 lapack-3.4.2目录下,并命名为make.inc, 这里我复制的是INSTALL/make.inc.gfortran,因为我这里用的是gfortran编译器
cd lapack-3.4.2
cp ./INSTALL/make.inc.gfortran ./
mv make.inc.gfortran make.inc

修改lapack-3.4.2/Makefile,因为lapack以来于blas库,所以需要做如下修改(注释第一句话,去掉注释第二句话):


#lib: lapacklib tmglib
lib: blaslib variants lapacklig tmglib

接着进行编译:


# 编译所有的lapack文件
make

# 进入lapacke 文件夹,这个文件夹包含lapack的C语言接口文件 
cd lapacke

# 编译lapacke
make  

由于lapack的makefile文件中没有make isntall 命令,需要手工进行安装


# 将lapacke的头文件复制到系统头文件目录
cp include/*.h /usr/include  

# 返回到 lapack-3.4.2 目录 
cd .. 

# 将生成的所有库文件复制到系统库目录 
cp *.a /usr/lib 

这里的头文件包括: lapacke.h, lapacke_config.h, lapacke_mangling.h,lapacke_mangling_with_flags.h lapacke_utils.h

生成的库文件包括: liblapack.a, liblapacke.a, librefblas.a,libtmglib.a

步骤三:编译安装Faiss


# 下载FAISS源码.
git clone https://github.com/facebookresearch/faiss.git

# 进入FAISS源码目录.
cd faiss

# 根据系统配置编译环境. [Linux 为例]
cp example_makefiles/makefile.inc.Linux ./makefile.inc

接着需要验证步骤二中两个数学库安装是否成功,需要执行BLAS测试用例


# 首先先执行./configure,看看环境是否符合编译条件,其中有一些不是必选项,一般管制输出日志的最后一句话有无错误即可
./configure

# 之后进行编译用例测试,若无报错即代表数学库安装成功
make misc/test_blas
./misc/test_blas

接下来终于到了最终的编译安装Faiss的环节了,真的是不容易呀


# 执行最重要的make & make install
make
make install

可以在项目根目录下看见编译好的静态库和动态库

<figure style="box-sizing: border-box; display: block; margin: 2em auto; text-align: center;">
image

<figcaption style="box-sizing: border-box; display: block; text-align: center; font-size: 0.8em; line-height: 2em; color: rgb(144, 144, 144);"></figcaption>

</figure>

步骤四:测试Faiss,参考INSTALL.md上的测试用例,这里就不赘述了

A bit longer example runs and evaluates Faiss on the SIFT1M dataset. To run it, please download the ANN_SIFT1M dataset fromhttp://corpus-texmex.irisa.fr/ and unzip it to the subdirectory sift1M at the root of the source directory for this repository. Then compile and run the following (after ensuring you have installed faiss):

make demos

./demos/demo_sift1M

This is a demonstration of the high-level auto-tuning API. You can try setting a different index_key to find the indexing structure that gives the best performance.

结束语

至此,Faiss-CPU版本编译工作就完成了,自己之前也没真正接触过开源项目的源码编译,对linux makefile也不熟悉,其实这次实践花了不少时间,最重要还是要理解Linux 开源软件的编译流程,按照这种逻辑一定能编译出来的。

之后会开始阅读源码以及一些基本的使用技巧,不定期更新,毕竟我也是个萌新哈哈哈。

致谢

部分内容参考一下链接,没有和作者取得联系就直接使用了,这里表示感谢一下https://blog.csdn.net/baiyang3/article/details/52790793 作者:baiyang3https://blog.csdn.net/u013017173/article/details/81748168#2-安装openblas的步骤 作者:枫依流水

预览

1694 字

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,100评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,862评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,993评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,309评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,303评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,421评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,830评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,501评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,689评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,506评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,564评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,286评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,826评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,875评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,114评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,705评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,269评论 2 341

推荐阅读更多精彩内容

  • 没了光 就如同没有眼睛一样 只有声音的世界里 浪子不再远行追逐美景 情人不再牵手等待日出 人们开始忘记一幅幅面孔 ...
    MikeVan阅读 753评论 0 1
  • 平淡的日子也有平淡的幸福,年纪越长越发现,原来生活中的幸福是你用什么样的眼光来看待的,你觉得幸福,日子久了别人从你...
    是蓉蓉呐阅读 154评论 0 0
  • 那年!我们18岁 是非曲折早已司空见惯,置之不理,我只是专属自己的路人甲,选择默然走远。 人生的道路坎坷崎岖,装作...
    阁中S帝子阅读 117评论 0 3
  • 昨夜风拂疏帘,雨轻敲我窗, 于是抚一卷诗书 闲吟一阙清词 有墨香婉约袭来暗盈袖 恍惚间 见一女子袅袅莲步独上兰舟 ...
    金指尖的花园阅读 496评论 0 4
  • 四月,经历了死别,虽然是注定要发生的事情,真的发生的那一刻也很不舍。那个说这个小鬼,那个说红烧肉好吃的人,也不会再...
    面善_阅读 479评论 0 0