Faiss源码编译调试
环境配置:
硬件平台:虚拟机(VMWare Workstation Pro 17)
处理器数:2
每个处理器的核数:2
操作系统:Ubuntu 22.04
运行内存:8GB
存储空间:200GB
1. 安装依赖
环境工具依赖:
sudo apt install -y\
build-essential\
gdb\
intel-mkl\
libblas-dev\
liblapack-dev\
python3\
python3-pip\
swig
在安装Intel-mkl时,第一个弹窗选项选择OK,第二个选择否。
cmake:
wget https://cmake.org/files/v3.28/cmake-3.28.1-linux-x86_64.tar.gz
sudo tar --strip-components=1 -zxvf cmake-3.28.1-linux-x86_64.tar.gz -C /usr/local/
numpy和swig:
pip3 install numpy
pip3 install swig
2. Faiss源码编译
2.1. 克隆代码
git clone git@github.com:facebookresearch/faiss.git
cd faiss
2.2. cmake构建
cmake -B build\
-DFAISS_ENABLE_GPU=OFF\
-DFAISS_ENABLE_PYTHON=ON\
-DFAISS_ENABLE_C_API=ON\
-DBUILD_TESTING=OFF\
-DBUILD_SHARED_LIBS=ON\
-DCMAKE_BUILD_TYPE=Debug\
.
构建选项的含义如下:
-
-DFAISS_ENABLE_GPU:是否开启GPU支持(ON开启,OFF不开启) -
-DFAISS_ENABLE_PYTHON:是否开启python绑定(ON开启,OFF不开启) -
-DFAISS_ENABLE_C_API=ON:是否构建C API(ON是,OFF否) -
-DBUILD_TESTING=OFF:是否构建C++测试套件(ON是,OFF否;ON会下载googletest,需联网) -
-DBUILD_SHARED_LIBS:是否构建共享库(ON是,OFF否) -
-DCMAKE_BUILD_TYPE:构建类型(Release或Debug;源码调试分析必须安装Debug版本)
更多构建选项见项目目录下的INSTALL.md文件
2.3. 编译(必选)
make -C build -j faiss
2.4. 构建python依赖的编译(可选)
需在构建阶段设置-DFAISS_ENABLE_PYTHON=ON:
make -C build -j swigfaiss
# 安装相关的python包
cd build/faiss/python
sudo python3 setup.py install
2.5. 安装C++库和头文件(可选)
将编译产生的C++静态库和动态库,以及相关的头文件安装到系统,便于使用Faiss进行开发。若仅仅只是为了调试和分析源码,不必执行此步骤。
make -C build install
2.6. 运行测试套件(可选)
2.6.1. C++测试
需要在构建阶段设置-DBUILD_TESTING=ON:
make -C build test
2.6.2. python测试
cd build/faiss/python
sudo python3 setup.py build
PYTHONPATH="$(ls -d ./build/faiss/python/build/lib*/)" pytest tests/test_*.py
3. 调试
Faiss仅仅是一个向量检索库,并不是一个严格的数据库系统,没有自己的main()函数。想要调试Faiss源码,只能通过对接口的外部调用进行。
在Faiss的项目目录下,有一个demos目录,存放了对Faiss接口进行调用的一系列demo。经过编译后,demos目录下的源文件生成的可执行文件存放在build/demos/目录。
以源文件demos/demo_ivfpq_indexing.cpp为例,先构建可执行程序:
make -C build demo_ivfpq_indexing
使用vscode进行调试,在项目目录下新建目录.vscode,并在.vscode内部编写如下的launch.json文件:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "demo_ivfpq_indexing",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/demos/demo_ivfpq_indexing",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
},
{
"description": "Set Disassembly Flavor to Intel",
"text": "-gdb-set disassembly-flavor intel",
"ignoreFailures": true
}
]
}
]
}
在源文件demos/demo_ivfpq_indexing.cpp中打上断点,按F5启动调试。当执行至Faiss相关接口函数时,按F11进入函数内部查看其实现过程即可。