(一)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.0
2、编译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
make
4、安装
由于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/faiss
error:
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 源码安装相关推荐
- Ubuntu下源码编译VirtualBox六 —— 源码编译(5)
接前一篇文章<Ubuntu下源码编译VirtualBox五 -- 源码编译(4)>,链接如下: Ubuntu下源码编译VirtualBox五 -- 源码编译(4)_蓝天居士的博客-CSDN ...
- Ubuntu下源码编译VirtualBox五 —— 源码编译(4)
接前一篇文章<Ubuntu下源码编译VirtualBox四 -- 源码编译(3)>,链接如下: Ubuntu下源码编译VirtualBox四 -- 源码编译(3)_蓝天居士的博客-CSDN ...
- tensorflow源码编译教程_源码编译安装tensorflow 1.8
参考官方指南 基本要求 官网测试过的源代码配置如下: image 也就是说,按照这个版本安装的话不应该再产生版本的问题了. 我的配置 ubuntu 16 python 2.7 nccl 2.3 gcc ...
- 源码编译mysql5.5_源码编译安装MySQL5.5
前面的blog都有介绍mysql数据库存,不过那都是通用二进制的格式安装的,本文主要介绍在Centos6.5系统上源码编译安装MySQL数据库以及如何在Centos5系列版本的系统上如何编译安装cma ...
- 基于YUM安装与源码编译或二进制多实例安装Mariadb,mysql
基于YUM 1 安装 yum install mariadb 2 创建多实例对应的目录结构 mkdir /mysql/{3306,3307,3308}/{data,etc,socket,log,bin ...
- python 源码编译教程_python源码编译
尝试通过源码自己编译 Python,使用的系统是 Ubuntu14.04 LTS. 首先去官网下载源码,地址:源码下载.下载完成之后,解压源码: 1tar -zxvf Python-2.7.12.tg ...
- Ubuntu下源码编译VirtualBox一 —— 源码下载
VirtualBox想必大家都不陌生,做Linux开发的尤其是嵌入式Linux开发的人应该基本都知道或玩过VMware和VirtualBox.但通常都是为了在Windows电脑上能够使用Linux环境 ...
- ES6转码(编译)工具——Babel转码器、Traceur转码器
当ES6不兼容时,需要用到转码工具 1.Babel转码器: Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在现有环境执行. 这意味着,你可以用ES6的方式编写程序,又不用 ...
- 常见的ES6转码(编译)工具——Babel转码器、Traceur转码器
在浏览器里面如何使用? 现在ES6的使用也是一个新趋势,下面就来讲解转码的常见方法 当ES6不兼容时,需要用到转码工具 1.Babel转码器: Babel是一个广泛使用的ES6转码器,可以将ES6代码 ...
最新文章
- R语言使用lm构建线性回归模型、并将目标变量对数化实战:可视化模型预测输出与实际值对比图、可视化模型的残差、模型系数(coefficient)、模型总结信息(summary)、残差总结信息
- 27道高频Spring面试题,你能答对几个?
- sqlmap源码入门笔记系列
- Hammock for REST
- 西门子g120c面板参数设定_西门子PCS7模拟量单位设置
- Zabbix 5.0 监控 SSH 登录
- 透视投影时相机的参数设置
- PHP面试技巧 之 职场暗语知多少?!
- vtkContourFilter等值面(线)
- Node 框架之sails
- 复杂网络的任意子节点的网络最短距离
- 卐 4-3D图形的数学
- 第三方SDK接入--微信
- mysql查询补齐12个月_MySQL查询12个月数据,无数据补0
- Tableau笔记(10)转置和拆分
- 雨听 | 英语学习笔记(六)~作文范文:公务员考试的热潮
- Java实现TCP的长短链接
- java 1st 2nd 3rd 4th_1st怎么输入excel “st”在1的右上角 EXCEL excel 1st 2nd 3rd 4th 怎么设置上标 如何改为上标...
- FISCO-BCOS应用实战:区块链实战应用开发分享
- html 最简单的网页制作,HTML入门----简单网页制作