当前位置: 首页 > article >正文

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博客


http://www.kler.cn/a/540284.html

相关文章:

  • 查看二进制程序内的 .interp 段
  • 项目6:基于大数据校园一卡通数据分析和可视化
  • 大模型中设计的精度(FP8,FP16,FP32,混合精度训练,精度量化)相关总结
  • SpringBoot速成(八)登录实战:未登录不能访问 P5-P8
  • 物品匹配问题-25寒假牛客C
  • Java 魔法:精准掌控 PDF 合同模板,指定页码与关键字替换签章日期
  • ESP-IDF学习记录(6)
  • Django开发入门 – 2.Django的Web应用项目架构
  • flink JobGraph解析
  • leetcode刷题-动态规划04
  • 机器学习:学习记录(二)
  • Kotlin实战经验:将接口回调转换成suspend挂起函数
  • Bigemap Pro如何裁剪矢量数据
  • Ollama系列---【ollama使用gpu运行大模型】
  • 蓝耘智算平台部署deepseek-助力深度学习
  • webpack配置之---output.clean
  • AWS vs Azure vs 阿里云:出海企业全球扩张的技术选型指南(2024深度对比)
  • 如何使用 Redux 中间件?
  • 小白零基础如何搭建CNN
  • c# http
  • 1.1 单元测试核心原则
  • jenkins手动安装插件
  • 深度学习框架PyTorch
  • Python----PyQt开发(PyQt高级:组件大小,界面位置,按钮,文本显示,文本输入,字体大小)
  • Spring Boot + MyBatis Field ‘xxx‘ doesn‘t have a default value 问题排查与解决
  • 鸿蒙NEXT开发-发布三方库