Faiss 是 Facebook 开源的一套高效相似性搜索以及向量聚类的开发库,支持各类相似性搜索的算法,Faiss 项目本身是使用 C++ 编写的,但是提供 Python 的绑定,可以直接使用 numpy 类型操作,同时也支持使用 GPU 加速计算,下面介绍下 Faiss 的源码编译过程。

如果想仅使用 Python 进行开发,那么可以直接使用 pip 工具安装:

# 例如使用 pip3 安装
# 安装纯 CPU 版本, 不包含 GPU
pip3 install faiss-cpu
# 安装 GPU 版本 需要由 CUDA toolkit
pip3 install faiss-gpu

这样就可以无需编译,直接使用了。

下面主要来看下使用源码编译的情况,当前的编译环境如下:

  1. x86 CPU (如果是 ARM 可以参考 Wiki
  2. 操作系统:Ubuntu 20.04
  3. cmake 版本: 3.25.2 当前要求必须 3.17 以上
  4. gcc 版本 9.4.0
  5. Python 版本 3.8.10

    另外说明下,默认 APT 源中的 cmake 版本是 3.16.2 不符合要求,因此可以选择手动下载二进制版本的 cmake 安装或者使用第三方源,这个不再详细说明,gcc 版本直接使用系统自带的,同时 Python 也是系统自带的环境,本次编译没有开启 GPU 支持。

除了上面的基础环境外,还要有一些依赖保证,首先是要有 BLAS 库存在,可以使用下面的命令来安装:

apt install libblas-dev liblapack-dev
# 另外如果是 CentOS 则需要使用下面的命令安装 yum/dnf 都可以
yum --enablerepo=powertools install blas-devel lapack-devel

安装完成后,如果我们开启 Python 绑定则还需要安装必要的依赖: numpy 和 swig ,直接使用 pip 安装如下:

pip3 install numpy
pip3 install swig

如果不需要编译 Python 绑定则不需要安装。

这里我们没有启动 GPU 如果启用的话还必须要保证: nvcc 命令可用以及 CUDA toolkit 的正常安装。

准备完毕之后,接下来我们就可以开始编译了,首先要克隆下仓库的源码:

# faiss 仓库:https://github.com/facebookresearch/faiss
git clone https://github.com/facebookresearch/faiss.git
cd faiss

然后开始编译:

cmake -B build -DFAISS_ENABLE_GPU=OFF -DFAISS_ENABLE_PYTHON=ON -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DBUILD_TESTING=OFF .

上面 -DFAISS_ENABLE_GPU=OFF 表示关闭 GPU 支持,-DFAISS_ENABLE_PYTHON=ON 是开启了 Python 绑定,如果不需要可以设置为 OFF-DBUILD_SHARED_LIBS=ON 表示开启动态库,这样编译完成会生成 libfaiss.so 如果关闭会生成静态库 libfaiss.a-DCMAKE_BUILD_TYPE=Release 表示编译 Release 版本,会自动开启优化参数,最后 -DBUILD_TESTING=OFF 表示关闭测试,如果开启会自动下载 googletest 相关的包,需要保持网络通才可以。

执行完成开始编译:

# 开启 Python 依赖时执行
make -C build -j swigfaiss
# 正常不需要 Python 依赖可以执行
make -C build -j faiss

编译完成后可以进入目录:cd build/faiss ,然后可以看到存在动态库 libfaiss.so 如果没有开启动态库应该是 libfaiss.a ,如果开启 Python 后应该还有个 Python 目录,可以手动安装 Python 的依赖:

cd python
python3 setup.py install

然后就可以试一下是否可以导入依赖。

如果要使用 C++ 开发,要把头文件和动态库等安装到系统目录,这样可以直接引入:

make -C build install

默认头文件的安装位置是:/usr/local/include 下,动态库是:/usr/local/lib 下面,这样开发的时候就可以方便使用,如果是发布可执行文件,那么头文件就不需要了,只需要打包时带着动态库即可,如果是静态库可以直接编译到单个二进制文件中,目标环境只需要有上面说的基础依赖即可。

Reference:

  1. 官方安装文档
  2. 其他平台安装

Faiss 向量库编译安装的更多相关文章

  1. dpdk-18.11开发库编译安装

    简介 dpdk官网 安装 下载 点击下载地址,选择合适的版本下载.这里下载DPDK 18.11.0 (LTS)版本. 编译 将下载的dpdk-18.11.tar.xz上传服务器,解压,这里放在了/op ...

  2. Boost库编译安装

    一.Boost库介绍         Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一.Boost库由C++标准委员会库工作组成员发起,其 ...

  3. Ubuntu下dlib库编译安装

    安装libboost 按照dlib的说明安装始终不成功,参考machine learning is fun作者的指导installing_dlib_on_macos_for_python.md,需要首 ...

  4. 矩池云上编译安装dlib库

    方法一(简单) 矩池云上的k80因为内存问题,请用其他版本的GPU去进行编译,保存环境后再在k80上用. 准备工作 下载dlib的源文件 进入python的官网,点击PyPi选项,搜索dilb,再点击 ...

  5. php5.5编译安装

    系统环境:centos6.5PHP包:5.5.15https://wiki.swoole.com/wiki/page/177.html下载 PHP 源码包wget http://cn2.php.net ...

  6. FastDFS源码学习(一)FastDFS介绍及源码编译安装

    FastDFS是淘宝的余庆主导开发的一个分布式文件系统,采用C语言开发,性能较优.在淘宝网.京东商城.支付宝和某些网盘等系统均有使用,使用场景十分广泛. 下图来源:https://blog.csdn. ...

  7. 已安装php 编译安装 gd库拓展模块

    参考资料:http://wenku.baidu.com/link?url=EgXFShYxeJOZSYNQ_7RCBC-6X8OcRRCqVm4qCv49uBk57d6vLBoUpfYdQ-KqJRs ...

  8. libCURL开源库在VS2010环境下编译安装,配置详解

    libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...

  9. centos7.2下编译安装&&使用-git代码库

    centos7.2下编译安装git Git简介 Git是一个分布式版本控制系统 Git vs SVN SVN是典型的集中式版本控制起,版本库集中存放在服务器,当我们用自己的电脑干活儿的时候,需要先从中 ...

  10. 烂泥:centos单独编译安装gd库

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 这几天一直在弄一个商城系统,该系统的源码及数据库都已经上传并创建完毕.但是在安装该系统时,却提示缺少gd库.如下: 使用php探针查看,发现php确实没 ...

随机推荐

  1. 告别os.path,拥抱pathlib

    pathlib 模块是在Python3.4版本中首次被引入到标准库中的,作为一个可选模块.从Python3.6开始,内置的 open 函数以及 os . shutil 和 os.path 模块中的各种 ...

  2. Zabbix与乐维监控对比分析(五)——可视化篇

    前面我们详细介绍了Zabbix与乐维监控的架构与性能.Agent管理.自动发现.权限管理.对象管理.告警管理方面的对比分析,相信大家对二者的对比分析有了相对深入的了解,接下来我们将对二者的可视化功能进 ...

  3. Mybatis中没有返回值的查询方法

    最近在项目开发中发现一件非常有意思的事情,一个Mapper.java文件中有一个查询方法没有返回值,这引起了我的好奇心, 没有返回值查询还有什么用呢? 仔细去看这个Mapper.java文件对应的xm ...

  4. axios post xml data方法

    axios#request(config) axios#get(url[,config]) axios#delete(url[,config]) axios#head(url[,config]) ax ...

  5. [VueJsDev] 快速入门 - vue项目根目录配置文件

    [VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html vue项目根目录配置文件 ::: details 目录 目录 ...

  6. WPF之属性

    目录 属性 依赖属性(Dependency Property) 依赖属性对内存的使用方式 声明和使用依赖属性 声明依赖属性 使用依赖属性 依赖属性的"属性" 依赖属性的" ...

  7. python元组(tuple)循环遍历实例分析

    一 概念: 元组是有序且不可更改的集合.在 Python 中,元组是用圆括号编写的. 二 使用方法: 1  基本创建: thistuple = ("apple", "ba ...

  8. Python3解决UnicodeDecodeError: 'utf-8' codec can't decode byte..问题最快解决方案

    问题: 使用python3 作为socket通信的时候,出现了这个错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x92 in posi ...

  9. 基于ESP8266的JSON解析实例分析

    什么是JSON?   JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.采用完全独立于编程语言的文本格式来存储和表示数据.其简洁和层次结构清晰的特点使得 J ...

  10. SQL注入详细讲解概括—盲注

    SQL注入详细讲解概括-盲注 1.盲注简单理解 2.盲注必学函数 3.布尔盲注 4.时间盲注 一.盲注简单理解 What is 盲注? It is 在服务器没有错误回显的时候完成的注入攻击 数据库把报 ...