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)咨询.

  • 相关阅读:
    Saltstack module apache 详解
    Saltstack module ip 详解
    Saltstack module iosconfig 详解
    Saltstack module introspect 详解
    Saltstack module inspector 详解
    Saltstack module ini 详解
    Saltstack module incron 详解
    Modbus 指令 RS485指令规则
    停车系统对接第三方在线支付平台(二)
    停车系统对接第三方在线支付平台
  • 原文地址:https://www.cnblogs.com/fattyCoder/p/14901448.html
Copyright © 2011-2022 走看看