前言
由於最近專案組引用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,參考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/… 作者:楓依流水