Faiss 向量库编译安装
Faiss 是 Facebook 开源的一套高效相似性搜索以及向量聚类的开发库,支持各类相似性搜索的算法,Faiss 项目本身是使用 C++ 编写的,但是提供 Python 的绑定,可以直接使用 numpy 类型操作,同时也支持使用 GPU 加速计算,下面介绍下 Faiss 的源码编译过程。
如果想仅使用 Python 进行开发,那么可以直接使用 pip 工具安装:
# 例如使用 pip3 安装
# 安装纯 CPU 版本, 不包含 GPU
pip3 install faiss-cpu
# 安装 GPU 版本 需要由 CUDA toolkit
pip3 install faiss-gpu
这样就可以无需编译,直接使用了。
下面主要来看下使用源码编译的情况,当前的编译环境如下:
- x86 CPU (如果是 ARM 可以参考 Wiki)
- 操作系统:Ubuntu 20.04
- cmake 版本: 3.25.2 当前要求必须 3.17 以上
- gcc 版本 9.4.0
- Python 版本 3.8.10
另外说明下,默认 APT 源中的 cmake 版本是 3.16.2 不符合要求,因此可以选择手动下载二进制版本的 cmake 安装或者使用第三方源,这个不再详细说明,gcc 版本直接使用系统自带的,同时 Python 也是系统自带的环境,本次编译没有开启 GPU 支持。
除了上面的基础环境外,还要有一些依赖保证,首先是要有 BLAS 库存在,可以使用下面的命令来安装:
apt install libblas-dev liblapack-dev
# 另外如果是 CentOS 则需要使用下面的命令安装 yum/dnf 都可以
yum --enablerepo=powertools install blas-devel lapack-devel
安装完成后,如果我们开启 Python 绑定则还需要安装必要的依赖: numpy 和 swig ,直接使用 pip 安装如下:
pip3 install numpy
pip3 install swig
如果不需要编译 Python 绑定则不需要安装。
这里我们没有启动 GPU 如果启用的话还必须要保证: nvcc 命令可用以及 CUDA toolkit 的正常安装。
准备完毕之后,接下来我们就可以开始编译了,首先要克隆下仓库的源码:
# faiss 仓库:https://github.com/facebookresearch/faiss
git clone https://github.com/facebookresearch/faiss.git
cd faiss
然后开始编译:
cmake -B build -DFAISS_ENABLE_GPU=OFF -DFAISS_ENABLE_PYTHON=ON -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DBUILD_TESTING=OFF .
上面 -DFAISS_ENABLE_GPU=OFF
表示关闭 GPU 支持,-DFAISS_ENABLE_PYTHON=ON
是开启了 Python 绑定,如果不需要可以设置为 OFF
, -DBUILD_SHARED_LIBS=ON
表示开启动态库,这样编译完成会生成 libfaiss.so
如果关闭会生成静态库 libfaiss.a
, -DCMAKE_BUILD_TYPE=Release
表示编译 Release 版本,会自动开启优化参数,最后 -DBUILD_TESTING=OFF
表示关闭测试,如果开启会自动下载 googletest 相关的包,需要保持网络通才可以。
执行完成开始编译:
# 开启 Python 依赖时执行
make -C build -j swigfaiss
# 正常不需要 Python 依赖可以执行
make -C build -j faiss
编译完成后可以进入目录:cd build/faiss
,然后可以看到存在动态库 libfaiss.so
如果没有开启动态库应该是 libfaiss.a
,如果开启 Python 后应该还有个 Python 目录,可以手动安装 Python 的依赖:
cd python
python3 setup.py install
然后就可以试一下是否可以导入依赖。
如果要使用 C++ 开发,要把头文件和动态库等安装到系统目录,这样可以直接引入:
make -C build install
默认头文件的安装位置是:/usr/local/include
下,动态库是:/usr/local/lib
下面,这样开发的时候就可以方便使用,如果是发布可执行文件,那么头文件就不需要了,只需要打包时带着动态库即可,如果是静态库可以直接编译到单个二进制文件中,目标环境只需要有上面说的基础依赖即可。
Reference: