参考下述文章的编译安装步骤同时将自己遇到的错误进行梳理解决:
https://juejin.im/post/5bed7cebe51d454e5b5f2c23 十分感谢此文章~
遇到问题多去faiss github里面的 issues中找找,往往总能找到你想要的?
https://github.com/facebookresearch/faiss
如果使用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版本
# 安装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
如果你正确编译了Faiss 那么 运行一下命令可以测试c++的接口是否可以使用(如果没有下载相应的SIFT1M数据集的话,运行程序时会报没有文件的错误)
make demos
./demo_sift1M
(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
make py
cd python
python setup.py install #注意这一步,否则除python路径下无法import faiss
2.2.2 测试
python -c 'import faiss'
(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 这步
conda install 在线/离线
https://libraries.io/pypi/faiss-cpu
pip install faiss-cpu==1.6.1