Faiss特征向量搜索
ubuntu 24.10系统上实现
安装OpenBLAS
git clone https://github.com/xianyi/OpenBLAS.git
安装gfortran进行编译
sudo apt install gfortran
cd OpenBLAS
make FC=gfortran
make install
ln -s /opt/OpenBLAS/lib/libopenblas.so /usr/lib/libopenblas.so
LD_LIBRARY_PATH=/opt/OpenBLAS/lib
export LD_LIBRARY_PATH
安装lapack
wget http://www.netlib.org/lapack/lapack-3.12.1.tgz #选择自己系统对应的版本
tar -zxf lapack-3.12.1.tgz
cd lapack-3.12.1
cp ./INSTALL/make.inc.gfortran ./
mv make.inc.gfortran make.inc
vi Makefile # 修改如下
[#lib: lapacklib tmglib
lib: blaslib variants lapacklig tmglib]
make
cd LAPACKE #cd lapacke 不同版本文件名不一致
make
cp include/*.h /usr/include
cd ..
cp *.a /usr/lib
编译Faiss
git clone https://github.com/facebookresearch/faiss.git
cd faiss
#使用 CMake 构建一个项目,并将构建产物放置在名为 “build” 的目录中。
cmake -B build . -DFAISS_ENABLE_GPU=OFF -DFAISS_ENABLE_PYTHON=OFF
#使用 make 构建名为 “faiss” 的目标,并且指定构建目录为 “build”。
make -C build -j faiss
#使用 make 进行构建,并将构建产物安装到系统中。同样在build目录下构建
make -C build install
参考实现代码
#include <iostream>
#include <vector>
#include <faiss/IndexFlat.h>
int main() {
// 假设向量维度为512
int d = 512;
// 创建一个用于内积搜索的索引
faiss::IndexFlatIP index(d);
// 假设有一些数据库向量
// 这里我们随机生成一些向量作为示例
int nb = 300000; // 数据库向量的数量
std::vector<float> xb(nb * d);
for (int i = 0; i < nb * d; i++) {
xb[i] = static_cast<float>(rand()) / static_cast<float>(RAND_MAX);
}
// 添加向量到索引中
index.add(nb, xb.data());
// 假设有一个查询向量
// 这里我们同样随机生成一个向量作为示例
std::vector<float> xq(d);
for (int i = 0; i < d; i++) {
xq[i] = static_cast<float>(rand()) / static_cast<float>(RAND_MAX);
}
// 我们想要找到最相似的4个向量
int k = 4;
std::vector<float> distances(k);
std::vector<faiss::idx_t> indices(k); // 修正了这里
// 搜索与查询向量最相似的向量
index.search(1, xq.data(), k, distances.data(), indices.data());
// 输出结果
std::cout << "Query vector:" << std::endl;
for (int i = 0; i < d; i++) {
std::cout << xq[i] << " ";
}
std::cout << std::endl;
std::cout << "Nearest neighbors:" << std::endl;
for (int i = 0; i < k; i++) {
std::cout << "Index: " << indices[i] << ", Distance (cosine similarity): " << distances[i] << std::endl;
}
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.6)
PROJECT(test)
FIND_PACKAGE( OpenMP REQUIRED)
if(OPENMP_FOUND)
message("OPENMP FOUND")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${OpenMP_EXE_LINKER_FLAGS}")
endif()
add_compile_options(-std=c++14 -lpthread)
# 设置头文件搜索路径
set(FAISS_INCLUDE_DIR /usr/local/include/faiss)
set(FAISS_LIBRARY_DIR /usr/local/lib)
include_directories(${FAISS_LIBRARY_DIR})
# 设置依赖库
link_directories(
/usr/lib/x86_64-linux-gnu/
${FAISS_LIBRARY_DIR}
)
add_executable(aaa faiss.cc)
target_link_libraries(aaa faiss openblas)
该过程可能会报错缺少依赖库直接装比如
sudo apt-get install libomp-dev
sudo apt-get install libopenblas-dev
Faiss文档
https://faiss.ai/index.html
参考链接
【向量数据库】相似向量检索Faiss数据库的安装及余弦相似度计算(C++)_faiss数据库最新支持分布式吗-CSDN博客