faiss CPU版本+GPU版本安裝

faiss安裝

faiss是facebook開發的有CPU版本和GPU版本的求密集向量類似性和進行密集向量聚類的庫。html

faiss用c++編寫,安裝faiss須要在github上下載其c++源碼並用make編譯安裝python

 

faiss僅有的兩個依賴包:blas和lapacklinux

 

 CPU 方面,Facebook 大量利用了:c++

多線程以充分利用多核性能並在多路 GPU 上進行並行搜索。git

BLAS 算法庫經過 matrix/matrix 乘法進行高效、精確的距離計算。沒有 BLAS,高效的強力執行很難達到最優狀態。 BLAS/LAPACK 是惟一一個 Faiss 必須的前提軟件。github

機器 SIMD 矢量化 popcount 被用於加速孤立矢量的距離計算。算法

GPU方面:ubuntu

對於從前的類似性搜索 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 搜索引擎。vim

研究領域的許多注意力被放到了高效的 tiling 策略,面向 approximate 搜索的 kernels 執行。多 GPU 支持用過粉碎或複製數據來提供。開發者並不會受單 GPU 顯存大小的限制。半精度浮點支持  (float16) 也有提供,可在支持的 GPU 上進行完整 float16 運算,或者更早 GPU 架構所提供的的中級 float16 存儲。咱們發現 float16  這樣的編碼矢量能在幾乎不損失精度的前提下進行加速。centos

1、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)。

一、從github上將c++項目clone下來

git clone https://github.com/facebookresearch/faiss

 

二、打開下載的項目,以下

 

 

錯誤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 這兩個庫目錄的區別參見:http://www.javashuo.com/article/p-mqdocxwr-dd.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版本安裝成功!

 

2、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 開發環境
  • 結束

一、搭建 GPU 開發環境

GPU 開發環境是 GPU-FAISS 開發的基礎,主要分爲安裝CUDA並導入CuDNN關聯、配置環境變量三部分。

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.二、配置環境變量

爲開發用戶定製環境變量。

# 編輯文件。 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

二、安裝

# 進入gpu目錄 &編譯。 cd gpu make py

測試:在faiss文件夾下,進入python2命令行,執行import faiss,import _swigfaiss_gpu,執行 成功則安裝成功。

 

相關文章
相關標籤/搜索