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

这样就可以无需编译,直接使用了。

下面主要来看下使用源码编译的情况,当前的编译环境如下:

  1. x86 CPU (如果是 ARM 可以参考 Wiki
  2. 操作系统:Ubuntu 20.04
  3. cmake 版本: 3.25.2 当前要求必须 3.17 以上
  4. gcc 版本 9.4.0
  5. 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:

  1. 官方安装文档
  2. 其他平台安装
posted @ 2023-02-23 11:30  小得盈满  阅读(2913)  评论(0编辑  收藏  举报