CentOS7安装GPU版本的faiss详细过程
1. 拉取源码
faiss最新版本应该是1.6.1,我们git clone的时候指定这个tag
1 | git clone -b v1.6.1 https://github.com/facebookresearch/faiss.git |
2. 编译CPU版本
接着
1 | cd faiss |
1 | ./configure --with-cuda=/usr/local/cuda |
这里我的cuda安装在/usr/local/cuda 大家可以根据实际情况替换为自己的cuda安装路径,如果不指定这个会报错
1 | Could't find cuda.h |
configure完毕,因为faiss依赖blas,所以先测试一下系统是否已经正确安装了blas
执行
1 | make misc/test_blas |
然后
1 | ./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,执行
1 | make |
然后
1 | sudo make install |
make的时候可能会报这个错
1 | nvcc fatal : Unsupported gpu architecture 'compute_75' |
1 | make: *** [gpu/GpuIndex.o] Error 1 |
解决方法是根据你的gpu卡找到对应的compute capability,常见的比如
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 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开头这一行,修改成
1 | CUDA_ARCH = -gencode=arch=compute_52,code=sm_52 |
根据你自己卡的compute capability改
faiss构建完毕后,测试一下 执行 cd demos && make 然后
1 | ./demo_ivfpq_indexing |
如果报错 error while loading shared libraries: libfaiss.so: cannot open shared object file: No such file or directory, 解决办法是
1 | export LD_LIBRARY_PATH="/usr/local/lib:$LD_LIBRARY_PATH" |
而且最好把这行加到你的~/.bashrc里,LD_LIBRARY_PATH加上之后,再运行,如果看到类似下面的截图,说面faiss构建成功了
3. 安装python包装
接着还是需要安装faiss的python的包装,先回到主目录cd .. 然后
1 | make py |
,
可能会报错
1
2 ../faiss/Index.h:72: Error: Syntax error in input(3).
make[1]: *** [swigfaiss.cpp] Error 1
因为用的swig是版本2,升级到swig3即可。升级方法
1
2
3
4
5
6 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
升级完后,执行
1 | swig -version |
可以看到版本已经是3了,然后我们继续回到faiss目录执行
1 | make py |
,成功! 然后我们执行
1 | python -c "import faiss" |
测试一下,发现可以导入,只是会提示Failed to load GPU Faiss: No module named swigfaiss_gpu
Faiss falling back to CPU-only.这个正常,因为我们还没编译gpu支持。
4. 编译GPU支持
好,跟着我们编译gpu支持,
1 | cd gpu |
然后
1 | make |
,为了快一点可以多个线程make,比如
1 | make -j 8 |
,但是会提示这里并没有Makefile,所以我们需要
1 | cp ../Makefile . |
把cpu的makefile拷到gpu这个目录,然后修改Makefile的第一行 -include makefile.inc 改成 -include ../makefile.inc 然后再make,如果还是报错ld连接找不到库或者include找不到头文件的话,就修改下../makefile.inc 把cuda还有之前编译好的cpu faiss的include和link路径加上就好了
成功后,在回到python目录里 执行make,最后
1 | cp -r faiss swigfaiss.py _swigfaiss.so 你的python site-package目录 |
ok完工,来验证下python中使用gpu版本faiss没问题,到demos目录
修改demo_auto_tune.py 104行左右的
1
2 keys_to_test = unlimited_mem_keys
use_gpu = False
改为
1
2 keys_to_test = keys_gpu
use_gpu = True
然后下载sift1M数据集,
1 | wget ftp://ftp.irisa.fr/local/texmex/corpus/sift.tar.gz |
1 | tar -xzf sift.tar.gz |
1 | mv sift sift1M |
1 | python demo_auto_tune.py |
开始运行后,执行
1 | nvidia-smi |
观察gpu的使用,你会发现faiss已经用上gpu了。