索引的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. MongoDB 教程索引 (附有视频)

    MongoDB 教程索引 MongoDB 教程一: 安装和使用 (Mongodb启动命令mongod参数说明) MongoDB 教程二: 添加, 删除,查询 shell命令 MongoDB 教程三: ...

  2. ElasticSearch入门教程-索引

    ElasticSearch入门教程-索引 在本节中,我们将向Elasticsearch添加一些索引,映射和数据.此数据将用于本教程中说明的示例中. 创建索引 PUT http://localhost: ...

  3. faiss教程【facebook官方文档】

    官方教程 开始 对于以下内容,我们假设已安装Faiss. 我们在C ++和Python中提供代码示例. 可以通过复制/粘贴代码或从Faiss发行版的tutorial /子目录运行代码来运行代码. 生成 ...

  4. ElasticSearch教程-索引的介绍

    我们现在开始进行一个简单教程,它涵盖了一些基本的概念介绍,比如索引(indexing).搜索(search)以及聚合(aggregations).通过这个教程,我们可以让你对Elasticsearch ...

  5. MySQL高阶教程索引

    导语:本教程是笔者用mysql做了一年多简单的开发后,对MySQL有了一定的理解,为了夯实自己的MySQL数据库基础,对MySQL进行了二次学习,期间记下了很多笔记,本教程即是以这些笔记为大纲,内容详 ...

  6. NeuChar 平台使用及开发教程 索引

    什么是 NeuChar? NeuChar 是由盛派(Senparc)团队发布的新一代跨平台服务系统,其中包含了开放的跨平台通讯标准及核心计算模块(Senparc.NeuChar.dll)以及配套的云管 ...

  7. 饥荒:mod教程索引

    网上关于饥荒mod制作的教程较少,去百度谷歌基本上找不到,我整理了一下,基本上我知道都在这里了. 一.网站集合 czfshine的blog 饥荒代码吧 饥荒mod吧 国外饥荒论坛 百度经验-mod教程 ...

  8. 【转载】冰美人淘宝装修教程--索引

    转载之冰美人社区,链接中可能有误,希望指出,谢谢,同时欢迎大家去这个社区看看,教程不错 ====================================== 冰美人设计淘宝装修基础课更新完毕 ...

  9. Jlink使用技巧系列教程索引

    近两个月,写写停停,总算完成了这个系列的教程,不容易啊! Jlink使用技巧系列文章: 以下是各文章的链接,直接点击即可进入阅读. Jlink使用技巧之合并烧写文件 Jlink使用技巧之烧写SPI F ...

最新文章

  1. 高性能ASP.NET系统架构设计
  2. 从官网下载的python包如何使用-如何使用Python从需要登录信息的网站下载文件?...
  3. 『一本通』差分约束系统
  4. 如何用jlink+jflash烧写stm32f103CB的option bytes 和程序
  5. C指针原理(21)-C指针基础-ATT汇编
  6. linux的定时任务有多耗资源,linux定时任务的一些相关操作汇总
  7. 常见报错_mysql常见报错之SELECT list is not in GROUP BY clause
  8. Pytorch 报错 Python int too large to convert to C long
  9. WordPress社交网络菜单图标更改——SVG图标
  10. 蚂蚁金服校招一面有感
  11. 旷视科技面试——算法岗
  12. 永中word页码怎么从第二页开始_永中PDF产品升级!Now注册即享VIP~
  13. 股票入门基础知识|游资或者庄股出货的结构形态
  14. WebRTC RTCP XR
  15. 大通流TVS管和ESD静电二极管的区别
  16. 中国互联网络信息中心域名争议解决办法
  17. 机房动环监控4大价值,轻松解决学校解决问题
  18. 文书档案管理系统服务器版,文管王文书档案管理系统 正式版
  19. 20年了,为什么CPU主频停滞不前?
  20. php判断复选框是否被选中的方法

热门文章

  1. 资源 | 做一款炫酷的机器人需要哪些学习资源(机器人资源Awesome系列)
  2. CompletableFuture:让你的代码免受阻塞之苦
  3. 一款零注解侵入的 API 文档生成工具,你用过吗?
  4. 为什么不推荐使用BeanUtils属性转换工具
  5. SQL 查询总是先执行SELECT语句吗?你们都错了!
  6. 如何编写最佳的Dockerfile
  7. 欧卡智舶发布全球首个城市内河无人驾驶数据集!
  8. 13个月才跑通GitHub模型,机器学习科研入门太难了吧
  9. 机器学习中需要了解的 5 种采样方法
  10. 疫情之下,村干部们的智慧越来越...