手把手教你安裝Faiss(Linux)

woaw發表於2018-11-15

前言

由於最近專案組引用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

複製程式碼

可以在專案根目錄下看見編譯好的靜態庫和動態庫

手把手教你安裝Faiss(Linux)

步驟四:測試Faiss,參考INSTALL.md上的測試用例,這裡就不贅述了

A bit longer example runs and evaluates Faiss on the SIFT1M dataset. To run it, please download the ANN_SIFT1M dataset from 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 開源軟體的編譯流程,按照這種邏輯一定能編譯出來的。

之後會開始閱讀原始碼以及一些基本的使用技巧,不定期更新,畢竟我也是個萌新哈哈哈。

致謝

部分內容參考一下連結,沒有和作者取得聯絡就直接使用了,這裡表示感謝一下 blog.csdn.net/baiyang3/ar… 作者:baiyang3 blog.csdn.net/u013017173/… 作者:楓依流水

相關文章