Faiss源码编译调试

AnkleBreaker-ZHX / 2024-01-27 / 原文

环境配置:

硬件平台:虚拟机(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进入函数内部查看其实现过程即可。