本文只介绍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文件,给OPTSNOOPT这两个设置都加上-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 源码安装相关推荐

  1. Ubuntu下源码编译VirtualBox六 —— 源码编译(5)

    接前一篇文章<Ubuntu下源码编译VirtualBox五 -- 源码编译(4)>,链接如下: Ubuntu下源码编译VirtualBox五 -- 源码编译(4)_蓝天居士的博客-CSDN ...

  2. Ubuntu下源码编译VirtualBox五 —— 源码编译(4)

    接前一篇文章<Ubuntu下源码编译VirtualBox四 -- 源码编译(3)>,链接如下: Ubuntu下源码编译VirtualBox四 -- 源码编译(3)_蓝天居士的博客-CSDN ...

  3. tensorflow源码编译教程_源码编译安装tensorflow 1.8

    参考官方指南 基本要求 官网测试过的源代码配置如下: image 也就是说,按照这个版本安装的话不应该再产生版本的问题了. 我的配置 ubuntu 16 python 2.7 nccl 2.3 gcc ...

  4. 源码编译mysql5.5_源码编译安装MySQL5.5

    前面的blog都有介绍mysql数据库存,不过那都是通用二进制的格式安装的,本文主要介绍在Centos6.5系统上源码编译安装MySQL数据库以及如何在Centos5系列版本的系统上如何编译安装cma ...

  5. 基于YUM安装与源码编译或二进制多实例安装Mariadb,mysql

    基于YUM 1 安装 yum install mariadb 2 创建多实例对应的目录结构 mkdir /mysql/{3306,3307,3308}/{data,etc,socket,log,bin ...

  6. python 源码编译教程_python源码编译

    尝试通过源码自己编译 Python,使用的系统是 Ubuntu14.04 LTS. 首先去官网下载源码,地址:源码下载.下载完成之后,解压源码: 1tar -zxvf Python-2.7.12.tg ...

  7. Ubuntu下源码编译VirtualBox一 —— 源码下载

    VirtualBox想必大家都不陌生,做Linux开发的尤其是嵌入式Linux开发的人应该基本都知道或玩过VMware和VirtualBox.但通常都是为了在Windows电脑上能够使用Linux环境 ...

  8. ES6转码(编译)工具——Babel转码器、Traceur转码器

    当ES6不兼容时,需要用到转码工具 1.Babel转码器: Babel是一个广泛使用的ES6转码器,可以将ES6代码转为ES5代码,从而在现有环境执行. 这意味着,你可以用ES6的方式编写程序,又不用 ...

  9. 常见的ES6转码(编译)工具——Babel转码器、Traceur转码器

    在浏览器里面如何使用? 现在ES6的使用也是一个新趋势,下面就来讲解转码的常见方法 当ES6不兼容时,需要用到转码工具 1.Babel转码器: Babel是一个广泛使用的ES6转码器,可以将ES6代码 ...

最新文章

  1. R语言使用lm构建线性回归模型、并将目标变量对数化实战:可视化模型预测输出与实际值对比图、可视化模型的残差、模型系数(coefficient)、模型总结信息(summary)、残差总结信息
  2. 27道高频Spring面试题,你能答对几个?
  3. sqlmap源码入门笔记系列
  4. Hammock for REST
  5. 西门子g120c面板参数设定_西门子PCS7模拟量单位设置
  6. Zabbix 5.0 监控 SSH 登录
  7. 透视投影时相机的参数设置
  8. PHP面试技巧 之 职场暗语知多少?!
  9. vtkContourFilter等值面(线)
  10. Node 框架之sails
  11. 复杂网络的任意子节点的网络最短距离
  12. 卐 4-3D图形的数学
  13. 第三方SDK接入--微信
  14. mysql查询补齐12个月_MySQL查询12个月数据,无数据补0
  15. Tableau笔记(10)转置和拆分
  16. 雨听 | 英语学习笔记(六)~作文范文:公务员考试的热潮
  17. Java实现TCP的长短链接
  18. java 1st 2nd 3rd 4th_1st怎么输入excel “st”在1的右上角 EXCEL excel 1st 2nd 3rd 4th 怎么设置上标 如何改为上标...
  19. FISCO-BCOS应用实战:区块链实战应用开发分享
  20. html 最简单的网页制作,HTML入门----简单网页制作

热门文章

  1. .net中的托管、非托管
  2. 数字电路与系统学习笔记(戚金清)(一)
  3. 不安装oracle数据库客户端,使用sqlplus
  4. python爬取历史天气查询_python爬虫爬取各个城市历史天气及数据可视化
  5. 怎么用python读.dat文件
  6. 大作业-点灯机器人-记录心得(2)-----基础铺垫-bmp相关
  7. ISO15693协议的Inventory
  8. 【计算机网络】思科实验(2):交换机间的VLAN通信
  9. ppt模板下载keyppt.cn
  10. 电脑移动热点无法开启,一直显示正在断开;没有要共享的网络连接,但你的Internet仍打开