CentOS7安装GPU版本的faiss详细过程
1. 拉取源码
faiss最新版本应该是1.6.1,我们git clone的时候指定这个tag
git clone -b v1.6.1 https://github.com/facebookresearch/faiss.git
2. 编译CPU版本
接着
cd faiss
./configure --with-cuda=/usr/local/cuda
这里我的cuda安装在/usr/local/cuda 大家可以根据实际情况替换为自己的cuda安装路径,如果不指定这个会报错
Could't find cuda.h
configure完毕,因为faiss依赖blas,所以先测试一下系统是否已经正确安装了blas
执行
make misc/test_blas
然后
./misc/test_blas
如果过程中报错,你需要先安装一款blas 比如openblas,google或者百度一下,很简单;如果过程中提示Intentional Lapack error (appears only for 64-bit INTEGER) 还有什么 Lapack uses 32-bit integers 则不必担心 这个只是说blas使用32位int计算,除非你的索引vector里元素有int64否则不用管,id是int64是没影响的。
测试完blas没问题后,开始构建faiss,执行
make
然后
sudo make install
make的时候可能会报这个错
nvcc fatal : Unsupported gpu architecture 'compute_75'
make: *** [gpu/GpuIndex.o] Error 1
解决方法是根据你的gpu卡找到对应的compute capability,常见的比如
Tesla K80 3.7
Tesla K40 3.5
Tesla K20 3.5
Tesla C2075 2.0
Tesla C2050/C2070 2.0
Tesla M40 5.2
Tesla K80 3.7
Tesla K40 3.52
NVIDIA TITAN X 6.1
GeForce GTX 1080 6.1
GeForce GTX 1070 6.1
GeForce GTX 1060 6.1
GeForce GTX TITAN X 5.2
GeForce GTX TITAN Z 3.5
GeForce GTX TITAN Black 3.5
GeForce GTX TITAN 3.5
GeForce GTX 980 Ti 5.2
GeForce GTX 980 5.2
GeForce GTX 970 5.2
然后修改makefile.inc,找到CUDA_ARCH开头这一行,修改成
CUDA_ARCH = -gencode=arch=compute_52,code=sm_52
根据你自己卡的compute capability改
faiss构建完毕后,测试一下 执行 cd demos && make 然后
./demo_ivfpq_indexing
如果报错 error while loading shared libraries: libfaiss.so: cannot open shared object file: No such file or directory, 解决办法是
export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH"
而且最好把这行加到你的~/.bashrc里,LD_LIBRARY_PATH加上之后,再运行,如果看到类似下面的截图,说面faiss构建成功了
3. 安装python包装
接着还是需要安装faiss的python的包装,先回到主目录cd .. 然后
make py
,
可能会报错
../faiss/Index.h:72: Error: Syntax error in input(3).
make[1]: *** [swigfaiss.cpp] Error 1
因为用的swig是版本2,升级到swig3即可。升级方法
wget https://nchc.dl.sourceforge.net/project/swig/swig/swig-3.0.12/swig-3.0.12.tar.gz
tar -xzf swig-3.0.12.tar.gz
cd swig-3.0.12/
*./configure
make
sudo make install
升级完后,执行
swig -version
可以看到版本已经是3了,然后我们继续回到faiss目录执行
make py
,成功! 然后我们执行
python -c "import faiss"
测试一下,发现可以导入,只是会提示Failed to load GPU Faiss: No module named swigfaiss_gpu
Faiss falling back to CPU-only.这个正常,因为我们还没编译gpu支持。
4. 编译GPU支持
好,跟着我们编译gpu支持,
cd gpu
然后
make
,为了快一点可以多个线程make,比如
make -j 8
,但是会提示这里并没有Makefile,所以我们需要
cp ../Makefile .
把cpu的makefile拷到gpu这个目录,然后修改Makefile的第一行 -include makefile.inc 改成 -include ../makefile.inc 然后再make,如果还是报错ld连接找不到库或者include找不到头文件的话,就修改下../makefile.inc 把cuda还有之前编译好的cpu faiss的include和link路径加上就好了
成功后,在回到python目录里 执行make,最后
cp -r faiss swigfaiss.py _swigfaiss.so 你的python site-package目录
ok完工,来验证下python中使用gpu版本faiss没问题,到demos目录
修改demo_auto_tune.py 104行左右的
keys_to_test = unlimited_mem_keys
use_gpu = False
改为
keys_to_test = keys_gpu
use_gpu = True
然后下载sift1M数据集,
wget ftp://ftp.irisa.fr/local/texmex/corpus/sift.tar.gz
tar -xzf sift.tar.gz
mv sift sift1M
python demo_auto_tune.py
开始运行后,执行
nvidia-smi
观察gpu的使用,你会发现faiss已经用上gpu了。