zoukankan      html  css  js  c++  java
  • 深入理解Faiss 原理&源码 (一) 编译

    深入理解Faiss 原理&源码 (一) 编译

    Faiss系列, 从单机lib到构建大规模分布式向量检索系统, 且听我娓娓道来

    Faiss是什么?

    Faiss是Facebook AI团队开源的针对聚类和相似性搜索库,为稠密向量提供高效相似度搜索和聚类,支持十亿级别向量的搜索,是目前最为成熟的近似近邻搜索库。它包含多种搜索任意大小向量集(备注:向量集大小由RAM内存决定)的算法,以及用于算法评估和参数调整的支持代码。Faiss用C++编写,并提供与Numpy完美衔接的Python接口。除此以外,对一些核心算法提供了GPU实现

    mac下安装

    安装mac xcode工具包

    xcode-select --install
    

    因为是通过源码编译, 需要依赖gcc系列工具包, 所以要先执行这一步

    安装 openblas

    brew install openblas
    

    BLAS是 Basic Linear Algebra Subprograms (基本线性代数子程序)的首字母缩写,主要用来做基础的矩阵计算,或者是向量计算。它分为三级:

    • BLAS 1级,主要做向量与向量间的dot或乘加运算,对应元素的计算;

    • BLAS 2级,主要做矩阵和向量,就类似PPT中蓝色部分所示,矩阵A*向量x, 得到一个向量y。除此之外,可能还会有对称的矩阵变形;

    • BLAS 3级,主要是矩阵和矩阵的计算,最典型的是A矩阵B矩阵,得到一个C矩阵。由矩阵的宽、高,得到一个mn的C矩阵。

    为什么BLAS是一个非常重要的库或者接口,是因为它是很多科学计算的核心之一。每年做超级计算机的排行榜,都要做LINPACK测试,该测试很多部分就是做BLAS 3级矩阵和矩阵的计算。此外,还有很多科学和工程的模拟,在转换后都变成了一种矩阵上的操作。如果你把矩阵优化的特别好的话,对整个应用的提升,都是非常有帮助的。

    安装swig

    brew install swig
    

    简单包装界面产生器(英语:Simplified Wrapper and Interface Generator, SWIG)是一个开源软件工具,用来将C语言或C++写的计算机程序或函式库,连接脚本语言,例如Lua, Perl, PHP, Python, R, Ruby, Tcl, 和其它语言,例如C#, Java, JavaScript, Go, D, OCaml, Octave, Scilab以及Scheme. 也可以输出成XML格式。

    安装libomp

    brew install libomp
    

    OpenMP(Open Multi-Processing)是一套支持跨平台共享内存方式的多线程并发的编程API,使用C,C++和Fortran语言,可以在大多数的处理器体系和操作系统中运行,包括Solaris, AIX, HP-UX, GNU/Linux, Mac OS X, 和Microsoft Windows。包括一套编译器指令、库和一些能够影响运行行为的环境变量。

    编译faiss

    • 下载代码, 此处选择最新v1.7.1 tag
    git clone https://github.com/facebookresearch/faiss.git
    
    cd faiss
    
    git checkout v1.7.1
    
    • cmake参数选择
    vim CMakeLists.txt
    

    此处不需要gpu索引和python版本, 修改CMakeLists.txt 对应设置

    option(FAISS_OPT_LEVEL "" "generic")
    option(FAISS_ENABLE_GPU "Enable support for GPU indexes." OFF)
    option(FAISS_ENABLE_PYTHON "Build Python extension." OFF)
    option(FAISS_ENABLE_C_API "Build C API." ON)
    

    cmake 依赖校验

    cmake -B build .
    
    • 开始编译
    make -C build -j faiss
    

    533cd0d20bfddb78d2d0e27a25d1f8bb.png

    • 生成c++ lib
    make -C build install
    

    ec21f321b2aea0d19c07ee877309d173.png

    • 跑下测试用例
    make -C build install
    

    889a995935a98d97f913161e6940269c.png

    • 跑下 ivfpq的例子
    make -C build demo_ivfpq_indexing
    

    66b2e729e089b8dbc4c74581528cbd4e.png

    至此, 安装验证完成, 下一篇将会剖析下 c++版本 flat索引 原理+源码

    对向量检索感兴趣以及对搜索&推荐感兴趣的小伙伴的欢迎加qq 564790073 讨论, 一线大厂搜索中心长期招人

    github: https://github.com/hashyong

    未经允许禁止转载 谢谢

    附录

    作者: fattycoder

    出处: https://www.cnblogs.com/fattyCoder/

    关于作者:挺喜欢写代码的

    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(564790073@qq.com)咨询.

  • 相关阅读:
    设计模式-单例模式
    Java对象声明时:new与null的区别
    Mysql的UseAffectedRows问题 以及其他常见配置说明
    将form表单元素的值序列化成对象
    idea教程视频以及常用插件整理
    Ajax获取Response头信息
    BootstrapTable返回结果集递增序号
    mybaitis动态sql利用bind标签代替%拼接完成模糊查询
    Numpy库使用
    基于socket实现websocket服务
  • 原文地址:https://www.cnblogs.com/fattyCoder/p/14901448.html
Copyright © 2011-2022 走看看