facebook向量搜索聚类faiss安装与使用示例

安装

这里下载相关的安装文本

1. 安装fortran
    yum install libgfortran
    yum install gcc-gfortran

2. 安装blas
    rpm -ivh blas-3.2.1-5.el6.x86_64.rpm
    rpm -ivh blas-devel-3.2.1-5.el6.x86_64.rpm 

3. 安装lapack
    rpm -ivh lapack-3.2.1-5.el6.x86_64.rpm 
    rpm -ivh lapack-devel-3.2.1-5.el6.x86_64.rpm 

5.  克隆代码
    git clone git@github.com:facebookresearch/faiss.git

6. 构建安装
    ./configure
    make
    make install
    
7. 测试
    make test

如果最后看到如下输出,则说明成功了

test_IndexIVFPQ (test_index.TestSearchAndReconstruct) ... WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
Reconstruction error = 0.455
ok
test_IndexTransform (test_index.TestSearchAndReconstruct) ... WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
Reconstruction error = 3.241
ok
test_MultiIndex (test_index.TestSearchAndReconstruct) ... WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1500 points to 256 centroids: please provide at least 9984 training points
Reconstruction error = 0.437
ok

----------------------------------------------------------------------
Ran 74 tests in 118.620s

OK

8. 安装python wrapper

make py

    注意,完毕之后进入faiss/python目录, 执行:

python -c "import faiss" 

如果成功,记得把当前目录下的faiss目录 拷贝到/usr/lib/python2.7/site-packages目录下。这也看你使用的python是什么,如果是anaconda的话。

然后查看有没有安装成功:

[root@aws ~]# python
Python 2.7.5 (default, Jul 13 2018, 13:06:57)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-28)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import faiss

 

使用示例

IndexFlatL2

IndexFlatL2是精确查找,没有做任何的数据压缩,使用欧式距离来衡量距离,不需要训练过程。不支持删除向量,也不支持带ID插入。

import numpy as np
import faiss

np.random.seed(100)
train_v = np.random.rand(1000, 128).astype('float32')
q_v = np.random.rand(10,128).astype('float32')

index = faiss.IndexFlatL2(128)  ##创建索引
index.add(train_v) ## 添加数据
D, I = index.search(q_v, 10) ##搜索

返回的D向量是相似度,I是向量的索引,该索引是向量插入到索引中的顺序。 如果需要自己定义ID,例如图片ID,那么需要自己在插入的时候维护一个ID和索引ID的对应关系。或者使用faiss.IndexIDMap包装一下。

index = faiss.IndexFlatL2(128)
index = faiss.IndexIDMap(index)
index.add_with_ids(train_v,np.arange(1000))
D, I = index.search(q_v, 10)

这时候返回的I,是插入的时候,向量对应的ID。

IndexIVFFlat

为了加速检索速度,可以使用IndexIVFFlat,该索引再创建的时候,需要另一个索引,即quantizer, 也需要指定距离计算公式,不提供的话,默认也是L2距离。此外,还需要指定一个nlist,指定索引划分数。

quantizer = faiss.IndexFlatL2(dims)
index = faiss.IndexIVFFlat(quantizer, dims, 16, faiss.METRIC_L2)
index.train(train_v)
index_v = np.random.rand(5000, 128).astype('float32')
index.add_with_ids(index_v, np.arange(5000))
index.search(q_v, 10)
##删除前一步查询结果中出现的向量ID,再执行搜索试试
index.remove_ids(np.array([3821]))
index.search(q_v, 10)
## 会发现,这个结果中被删除的ID不见了

此外,IndexIVFFlat还支持设定nprobe,该参数的作用是控制速度和精度,该参数默认值是1. nprobe越小,搜索精度越高,速度越慢。 IndexIVF有两个基本组成部分:

  1. quantizer index 给定一个向量,quantizer index返回该向量属于的group
  2. InvertedLists 给定一个查询向量把一个id(nlist中的一个)映射到一个(code, id)的序列,这里的code,id分别是?

IndexIVFFlat没有对数据进行压缩,如果很介意内存(尤其是GPU)占用的话,考虑使用PQ。

PQ原理

PQ全称product quantization, 本质上是一中通过分治、数据压缩来实现高效向量检索的近似检索算法,在追求高效的大空间检索情况下,通常不会使用精确检索。 首先介绍一下quantization的概念,vector quantization通过定义一个量化器(映射函数q),把一个D维向量,映射成一个k维向量(k通常是2的幂),通常这个k会远小于D。 product quantization在quantzation前面加了一个分治,例如原始向量是D=128维,我们把它分成m=4组,那么每组的子向量就是128/4=32维, 在每个32维子向量组里,利用kmeans算法学习到映射函数q。 第一步分治,第二步压缩,加速了检索

IndexIVFPQ

IndexIVFPQ对原始数据进行了压缩,所以提供不精确检索。均匀分布的数据是很难被压缩的。

quantizer=faiss.IndexFlatL2(dims)
index = faiss.IndexIVFPQ(quantizer, dims, 16, 8, 8)
index.train(train_v)

其中第一,二,三个参数和之前介绍的一样。第一个8是向量分段数,就是前面qp中介绍的m, 第二个8是指分段后的每段的聚类中心点的个数(或者说码)占用的bit数,8意味256个聚类中心点(每段)。 程序会不断warning,原因不记得了,可自行谷歌解决。

WARNING clustering 1000 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1000 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1000 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1000 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1000 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1000 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1000 points to 256 centroids: please provide at least 9984 training points
WARNING clustering 1000 points to 256 centroids: please provide at least 9984 training points
train_v = np.random.rand(10000, 128).astype('float32')
index.train(train_v)
index.add_with_ids(index_v, np.arange(5000))
##index.nprobe=10 也支持设置这个
index.search(q_v, 10)

工厂方法

index = faiss.index_factory(16, "Flat", faiss.METRIC_L2)
index = faiss.index_factory(16, "Flat", faiss.METRIC_INNER_PRODUCT)
index = faiss.index_factory(16, "IVF100,Flat")
index = faiss.index_factory(128, "IVF100,PQ8")

 

使用GPU

res = faiss.StandardGpuResources() ## 获取gpu资源
dims = 1024
quantizer = faiss.IndexFlatL2(dims)
 #index = faiss.IndexIVFFlat(quantizer, dims, 10)
index = faiss.IndexIVFPQ(quantizer, dims, 128, 8, 8)
self.index = faiss.index_cpu_to_gpu(res, 0, index) ## 使用gpu,并指定第0块gpu

 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值