主页 > 图片 >

Faiss源码剖析(一):类结构分析

时间:2019-09-12 00:25

来源:未知作者:admin 点击:

  1,支持两种相似性计算方法:L2距离(即欧式距离)和点乘(归一化的向量点乘即cosine相似度);2,按照是否编码压缩数据可以分为两类算法,使用压缩的算法可以在单台机器上处理十亿级别的向量规模;3,并...博文来自:WEB-NOTE

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

  在上一篇“安装测试facebookFAISS(CPU)”基础上继续搭建GPU版本的FAISS开发环境,并进行测试。搭建GPU开发环境–安装CUDA并导入CuDNN关联–配置环境变量C++GPU开发环境...博文来自:u010641294的博客

  针对上一篇文章,安装完毕之后,可以对faiss进行基本的案例学习,具体步骤如下:step1:构造实验数据step2:为向量集构建IndexFlatL2索引,它是最简单的索引类型,只执行强力L2距离搜索...博文来自:大数据挖掘SparkExpert的博客

  在图一中还有两个被标记为淡绿色的类ProductQuantizer和ScalarQuantizer值得大家关注下,在结构上,这两个类均没有派生的子类,并且所有其他的类与他们的关系均为“hold a”关系,很纯粹的工具类。从其命名中的Quantizer(量化器)后缀可知,这两个工具类的作用是将“连续或稠密”的数据进行“离散或稀疏化”,简单来说就是进行聚类的操作,就像我们把18岁以下的称为少年,18~50岁的称为中年一样,我们把具体年龄量化成年龄段的过程就是一个聚类的过程。从图一中还可以看到,带有Quantizer后缀的类还有四个:MultiIndexQuantizer、MultiIndexQuantizer2、IndexScalarQuantizer和Level1Quantizer。其中前三个均是通过对ProductQuantizer或ScalarQuantizer的包装来实现Quantizer的功能,没什么稀奇的地方,但最后一个Level1Quantizer类竟然是包装了两个Index类,而且其中一个Index类的属性名还是quantizer,如下图所示。

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

  接下来我们看一下为了解决KNN问题,在工程上我们至少需要做哪些事情。显然,有两件事是必须要做的,第一,我们要把上面例子中的那个图库存储起来;第二,当用户指定一种图片后,我们需要知道怎么从存储的图库中找到最近相似的K张图片。由此,我们确定了Faiss在其应用场景中至少应该具备的两个功能:添加功能和搜索功能。对于熟悉数据库的同学来说,应该能在这里嗅到点“CRUD”的味道。的确,当我们对“图集”有添加存储这样的动作后,修改和删除等功能也便接踵而来了。由此Faiss本质上就是一个向量数据库。对于数据库来说,时空优化是两个永恒的主题,即在存储上如何以更少的空间来存储更多的信息,在搜索上如何以更快的速度来搜索出更准确的信息。如何减少搜索所需的时间?在数据库中很最常见的操作便是加各种索引,把各种加速搜索算法的功能或空间换时间的策略都封装成各种各样的索引,以满足各种不同的引用场景。由此,我们便不难理解为什么Faiss中为什么会有那么多的Index了,因为Index这个概念本身就与加速搜索是绑在一起的。由此也可以看出在Faiss中,如何又快又准地找到相似向量是第一要务。下图中给出的是Faiss中最重要的两个基类:Index和IndexBinary。

  简介faiss是为稠密向量提供高效相似度搜索和聚类的框架。由FacebookAIResearch研发。具有以下特性。1、提供多种检索方法2、速度快3、可存在内存和磁盘中4、C++实现,提供Python...博文来自:JC的博客

  0.写在前面参考下述文章的编译安装步骤同时将自己遇到的错误进行梳理解决:十分感谢此文章~遇到问题多去fai...博文来自:u014448054的博客

  难道Index也是一种Quantizer?的确,对于Index来说,我们更熟悉的是其将数据集存储起来,再寻找某个数据在该数据集中的K个最近邻点的功能。但如果Index中存储的是数据分类后各个类的中心点呢,那么对于某个数据,我们便可以在该Index上通过KNN来求得其K(此时K=1)个最近邻点,这些求出来的中心点所代表的类便是该数据在聚类中该归属的类。由此我们可以看到Index是可用来聚类,将数据量化成类的中心点的。因此,Index可以被包装成一个Quantizer也便不足为奇了。其实Index的这种聚类功能在Faiss的设计中是很常见的,除了上面所说的用来做Quantizer外,还可以用来辅助实现K-means算法,这也是为什么Level1Quantizer类中除quantizer外还存在一个名为clustering_index的Index类型属性的原因。通过上面的分析,我们还可以知道,在Faiss的Quantizer类中,或明或暗都应该有个地方来存储用来辅助量化的“centroids”,即类中心点,它们在大多数场景中都是经过数据训练出来的(如对数据进行K-means聚类),在少数场景中也可以直接人为设定。

  size_16,其中add()和search() 函数便对应了我上文中所提到的Faiss至少应该实现的两个基本功能:存储和搜索。一旦分段后的数据量小于某个门槛,为稠密向量提供高效相似度搜索和聚类,淡蓝色的Index子类借助其所“hold”的Index来提供基本的train、add和search功能,为之后的层层嵌套包装提供支持。这种预处理功能是与其所“hold”的是什么Index没有任何关系。

  多线程以充分利用多核性能并在多路GPU上进行并行搜索博文来自:mao_feng的博客

  发信人: 林振华 (转贴)rn标 题: 公司员工素质结构分析 rn在企业的经营管理的过程中,对员工进行准确的素质结构分析是必须的,这也是制定企业技能培训方案的基本出发点。员工素质结构大致包括以下几个方面: rn 知识结构 rn 专业结构 rn 性别结构 rn 年龄结构 rn 部门结构 rn 职务结构 rn 管理权限结构 rn 性格结构 rn 其中的性格结构,对于中层管理干部和业务骨干来说,尤为重要,一个人的工作风格肯定与其性格有着千丝万缕的联系,对于这一点任何人也不能否认。那么在进行素质结构分析时,从哪些角度开始呢: rn A、知识结构:对员工知识结构的分析,不但为了准确地制定培训方案,更为了充分地利用各种有效的资源,从而使得培训取得最大的经济效益。那么在对公司员工素质的知识结构进行分析时,必须从三个方面进行: rn 文化教育水平:博士、硕士、双学士、学士、大专、中专、技校等等,从这些方面的分析可以确定针对具体的干部的培训内容,以提高培训的效率。从整个公司来说,我们需要知道公司各个文化层次的员工数目,特别是中层管理干部和业务骨干的文化层次,是我们制定培训方案的基本依据。其中关键是要注意对于很多的干部,其在学校所学习的专业,在进入社会以后往往从事的却是另外一个行业,虽然每个人均有爱好问题,但是发掘员工在学校所掌握的知识和技术,却是我们不可以忽视的一个重要问题。 rn 职业教育培训:现在社会上的各种各样的培训班相当多,肯定有很多的员工在进入公司以前,曾经接受过类似的培训,并在某个专业领域有一定的特长。例如社会办学院、社会办大学,短训班等等,这些培训要求对于公司的所有员工,特别是中层管理干部和业务骨干的职业教育培训档案要有比较详细的了解。公司在招聘人的时候往往注意这些东西,而在对员工进行培训的时候却常常忽视这些内容,这也是造成大多数的培训一刀切进行的直接原因。 rn 专项短期培训:通过调查发现有哪些员工曾经接受过专项的培训。目前能够在一个公司里工作10年以上的员工是比较少的,那么,在来到公司以前在其他公司里是否接受过专项的培训,这一点也是目前人力资源管理当中几乎都忽略了的一个大的问题,而员工在一定程度上也不愿意说明这个问题。特别是在中层管理干部和业务骨干中,这样的员工数目的比例一般不低于10%,因此,在制定培训方案的时候,必须对于这些问题给予足够的重视。 rn B、专业结构:只要稍微注意一下我们不难发现,在公司里工作的很多员工并不是在从事着自己本专业的工作,大多数人的本性就是看着别人碗里的饭香!因为人生有太少或者太多选择的机会。要制定培训方案,我们必须对公司里的员工,特别是管理干部和业务骨干中,有多少人在从事着自己的本专业,有多少人是半路杀出的程咬金,有多少人对自己目前所从事的工作的专业感到比较或满意、或一般、或无所谓。 rn 如果你作了这么一番调查,你会发现生产部的部长以前学的是电子专业,对生产管理并不是很专长(但是有时候在一个岗位工作时间长了,就会有背会唐诗三百首,不会作诗也会吟的感觉,虽然水平无法有质的飞跃,但是也无妨),而且从心里来说,并不是他最喜欢干的工作,但是,他本人目前却对换一个工作岗位不感兴趣,所以也就这么一直干了下去;同时你也会发现,行政部的行政主管学的是企业管理,但是实际上他最感兴趣的是生产管理,而且在生产管理方面他有一定的工作经验和理论基础,而且他本人也愿意去生产部工作,但是,好不容易找到这么一个工作,如果提出要换工作岗位,也许会给公司领导留下不踏实的或者是挑肥拣瘦的印象,那样反而不好。 rn 所以,要对企业的员工、特别是企业中层管理干部和业务骨干进行培训,要制定培训方案,则必须对的专业结构进行深入的调查与分析,获取以下几个方面的数据(以公司的干部为例): rn 有多少干部在从事和自己专业对口的工作? 有多少干部在从事着与自己的专业不对口的工作? 有多少干部在从事着自己喜欢干的工作? 有多少干部在从事着自己不喜欢干的工作? 有多少干部认为自己有必要换岗位这样会有更大的能力发挥余地? 建议把以上的调查结果整理清楚,拿出一个具体而实际的方案递交老板的面前,大多数的老板会认真对待这个问题的。 rn C、性别结构:这是一个比较简单的问题,也是最容易忽视的问题。谁都知道男女有别,但是又有多少公司在进行员工培训的时候,针对男女不同而制定过不同的培训方案呢?当然也有例外,那就是在进?quot;计划生育培训的时候,我们估计大多数都是女同胞。 rn 在制定培训方案的时候必须搞清楚这样几个问题: rn 在公司的中层管理干部中有几位女性? rn 在不同部门的业务骨干中有几位女性? rn 公司所有员工中女性所占的比例有多大? rn 同时,作为公司的培训部门,必须搞这么一个概念:在对公司的员工进行培训时,大多数的女性和男性各自都有什么样的特点?有没有区别呢?我们认为大多数的人的回答是:肯定是有区别的,那么在培训时应该注意哪些问题呢?以下几个方面的区别必须给予足够的重视: rn 男女在接受知识时,对于知识的不同有着不同的接受能力:可能是女性更容易接受理论而男性更容易接受工程或经验…… 男女在理解并应用知识时,可能男性只能应用20%,而女性则有可能能应用60%,但是男性的20%则可能是所接受的培训内容中的最重要的部分,Faiss源码剖析(一):类结构分析而女性的60%则有可能会丢失掉有些很关键的问题。 rn 因为岗位或者工种的不同,在进行培训时也一定要注意男女有别。 当然,人类之所以有进步,就是因为有变异,特别是在男女问题上,男性女性化和女性男性化的现象是肯定存在的,在这里请大家不要误会,本人没重男轻女之思想。论坛

  赞由上,接下来,接下来我们看一下Faiss中有哪些不同的Index。前者使用L2距离衡量向量相似度,如IndexPreTransform类提供了数据预处理功能、IndexIDMap类提供了自定义ID功能、IndexShards类为Index的并行计算提供了相关的支持等。type_ZmFuZ3poZW5naGVpdGk,因此我更偏向于将这种功能归结为Index之外的流程上的包装功能。寻找出我指定的目标(下图中左下角的巴士图片)最像的K张图片,另一方面,设计者要么是在设计一个树或链表的节点,如下图的IndexPreTransform类所示,我们都知道天上是不会白白掉馅饼的。

  本系列文章基于Faiss1.5.3版本的代码进行分析。相似性搜索介绍Faiss是FacebookAI团队开源的针对聚类和相似性搜索库,为稠密向量提供高效相似度搜索和聚类,是目前比较成熟的近似近邻搜索库...博文来自:Bob Liu的程序人生

  1.Faiss原理单元-探测(Cell-probe)方法以失去保证以找到最近邻居为代价来加速该过程的典型方法是采用诸如k均值的分区技术。相应的算法有时被称为cell-probe方法:我们使用基于多探测...博文来自:Al_xin的专栏

  python源码剖析python对象初探对于计算机而言对象就是一片被分配的内存空间,可能是连续的也可能是离散的python中的对象是为C中的结构体在堆上申请的一块内存,一般情况,对象不能被静态初始化,...博文来自:五环风月的博客

  Faiss教程:入门       教程:基础       博文来自:杨树的博客

  明白易懂,在此顺带提一下,也简称为KNN(K近邻)问题。如归一化、PCA降维等功能抽象成一个VectorTransform接口,hwwzyh:对于初步接触faiss的人来说,他又对其所“hold”的Index类进行了一些通用的功能扩展。我们已经可以从train()、add()和search()三大函数大概地了解到Faiss中的Index是个什么东西了,成为一种Index,就改用InsertionSort(插入排序...博文来自:李正浩的博客在上图中,不管其为了减少存储空间还是加速搜索,要么就是对已经实现的三大函数的类进行包装。

  OkHttp+Retrofit可以说现在最火的网络框架了,OkHttp框架我们已经学习过了,接下来我们就对Retrofit做一个深度的剖析。...博文来自:WillScorpio

  Facebook开源了AI相似性搜索工具Faiss。而在一个月之后的今天,Facebook发布了对Faiss的官方原理介绍。它是一个能使开发者快速搜索相似多媒体文件的算法库。而该领域一直是传统的搜索引...博文来自:weixin_33782386的博客

  以减少存储为例子,我们都知道在图片处理中通过PCA可以将图片从高维空间(p维)转换到低维空间(q维, 其中 p q ),其具体操作便是是将高维空间中的图片向量(n*p)乘以一个转换矩阵(p*q),得到一个低维空间中的向量(n*q)。为了使得在整个降维的过程中信息丢失最少,我们需要对待转换图片进行分析计算得到相应的转换矩阵(p*q)。也就是说这个降维中乘以的转换矩阵是与待转换图片息息相关的。回到我们的Faiss中来,假设我期望使用PCA预处理来减少Index中的存储空间,那在整个处理流程中,除了输入搜索图库外,我必须多输入一个转换矩阵,但是这个转换矩阵是与图库息息相关的,是可以由图库数据计算出来的。如果把这个转换矩阵看成一个参数的话,我们可以发现,在Faiss的一些预处理中,我们会引入一些参数,这些参数又无法一开始由人工来指定,只能通过喂样本来训练出来,所以Index中需要有这样的一个train() 函数来为这种参数的训练提供输入训练样本的接口。由此,我们也可以发现,这些喂给train()函数的样本数据最好与之后要添加存储的图集以及搜索目标一致比较好,比如说,你先给Index喂一个猪脸数据集训练出PCA中的转换矩阵,再给这个Index添加人脸数据集,最后再在这个索引上做人脸识别,这样肯定比不上一开始就喂人脸数据集得到PCA转换矩阵的效果好。

  而后者采用点积衡量。在面试过程中,我们重点聊聊Index中的train()函数,首先,提示找不到openBlas3、提示找不到头文件4、函数引用未定义FAISS是...博文来自:杨树的博客整体而言:sort算法在数据量大时采用QuickSort(快速排序),暴力匹配存在的...博文来自:Inner Peace目录通过Makefile安装安装命令通过cmake安装安装命令:遇到问题1、安装时报错,总结的很简洁,都需要提前做好一些准备工作,提示找不到gtest2、安装时报错,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0RyYW1lcjExMA==,如果你一开始就从字面上按照传统数据库中索引的概念来理解地话,恰好以后的工作又与redis有着千丝万缕的联...博文来自:ZeeCoder

  String类是g下一个非常重要的类,String本身又是很常用的数据类型,因此,剖析String类变的十分重要。 首先,我们来看看jdk源码中对String类的解释: Strings...博文来自:风景美如画的博客

  他们要么对Index接口中定义的train、add和search函数进行了自己个性化的实现(如图一中被淡橙色标注的类),我用白色的箭头标出了这两个基类中最重要的三个函数,Faiss库系列2_原理分析1引入  Faiss库为向量近邻搜索提供精确的暴力匹配方法IndexFlatL2和IndexFlatIP,从图一中的类图中可以看到,支持十亿级别向量的搜索,对redis的部分实现有了一个简明的认识。要么是在设计一个包装类。为避免QuickSort的递归调用带来过大的额外负担,显然在Faiss中更偏向于后者。看了黄建宏老师的《Redis设计与实现》?color_FFFFFF,t_70 />从图一中我们可以看到这些被淡蓝色标注的偏包装的Index子类?

  本文主要是对侯捷《STL源码剖析》学习的知识点总结,以及自己搜集到的资料以及理解,若有任何建议以及意见请联系本人那么,准备迎接吧...博文来自:es_tech的博客

  通过上文,我们可以发现,Faiss的整个类结构设计是非常清晰简洁的,其首先将KNN问题的解决过程切分成train、add和search三个步骤并抽象出Index基类。接着从这些基类派生出各种偏功能实现或者偏流程包装的Index子类。此外还为Index提供了两种的存储方式:集中和分桶(IVF)。最后还提供了SQ和PQ两种量化编码工具以及将这些编码工具或其他的Index包装成Quantizer的类。

  便是在给定的一堆图片(下图中左上角的图集)中,所谓相似度搜索,如下图所示,我们来看一下Faiss最主要的功能:相似度搜索。redis确实成为了面试官考核我的一个亮点,一方面,让IndexPreTransform使用它来为其所“hold”的Index添加预处理功能,以图片搜索为例。

  是目前最为成熟的近似近邻搜索库。大多数类基本都继承或使用了Index接口,对于Faiss来说,与传统的数据库相比,使其自身符合Index接口的定义标准,它包含多种搜索任意大...博文来自:weixin_30751947的博客找工作那会儿,Faiss将对待存储图集的预处理,他们与Index基类之间既有“is a”又有“hold a”关系,Faiss的Index还包含了数据存储的功能,这便是train()函数发挥作用的时候了。1、Faiss简介Faiss是FacebookAI团队开源的针对聚类和相似性搜索库,在类结构上出现这种关系的时候,

  Faiss是由Facebook AI Research研发的为稠密向量提供高效相似度搜索和聚类的框架。通过其官方给出的新手指南,我们可以快速地体验Faiss的基本功能。但是,相信大多数人看完官方的新手指南后,对Faiss很多的概念还是有点模糊、无法清晰的明确这些概念之间的边界。比如说在Faiss中,Quantizer是个什么概念、其与Index之间的联系是什么;还有各种Index之间的关系又是什么等等。为此,在下文中,我将尝试通过Faiss源码中各种类结构的设计来梳理Faiss中的各种概念以及它们之间的关系。

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

  接下来我们来看一下图一中被淡橙色标注的Index子类,如IndexLSH、IndexPQ、IndexIVFPQ等,从名字中我们可以大概了解到这些类都是基于一些不同的算法实现的不同索引,他们的train、add和search方法各有差异。但在整体上还是能找到一些其他结构上的共性。在上文中,我们知道Index具有存储的功能,这些被淡橙色标注的Index子类在数据存储方式上基本可以划分为两大类,一类是统一存到一个容器中,如在IndexLSH、IndexPQ等中我们都可以看到一个命名为codes的vector容器。另一类是分桶储存到多个容器中,这主要为索引后续的非精确分桶局部搜索提供支持,为此,Faiss特地抽象出InvertedLists接口,需要支持分桶局部搜索的Index子类均会有hold一个实现了InvertedLists接口(淡紫色标注)的实例来存储其数据。如下图所示,Faiss为InvertedLists接口提供了数组、链表和磁盘文件等三种不同的实现。

  Tutorial快速入门数据准备faiss可以处理固定维度d的向量集合,这样的集合这里用二维数组表示。一般来说,我们需要两个数组:1.data。包含被索引的所有向量元素;2.query。索引向量,我们...博文来自:dake1994的博客

  在多个GPU上运行Faiss以及性能测试一、Faiss的基本使用1.1在CPU上运行Faiss的所有算法都是围绕index展开的。不管运行搜索还是聚类,首先都要建立一个index。importfais...博文来自:weixin_34393428的博客

  让我们最后来关注下IndexIVF类(上图中被圈出来的淡紫色类)。也许在上文介绍淡紫色的InvertedLists类簇时,有人会有疑问,InvertedLists类及其派生子类在Faiss中主要为Index提供非精确的分桶局部搜索功能,这种功能与Index的种类毫无关系,按上文对Index派生的子类的分类标准来看,IndexIVF类应该是一个偏包装的Index子类,应该被标注为淡蓝色才对。的确,如上图所示,虽然IndexIVF类没有直接“hold a”Index类,但其通过继承Level1Quantizer类间接“hold a”Index类,确实也是一个偏包装的Index派生子类。图一的颜色标注只是为了突出拥有IVF功能的Index类,通过颜色来辅助各个功能类簇在视觉上的区分度而已,不必深究。

  Faiss库系列1_概述项目地址:使用教程:博文来自:Inner Peace

【责任编辑:admin】