faiss CPU版本+GPU版本安裝
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 和
研究領域的許多註意力被放到了高效的 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版本安裝