索引的I/O与复制

所有的函数都是深复制,我们不需要关心对象关系。

I/O函数:

  • write_index(index, "large.index"): 写索引到文件
  • Index * index = read_index("large.index") 读索引

复制函数:

  • Index* index2 = clone_index(index): 返回索引的深复制
  • Index *index_cpu_to_gpu = index_cpu_to_gpu(resource, dev_no, index): 复制索引到GPU
  • Index *index_gpu_to_cpu = index_gpu_to_cpu(index):从GPU到CPU
  • index_cpu_to_gpu_multiple: uses an IndexShards or IndexProxy to copy the index to several GPUs.

index_factory

index_factory通过字符串来创建索引,字符串包括三部分:预处理、倒排、编码。
预处理支持:

  • PCA:PCA64表示通过PCA降维到64维(PCAMatrix实现);PCAR64表示PCA后添加一个随机旋转。
  • OPQ:OPQ16表示为数据集进行16字节编码进行预处理(OPQMatrix实现),对PQ索引很有效但是训练时也会慢一些。

倒排支持:

  • IVF:IVF4096表示使用粗量化器IndexFlatL2将数据分为4096份
  • IMI:IMI2x8表示通过Mutil-index使用2x8个bits(MultiIndexQuantizer)建立2^(2*8)份的倒排索引。
  • IDMap:如果不使用倒排但需要add_with_ids,可以通过IndexIDMap来添加id

编码支持:

  • Flat:存储原始向量,通过IndexFlat或IndexIVFFlat实现
  • PQ:PQ16使用16个字节编码向量,通过IndexPQ或IndexIVFPQ实现
  • PQ8+16:表示通过8字节来进行PQ,16个字节对第一级别量化的误差再做PQ,通过IndexIVFPQR实现

如:
index = index_factory(128, "OPQ16_64,IMI2x8,PQ8+16"): 处理128维的向量,使用OPQ来预处理数据16是OPQ内部处理的blocks大小,64为OPQ后的输出维度;使用multi-index建立65536(2^16)和倒排列表;编码采用8字节PQ和16字节refine的Re-rank方案。

OPQ是非常有效的,除非原始数据就具有block-wise的结构如SIFT。

自动调参

索引的参数包括两种:bulid-time索引创建时需要设置的、run-time在搜索前可以调整的。针对run-time参数可以进行Auto-tuning。

Key 类名 run-time参数 备注
IVF, IMI2x IndexIVF* nprobe 控制速度和精度的折中
IMI2x* IndexIVF max_codes 平衡倒排列表
PQ* IndexIVFPQ, IndexPQ ht Hamming threshold for polysemous
PQ+ IndexIVFPQR k_factor Re-rank时要核实的数据量

AutoTuneCriterion:包含ground-truth,使用搜索结果,评估召回;OperatingPoints:包含(性能,时间,参数集合id),目标是找到最优的operating point——没有其他point可以在更短的时间内达到更好的性能;ParameterSpace:参数空间是指数级的,但是这些参数有一个共同的特性,值越高一般来说速度越慢,性能越好。

faiss/tests/demo_sift1M.cpp中有一个自动调参的示例。自动调参依赖于:评测集合完备且充足,机器环境稳定。

特殊的操作

  • 根据索引重建数据,见test_index_composite.py
    支持IndexFlat, IndexIVFFlat (call make_direct_map first), IndexIVFPQ (same), IndexPreTransform (provided the underlying transform supports it)
  • 从索引中移除元素,remove_ids方法
    见test_index_composite.py,支持IndexFlat, IndexIVFFlat, IndexIVFPQ, IDMap
  • 范围查找,range_search方法
    将返回离查询点一定半径内的向量,在Python中它将返回一个1D元组lims/D/I,针对第i个的查询结果为I[lims[i]:lims[i+1]], D[lims[i]:lims[i+1]],支持IndexFlat, IndexIVFFlat
  • 合并切分索引
    merge_from合并其他索引,copy_subset_to复制当前索引的子集到其他索引,支持IndexIVF

Faiss教程:索引(2)的更多相关文章

  1. 【转】微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引

    微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引 Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到 ...

  2. Faiss教程:基础

    Faiss对一些基础算法提供了非常高效的实现:k-means.PCA.PQ编解码. 聚类 假设2维tensor x: ncentroids = 1024 niter = 20 verbose = Tr ...

  3. Spring教程索引

    Spring教程索引 2016-11-15 1 入门 1 概述.深入浅出Spring(一)Spring概述 2 体系结构 3 环境设置 4 Hello World 实例 5 IoC 容器   IoC容 ...

  4. Faiss教程:索引(1)

    索引是faiss的关键知识,我们重点介绍下. 索引方法汇总 有些索引名,我就不翻译了,根据英文名去学习更准确. 索引名 类名 index_factory 主要参数 字节数/向量 精准检索 备注 精准的 ...

  5. Orchard教程索引页

    Orchard官方教程(译)索引 链接标注 原文 则表示未译,其他带有中文标题的表示译文内容. 入门 安装Orchard--Installing Orchard 通过zip包手动安装Orchard-- ...

  6. 微信公众账号 Senparc.Weixin.MP SDK 开发教程 索引

    Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享. ...

  7. Senparc.Weixin.MP SDK 微信公众平台开发教程 索引

    Senparc.Weixin.MP SDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享. ...

  8. Senparc.Weixin SDK 微信公众号 .NET 开发教程 索引

    Senparc.WeixinSDK从一开始就坚持开源的状态,这个过程中得到了许多朋友的认可和支持. 目前SDK已经达到比较稳定的版本,这个过程中我觉得有必要整理一些思路和经验,和大家一起分享.也欢迎大 ...

  9. Faiss教程:入门

    Faiss处理固定维度d的数据,矩阵每一行表示一个向量,每列表示向量的一项.Faiss采用32-bit浮点型存储. 假设xb为数据集,维度为\(nb\times{d}\):xq是查询数据,维度为\(n ...

随机推荐

  1. C++指针理解

    指针是C/C++编程中的重要概念之一,也是最容易产生困惑并导致程序出错的问题之一.利用指针编程可以表示各种数据结构,通过指针可使用主调函数和被调函数之间共享变量或数据结构,便于实现双向数据通讯:指针能 ...

  2. Set和List的区别

    一: Set 不允许重复,List允许重复 二: Set 无序,List有序 . 这里的无序和有序, 是说的添加顺序和元素顺序的一致性. 比如添加时是obj1,obj2,obj3 ,那么list存储他 ...

  3. http://sourceforge.net/projects/rtspdirectshow/

    如何做一个解析rtsp协议的h264压缩的实时视频流播放器,带保存功能,目前我有rtsp协议的h264压缩后的实时视频流,目前想开发一个客户端,来播放该实时视频流,同时保存为视频文件,目前似乎有方案是 ...

  4. spark LBFGS 设置参数

    http://blog.csdn.net/bon_mot/article/details/72461318

  5. Repeater - 重复器

    Repeater - 重复器,用来展示泛型集合中的数据 五大模板:1.HeaderTemplate - 头模板,加载时会在开始执行一次2.FooterTemplate - 脚模板,加载时会在最后执行一 ...

  6. Linux下怎么创建和进入带有空格的文件夹

    有时候需要创建带有空格的文件夹,虽然这不是一个好的习惯,但是偶尔会遇到.用的最多的是很多时候需要进入带有空格的文件夹,如"a b"是一个文件夹名. 创建:mkdir "a ...

  7. crontab详细用法

    使用crontab你可以在指定的时间执行一个shell脚本或者一系列Linux命令.例如系统管理员安排一个备份任务使其每天都运行 如何往 cron 中添加一个作业? # crontab –e0 5 * ...

  8. FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK

    [FLAG_ACTIVITY_CLEAR_TASK | FLAG_ACTIVITY_NEW_TASK] 1.FLAG_ACTIVITY_NEW_TASK 2.FLAG_ACTIVITY_CLEAR_T ...

  9. 外购半成品报SHORT问题(验货客户)

    描述:下图中可以看到外购半成品层物料报SHORT 2.开始检查数据 --针对外购半成品(外购半成品的成品层有BOM数据,外购半成品没有BOM数据) '; --select * from TB_ADDB ...

  10. msf客户端渗透(十):社会工程学

    启动社会工程学攻击组件 生成二维码攻击模块 输入你想生成二维码的url,这里做演示用www.baidu.com 二维码生成后,在这个路径下 生成u盘,DVD的多媒体攻击载荷 通过修改autorun.i ...