faiss 安装

faiss c++ 源码编译

0.写在前面

参考下述文章的编译安装步骤同时将自己遇到的错误进行梳理解决:

https://juejin.im/post/5bed7cebe51d454e5b5f2c23 十分感谢此文章~

遇到问题多去faiss github里面的 issues中找找,往往总能找到你想要的?

https://github.com/facebookresearch/faiss

1.安装Python环境

如果使用python接口,不需要对源码有更深了解的话,可以直接用 conda 安装,简单方便

#下载anaconda包并安装
wget https://repo.anaconda.com/archive/Anaconda3-5.3.0-Linux-x86_64.sh
chmod +x Anaconda3-5.3.0-Linux-x86_64.sh
bash Anaconda3-5.3.0-Linux-x86_64.sh

#手动添加环境变量
vi $HOME/.bashrc
export PATH="$HOME/anaconda3/bin:$PATH"
source $HOME/.bashrc

#安装faiss 
conda install faiss-cpu -c pytorch #cpu版本

conda install faiss-gpu -c pytorch # [DEFAULT]For CUDA8.0  gpu版本
conda install faiss-gpu cuda90 -c pytorch # For CUDA9.0    gpu版本
conda install faiss-gpu cuda91 -c pytorch # For CUDA9.1    gpu版本

2.编译源码

2.1 C++环境

2.1.1 相关库安装并编译

# 安装gcc:
yum install gcc 
# 安装g++:
yum install gcc-c++ 
# 查看gcc版本,如果是gcc4.8以下建议升级到gcc4.8
gcc -v

#安装OpenBLAS
git clone https://github.com/xianyi/OpenBLAS.git
cd OpenBLAS
make FC=gfortran #如果没有 安装yum install gcc-gfortran
make install
ln -s /opt/OpenBLAS/lib/libopenblas.so  /usr/lib/libopenblas.so
LD_LIBRARY_PATH=/opt/OpenBLAS/lib
export LD_LIBRARY_PATH

#安装lapack
wget http://www.netlib.org/lapack/lapack-3.4.2.tgz
tar -zxf lapack-3.4.2.tgz
cd lapack-3.4.2
cp ./INSTALL/make.inc.gfortran ./
mv make.inc.gfortran make.inc
vi Makefile # 修改如下
[#lib: lapacklib tmglib
lib: blaslib variants lapacklig tmglib]
make
cd lapacke
make  
cp include/*.h /usr/include   
cd .. 
cp *.a /usr/lib 

# 编译Faiss源码
git clone https://github.com/facebookresearch/faiss.git
cd faiss
cp example_makefiles/makefile.inc.Linux ./makefile.inc
./configure  # 需注意地方。请看注意事项部分
make misc/test_blas
./misc/test_blas
make
make install

2.1.2 测试

如果你正确编译了Faiss 那么 运行一下命令可以测试c++的接口是否可以使用(如果没有下载相应的SIFT1M数据集的话,运行程序时会报没有文件的错误)

make demos
./demo_sift1M

 

2.1.3 注意事项及问题

(1) 确保默认 python 为python2 ,否则lapack库编译安装时会出错

Linux 修改系统默认python版本方法:

https://blog.csdn.net/white_idiot/article/details/78240298

(2) 确保python2中安装了numpy

ps: python版本多的时候注意pip的版本哦~

安装速度慢的话记得换源~

(3) yum安装报错:ImportError: No module named urlgrabber.grabber

解决办法:

vi /usr/bin/yum
vi /usr/libexec/urlgrabber-ext-down

文件中首行python的路径改成相同的 。urlgrabber-ext-down与yum 中一致

(4)./configure 时注意查看你缺少什么 后面的问题很多就是由于你所缺的

如果你没有nvcc 那么要使用./configure --without-cuda 否则会出错。我的错误是在编译时出现诸如:

IndexScalarQuantizer.cpp:1110:56: error: ‘_mm256_cvtepu8_epi16’ was not declared in this scope
                 (_mm_loadu_si128((__m128i*)(code1 + i)));
                                                        ^
IndexScalarQuantizer.cpp:1112:56: error: ‘_mm256_cvtepu8_epi16’ was not declared in this scope, and no declarations were found by argument-dependent lookup at the point of instantiation [-fpermissive]
                 (_mm_loadu_si128((__m128i*)(code2 + i)));

(5) 编译时没有error,跑demo时出现问题

make demos 无问题

./demos/demo_sift1M 出错

error while loading shared libraries: libfaiss.so: cannot open shared object file: No such file or directory

解决方法将libfaiss.so添加到$LD_LIBRARY_PATH中

$LD_LIBRARY_PATH
cp libfaiss.so $LD_LIBRARY_PATH

在此过程中我尝试使用g++ 然后手加地址进行编译

g++ -o demo_sift1M demo_sift1M.cpp -L/libfaiss.so所在地址 -lfaiss

出现了错误:

error: #error This file requires compiler and library support for the ISO C++ 2011 standard. This support is currently experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.

修改为

g++ -std=c++11 -o test demo_sift1M.cpp -L/libfaiss.so所在地址 -lfaiss

然鹅 还是行不通! 还是要把libfaiss.so添加到$LD_LIBRARY_PATH中

(6) 运行./misc/test_blas 测试blas时出现下方情况是正常的,不是错误哦

BLAS test
errors=
 0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
 0.000 -0.000  0.000  0.000  0.000  0.000  0.000 -0.000  0.000  0.000  0.000  0.000 -0.000  0.000  0.000 -0.000 -0.000  0.000  0.000  0.000
 0.000  0.000  0.000  0.000  0.000 -0.000  0.000 -0.000 -0.000  0.000  0.000  0.000  0.000 -0.000  0.000  0.000  0.000  0.000  0.000  0.000
 0.000  0.000  0.000  0.000  0.000 -0.000  0.000 -0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000
 0.000  0.000  0.000  0.000 -0.000  0.000 -0.000  0.000 -0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.000
 0.000  0.000  0.000  0.000  0.000 -0.000  0.000  0.000  0.000 -0.000 -0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.000  0.000
 0.000  0.000 -0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.000  0.000  0.000  0.000 -0.000  0.000  0.000  0.000  0.000 -0.000
 0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.000 -0.000  0.000  0.000  0.000  0.000
 0.000  0.000  0.000 -0.000  0.000 -0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.000 -0.000  0.000  0.000  0.000  0.000  0.000
 0.000  0.000  0.000 -0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000  0.000 -0.000  0.000  0.000  0.000  0.000  0.000
Intentional Lapack error (appears only for 64-bit INTEGER):
info=0000064b00000000
Lapack uses 32-bit integers

2.2 python接口

2.2.1 编译安装

make py
cd python
python setup.py install #注意这一步,否则除python路径下无法import faiss

2.2.2 测试

python -c 'import faiss'

2.2.3 注意事项及问题

(1) swig

要使用python接口就要使用到swig 请确认是否安装了该包,并且确认其版本是否是3

(yum install swig 默认安装的是版本2的,要在网站上自己下载包进行编译安装)

具体请参考:

https://blog.csdn.net/Nankys/article/details/86219705

make py时可能出现以下错误,其原因及解决办法:

问题原因:无swig

make -C python
make[1]: Entering directory `/faiss_c++/faiss-master/python'
python -c++ -Doverride= -I../ -DSWIGWORDSIZE64 -o swigfaiss.cpp swigfaiss.swig
  File "", line 1
    ++
     ^
SyntaxError: invalid syntax
make[1]: [swigfaiss.cpp] Error 1 (ignored)
g++ -std=c++11 -DFINTEGER=int  -fopenmp  -fPIC -m64 -Wno-sign-compare -g -O3 -Wall -Wextra -mpopcnt -mavx2 -mf16c -I/usr/local/ext2/anaconda2/include/python2.7 -I/usr/local/ext2/anaconda2/include/python2.7 -I/usr/local/ext2/anaconda2/lib/python2.7/site-packages/numpy/core/include \
               -I../ -c swigfaiss.cpp -o swigfaiss.o
g++: error: swigfaiss.cpp: No such file or directory
g++: fatal error: no input files
compilation terminated.
make[1]: *** [swigfaiss.o] Error 4
make[1]: Leaving directory `/faiss_c++/faiss-master/python'
make: *** [py] Error 2

问题原因:swig版本不对

make -C python
make[1]: Entering directory `/faiss_c++/faiss-master/python'
swig -python -c++ -Doverride= -I../ -DSWIGWORDSIZE64 -o swigfaiss.cpp swigfaiss.swig
../Index.h:72: Error: Syntax error in input(3).
make[1]: *** [swigfaiss.cpp] Error 1
make[1]: Leaving directory `/faiss_c++/faiss-master/python'
make: *** [py] Error 2

(2) make py成功后,找不到faiss包

如果只有在python路径下可以Import faiss 其他路径无法import

可能你没有执行python setup.py install 这步

faiss python 安装

1. conda 

conda install 在线/离线

2. pip 

https://libraries.io/pypi/faiss-cpu

pip install faiss-cpu==1.6.1

 

你可能感兴趣的:(图像检索)