(一)Graphvite源码编译安装——faiss 源码安装
本文只介紹graphvite依賴庫faiss 的安裝,graphvite的詳細安裝過程請參考(二)Graphvite 安裝過程整理
---------------------------分割線----------------------------------------------------------------------------------
這是實驗室安排我調試的第三個項目的源碼,記錄一下今天工作,僅供參考,歡迎交流!
github 源碼地址:https://github.com/DeepGraphLearning/graphvite.git
安裝方法有我就不過多說了,就說我遇到的問題吧!
我的系統是Centos 7
我在make的時候遇到了這樣一個問題:
make error: An implementation of BLAS is required but none was found.具體如下:
checking for sgemm_ in -lmkl_intel_lp64... no checking for sgemm_ in -lmkl... no checking for sgemm_ in -lopenblas... no checking for ATL_xerbla in -latlas... no checking for sgemm_ in -lblas... no checking for sgemm_ in -framework vecLib... no checking for sgemm_ in -lcxml... no checking for sgemm_ in -ldxml... no checking for sgemm_ in -lscs... no checking for sgemm_ in -lcomplib.sgimath... no checking for sgemm_ in -lblas... (cached) no checking for sgemm_ in -lblas... (cached) no configure: error: An implementation of BLAS is required but none was found. make[2]: *** [faiss/src/faiss-stamp/faiss-configure] Error 1 make[1]: *** [CMakeFiles/faiss.dir/all] Error 2 make: *** [all] Error 2解決方案:
1、首先定位錯誤:從error描述應該是在配置faiss的時候BLAS這個庫沒有安裝,那么問題來了這個項目是graphvite 跟faiss有什么關系,這時我打開CMakeList.txt文件,通過查看源碼發現,該項目會判斷是否安裝了faiss這個庫,如果沒有就會給你安裝,源碼如下:
# faiss if (NOT FAISS_PATH)ExternalProject_Add(faissGIT_REPOSITORY https://github.com/facebookresearch/faiss.gitUPDATE_DISCONNECTED ${SKIP_UPDATE}PREFIX faissSOURCE_DIR ${EXTERNAL_DIR}/faissBINARY_DIR ${EXTERNAL_DIR}/faissINSTALL_DIR ${PROJECT_BINARY_DIR}/faissCONFIGURE_COMMAND test -e makefile.inc ||${EXTERNAL_DIR}/faiss/configure --with-cuda=${CUDA_ROOT} --with-cuda-arch=${CUDA_ARCH}BUILD_COMMAND test -e libfaiss.so || make -jINSTALL_COMMAND test -e ${PROJECT_BINARY_DIR}/faiss/include/faiss/gpu/GpuIndexFlat.h ||make install prefix=${PROJECT_BINARY_DIR}/faiss)include_directories(${PROJECT_BINARY_DIR}/faiss/include)link_directories(${PROJECT_BINARY_DIR}/faiss/lib)set(FAISS_LIBRARY ${PROJECT_BINARY_DIR}/faiss/lib/libfaiss.so) else()get_filename_component(FAISS_PARENT ${FAISS_PATH} DIRECTORY)include_directories(${FAISS_PARENT})link_directories(${FAISS_PATH})set(FAISS_LIBRARY ${FAISS_PATH}/libfaiss.so) endif()應該就是在faiss過程中出了問題,根據作者建議安裝faiss,再將faiss路徑導入。
2、安裝faiss
通過查閱資料安裝faiss需要依賴BLAS這個庫,所以我先安裝了OpenBLAS。由于intel 的BLAS 不是開源的,因為選擇OpenBLAS.
2.1 安裝OpenBLAS
首先下載源碼,github地址:https://github.com/xianyi/OpenBLAS.git
根據官方安裝教程,下載之后無需cmake,直接make即可,但是我make的時候又遇到一個問題:
collect2: error: ld returned 1 exit status make[1]: *** [sblat2] Error 1 make[1]: *** Waiting for unfinished jobs.... /usr/bin/ld: ../libopenblas_haswellp-r0.3.8.dev.a(dgemv_thread_n.o): TLS transition from R_X86_64_TLSLD to R_X86_64_TPOFF32 against `y_dummy' at 0x1d2 in section `.text.dgemv_thread_n' failed ../libopenblas_haswellp-r0.3.8.dev.a: error adding symbols: Bad value collect2: error: ld returned 1 exit status make[1]: *** [dblat2] Error 1 /usr/bin/ld: ../libopenblas_haswellp-r0.3.8.dev.a(cgemv_thread_n.o): TLS transition from R_X86_64_TLSLD to R_X86_64_TPOFF32 against `y_dummy' at 0x1d9 in section `.text.cgemv_thread_n' failed ../libopenblas_haswellp-r0.3.8.dev.a: error adding symbols: Bad value collect2: error: ld returned 1 exit status make[1]: *** [cblat2] Error 1 /usr/bin/ld: skipping /incompatible usr//libbin//libpthread.so.0ld :when skippingsearching incompatiblefor //liblib//libpthread.so.0libpthread.so.0 when/ usrsearching/ binfor/ ld/:lib /cannotlibpthread.so.0 find/ usr//libbin//libpthread.so.0ld :/ usrcannot/ binfind/ ld/:lib /cannotlibpthread.so.0 find/ usr//usrbin//libld/:libpthread_nonshared.a cannot find /usr/lib/libpthread_nonshared.a collect2: error: ld returned 1 exit status collect2: error: ld returned 1 exit status /usr/bin/ld: ../libopenblas_haswellp-r0.3.8.dev.a(zgemv_thread_n.o): TLS transition from R_X86_64_TLSLD to R_X86_64_TPOFF32 against `y_dummy' at 0x1d9 in section `.text.zgemv_thread_n' failed ../libopenblas_haswellp-r0.3.8.dev.a: error adding symbols: Bad value collect2: error: ld returned 1 exit status make[1]: *** [dblat1] Error 1 /usr/bin/ld: skipping incompatible /lib/libpthread.so.0 when searchingmake[1]: *** [sblat1] Error 1for/lib/libpthread.so.0 /usr/bin/ld: cannot find /lib/libpthread.so.0 /usr/bin/ld: cannot find /usr/lib/libpthread_nonshared.a collect2: error: ld returned 1 exit status /usr/bin/ld: skipping incompatible /lib/libpthread.so.0make[1]: *** [zblat2] Error 1whensearching for /lib/libpthread.so.0 /usr/bin/ld: cannot find /lib/libpthread.so.0 /usr/bin/ld: cannot find /usr/lib/libpthread_nonshared.a collect2: error: ld returned 1 exit status make[1]: *** [cblat1] Error 1 make[1]: *** [zblat1] Error 1 /usr/bin/ld: skipping incompatible /lib/libpthread.so.0 when searching for /lib/libpthread.so.0 /usr/bin/ld: cannot find /lib/libpthread.so.0 /usr/bin/ld: cannot find /usr/lib/libpthread_nonshared.a collect2: error: ld returned 1 exit status make[1]: *** [sblat3] Error 1 /usr/bin/ld: skipping incompatible /lib/libpthread.so.0 when searching for /lib/libpthread.so.0 /usr/bin/ld: cannot find /lib/libpthread.so.0 /usr/bin/ld: cannot find /usr/lib/libpthread_nonshared.a collect2: error: ld returned 1 exit status make[1]: *** [dblat3] Error 1 /usr/bin/ld: skipping incompatible /lib/libpthread.so.0 when searching for /lib/libpthread.so.0 /usr/bin/ld: cannot find /lib/libpthread.so.0 /usr/bin/ld: cannot find /usr/lib/libpthread_nonshared.a collect2: error: ld returned 1 exit status make[1]: *** [cblat3] Error 1 /usr/bin/ld: skipping incompatible /lib/libpthread.so.0 when searching for /lib/libpthread.so.0 /usr/bin/ld: cannot find /lib/libpthread.so.0 /usr/bin/ld: cannot find /usr/lib/libpthread_nonshared.a collect2: error: ld returned 1 exit status make[1]: *** [zblat3] Error 1 make[1]: Leaving directory `/home/deng/usr/local/OpenBLAS/test' make: *** [tests] Error 2解決方案:看錯誤應該是鏈接錯誤,在/usr/lib/ 目錄下找不到libpthread.so.0與libpthread_nonshared.a,通過在find 查找發現在/usr/lib64/目錄下,
添加該目錄到鏈接庫export LD_LIBBRARY_PATH=/usr/lib64。如下:
方法1——添加庫路徑(經測試不行,雖然通過echo $LD_LIBRARY_PATH 查看到已經添加,但是就是不行。歡迎熟悉的朋友講講。)
export LD_LIBRARY_PATH=-L/usr/lib64:$LD_LIBRARY_PATH已解決:添加庫路徑要指定到.so。如下:
export LD_LIBRARY_PATH=-L/usr/lib64/libpthread.so.0:$LD_LIBRARY_PATH export LIBRARY_PATH=-L/usr/lib64/libpthread_nonshared.a:$LIBRARY_PATH方法2——將/usr/lib64 添加到系統鏈接庫,需要sudo權限
vi /etc/ld.so.conf /lib64 /usr/lib64再次make成功,之后就是make install。
make make PREFIX=/path/to/your/OpenBLAS/ install未完待續。。
2.2?安裝lapack
1、下載解壓lapack 源碼
nohup wget http://www.netlib.org/lapack/lapack-3.8.0.tar.gz > lapack.log 2>&1 & tar -xvf lapack-3.8.0.tar.gz cd lapack-3.8.02、編譯lapack 所有文件
cp INSTALL/make.inc.gfortran make.inc # 由于我系統是linux版本的,所以這里我復制的是gfortran的make.inc make在make 之前有兩個工作要做:
a.修改lapack-3.4.2/Makefile,因為lapack以來于blas庫,所以需要做如下修改
#lib: lapacklib tmglib lib: blaslib variants lapacklig tmglib?b.編輯make.inc文件,給OPTS和NOOPT這兩個設置都加上-fPIC選項。如果是64位系統,還需要加上-m64選項。
FORTRAN = gfortran OPTS = -O2 -frecursive -fPIC -m64 DRVOPTS = $(OPTS) NOOPT = -O0 -frecursive -fPIC -m64 LOADER = gfortran如果你的系統是64位的,就必須有b這一步。不然就會報錯。
3、編譯包含lapack的C語言接口文件
cd lapack make4、安裝
由于lapack的makefile文件中沒有make isntall 命令,需要手工進行安裝。
# 將lapacke的頭文件復制到系統頭文件目錄 cp include/*.h /usr/include # 返回到 lapack-3.4.2 目錄 cd .. # 將生成的所有庫文件復制到系統庫目錄 cp *.a /usr/lib?(建議將頭文件與庫文件復制到用戶目錄下,不要復制到系統目錄,后面可再通過export 指定路徑,注意庫路徑一定要指定到.so?)
?2.3 安裝faiss
此時OpenBLAS 跟LAPACK均已經安裝完成,但是沒有添加到庫路徑。
1、添加OpenBLAS 跟LAPACK庫路徑
這里卡了我很久,剛開始通過設置LD_LIBRARY_PATH的方法不知道為什么沒用,后來發現添加動態依賴庫要指定到.so文件,僅僅指定到lib目錄是找不到的。下面是我的設置方法:
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/your/lib/.so" source ~/.bashrc?2、將OpenBLAS 跟LAPACK庫復制到系統目錄(這種方法對于非root用戶無法使用)
3、下載編譯?faiss
下載地址:https://github.com/facebookresearch/faiss.git
(建議安裝release 版本的,本文用的是v1.5.3)
根據官方按照教程,首先是根據自己需要安裝CPU\GPU版本,本文選擇的是GPU版本,CUDA-10.0。關于CUDA的切換可以參考這篇博客:https://blog.csdn.net/u010821666/article/details/79957071
?
然而我發現當我選擇安裝GPU版本的時候卻報了跟之前安裝graphvite一樣的錯誤。(之前export OpenBLAS 為導出正確)
./configure
./configure --with-cuda=/usr/local/cuda-10.0 --prefix=/home/deng/usr/local/faisserror:
configure: error: An implementation of BLAS is required but none was found.之前分析有誤, 不是這個原因,按照參考資料3、4的安裝方法在這里會失敗,建議按照如下方法處理:
應該是先export 導出動態鏈接庫libopenblas.so 的路徑的環境變量LD_LIBRARY_PATH,如下:
vim ~/.bash_project # 或者編輯vim ~/.bashrc export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/home/cobuild/openblas/lib/libopenblas.so" # 添加動態庫libopenblas.so 的環境變量 source ~/.bash_project?
再執行./configure 即可成功生成makefile.inc,之后再make && make install 即可。
./configure --with-cuda=/usr/local/cuda-10.0 --prefix=/home/deng/usr/local/faiss make && make install安裝成功后會在你設置的安裝目錄下添加include 與 lib ,如下:
include 包含文件:
lib 包含文件:
至此faiss 環境就配置好了,下一篇文章我會介紹graphvite 的安裝過程以及問題解決!
下一篇博客鏈接:(二)Graphvite 安裝過程整理
參考資料:
1、非root用戶安裝OpenBLAS
2、ubuntu lapack安裝與使用
3、手把手教你安裝Faiss(Linux)
4、FAISS安裝與使用
總結
以上是生活随笔為你收集整理的(一)Graphvite源码编译安装——faiss 源码安装的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 360天擎与旧版OA冲突的问题
- 下一篇: 链表的基本操作--c语言