faiss python安装_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

你可能感兴趣的:(faiss,python安装)