1. 程式人生 > >faiss CPU版本+GPU版本安裝

faiss CPU版本+GPU版本安裝

apt-get bin 導入 vim vid 這一 修改權限 1.2 spa

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版本安裝