faiss 相似特征向量搜索
1,支持两种相似性计算方法:L2距离(即欧式距离)和点乘(归一化的向量点乘即cosine相似度);
2,按照是否编码压缩数据可以分为两类算法,使用压缩的算法可以在单台机器上处理十亿级别的向量规模;
3,并非线程安全的——不支持并行添加向量或搜索与添加的并行;仅在CPU模式下支持并行搜索;
4,只有继承了IndexIVF 的算法才支持向量的 remove() 操作,但由于是连续存储,remove的时间复杂度是 O(n),建议另外维护一个列表记录被删除的或尚存的向量;
5,faiss 针对批量搜索做了优化;
6,IndexPQ, IndexIVFFlat, IndexIVFPQ, IndexIVFPQR 需要训练;
7,不支持重新训练,建议新建一个索引;
8,只接受 32-bit 浮点类型的输入数据;
9,使用 index = faiss.index_factory(dim, "PCA32,IVF100,PQ8") 这种形式创建索引更灵活,此处类型参数可解释为:使用PCA降维将原始向量降至32维,使用 IVF 建立索引,子list(即bucket 分桶)个数为 100,使用 Product Quantizer (乘积量化) 将每个向量压缩编码成 8 字节;等价于
num_list = 64
dim = 64
bytes_per_vector = 8
bits_per_sub_vector = 8quantizer = faiss.IndexFlatL2(dim)
index = faiss.IndexIVFPQ(quantizer, dim, num_list, bytes_per_vector, bits_per_sub_vector)
10,索引类型的选择
- 如果需要精确的搜索结果,不要降维、不要量化,使用 Flat,同时,使用Flat 意味着数据不会被压缩,将占用同等大小的内存;
- 如果内存很紧张,可以使用 PCA 降维、PQ 量化编码,来减少内存占用,最终占用的内存大小约等于 <降维后的向量维度> * <量化后的每个向量的字节数> * <向量个数>; 如果量化编码后的字节数大于64,推荐使用SQx 替换PQx,准确度相同但速度会更快;为了便于量化编码,可以使用 OPQx_y 先对向量做线性变换,y 必须是编码后字节数x的倍数,但最好小于维度dim和4*x;
- 如果总向量个数 N 小于 1百万,推荐使用 IVFx ,x 的选值介于
4*sqrt(N)
和16*sqrt(N)
之间,训练数据的大小至少要是x的30倍;如果总向量个数 N 大于 1百万、小于 1千万,推荐使用 IMI2x10,实际内部聚类个数是 2 ^ (2 * 10),将需要64 * 2 ^ 10 个向量参与训练;如果总向量个数 N 大于 1千万、小于 1亿,推荐使用 IMI2x12;如果总向量个数 N 大于 1亿、小于 10亿,推荐使用 IMI2x14;IMI方法不支持GPU; - IndexIVF 天生支持 add_with_ids 方法,对于不支持 add_with_ids方法的类型,可以使用IndexIDMap 辅助
index = faiss.IndexFlatL2(xb.shape[1]) ids = np.arange(xb.shape[0]) index.add_with_ids(xb, ids) # this will crash, because IndexFlatL2 does not support add_with_ids index2 = faiss.IndexIDMap(index) index2.add_with_ids(xb, ids) # works, the vectors are stored in the underlying index
4,常见问题:
暴力搜索比较慢,解决方法:
export OMP_WAIT_POLICY=PASSIVE
参考:
https://github.com/facebookresearch/faiss
https://github.com/facebookresearch/faiss/wiki/Troubleshooting
https://github.com/facebookresearch/faiss/wiki/FAQ
faiss 相似特征向量搜索相关推荐
- faiss之特征检索与聚类算法
特征检索与聚类算法 核心逻辑: 如何得到数字特征 如何对目标进行召回和排序 相关算法 Tree-based FLANN Annoy Quantization-based Faiss Graph-bas ...
- 向量检索(一)Faiss 在工业界的应用和常见问题解决
一.向量检索的场景 传统的搜索,使用关键做精确的查找,利用倒排索引在索引库中搜索.日常在用的百度,Google都属于关键词搜索. 在 AI 时代,我们需要查找一张相似的图片,一个问题的答案,或者根据一 ...
- faiss的python接口使用
faiss的python接口使用 1. 简介 2. 安装 3. 示例 1. 简介 faiss是一种ann(Approximate Nearest Neighbor)库,可以用于特征的入库,检索. 不仅 ...
- 取消高速省界收费站驶入“快车道”,我们距智能交通还有多远?
取消高速公路省界收费站不仅是我国高速公路收费模式的重大变革,更是高速公路迈向智能化的关键一环. 每逢周末或者节假日,高速公路的拥堵都让人惴惴不安.长跑高速的老司机们都知道,抛开事故等突发状况,进出收费 ...
- 高速公路发展趋势,智慧高速公路解决方案
一.高速公路发展趋势 高速公路监控.通信.收费三大系统,为高速公路智能化奠定了坚实基础.高速公路不停车收费系统全国联网,更是将高速公路智能化推向了新的阶段,随着移动互联网.大数据.云计算等新一代信息技 ...
- 迷人的神经网络——机器学习笔记1
目录 迷人的神经网络--机器学习笔记1 第1章 神经元模型及网络结构 1.1 神经元模型 1.1.1 单输入神经元 1.1.2 激活函数 1.1.3 多输入神经元 1.2 网络结构 1.2.1 单层神 ...
- 实现 AI 换脸的第一步:人脸搜索
前段时间,AI 换脸这条新闻你关注了吗? 说的是一位博主将 1994 年版<射雕英雄传>里朱茵的脸换成了杨幂的脸.因为该视频涉及到版权问题已被下架,但大家可以看看图片对比来感受一下&quo ...
- faiss通用向量搜索服务玩转腾讯880万词向量
通用向量搜索服务 faiss是个高效的向量搜索解决方案,经过测试对比,可以感受到它的飞速,关于faiss性能测试的见这里:faiss包装与性能对比 这次开源的是使用faiss搭建的通用向量搜索服务. ...
- 完全解析:使用Faiss进行海量特征的相似度匹配
点击上方"计算机视觉工坊",选择"星标" 干货第一时间送达 作者丨Gemfield@知乎 来源丨https://zhuanlan.zhihu.com/p/210 ...
最新文章
- python在线工具-在线 Python运行工具
- 嵌入式linux和嵌入式android系统有什么区别和联系?
- PyTorch 实现 Mask-RCNN
- 华中农业大学2018考研真题之867-数据结构与算法
- Python生成二维码-qrcode
- tp框架 < 5.0.24漏洞
- WebStorm WiFi真机同步无法安装成功及appLoader无法连接
- 倍福--实现和西门子的profinet
- 从《致加西亚的信》看项目管理
- 【C语言】求球的表面积和体积
- W10系统matlab无法保存对该路径的更改 pathdef_最新WIN10 20H2系统找回经典系统属性界面的几种方法...
- 【文献翻译】Evaluating five different adaptive decomposition methods for EEG signal seizure detection
- SCM:新一代存储介质技术
- 【微信小程序】-- 使用 npm 包 - API Promise化(四十二)
- ShardingSphere实践(7)——数据加密
- 软考中级 真题 2016年上半年 系统集成项目管理工程师 应用技术 下午试卷
- 北理工计算机学院新闻,北理工计算机学院召开物联网工程本科专业建设研讨会...
- 这些逻辑运算符你都使用正确了吗?
- 2022-1-13 向曾文正学修身之法
- LeetCode 每日一题 2021-4-25 (递增顺序搜索树)