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
一、從github上將c++項目clone下來
git clone https://github.com/facebookresearch/faiss
二、打開下載的項目,以下
發現有名爲makefile的文件,則直接make命令編譯項目,發現報錯,說缺乏makefile.inc文件
通過查資料,發現使用make編譯的項目必定有makefile文件,同時在makefile文件中,還可能會引用makefile.inc文件
看到項目中有一個example_makefiles文件夾,進入,看到裏面有多種inc文件,由於是ubuntu,我選用makefile.inc.Linux,將這個文件拷貝到faiss目錄中,更名爲makefile.inc
再次執行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
編譯完成後發現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,執行完成。
完整的安裝步驟:
GPU 開發環境是 GPU-FAISS 開發的基礎,主要分爲安裝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/
爲開發用戶定製環境變量。
# 編輯文件。 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