
Faiss
文章平均质量分 94
翔底
普通的码农,简单的职业生涯
展开
-
Faiss(17):IndexIVFPQ文件格式分析
1. 说明Faiss版本:1.6.3nb = 1M, nlist = 4000, d = 64, m = 64, nbits = 82. 应用层接口python接口#将生成的index实例保存到index_name.bin命名的文件中faiss.write_index(index, "index_name.bin")c++接口在C++代码中,write_index()函数是一个在faiss命名空间下的独立的函数,即它不依赖于某个特定的类实例,而在代码中可直接调用。如://demo.c原创 2021-01-27 11:08:22 · 1985 阅读 · 3 评论 -
Faiss(16):编译时添加对AVX512指令的支持
1. 说明在对Faiss CPU profiling分析时对libfaiss.o进行反汇编发现该程序没有用到avx512指令进行优化,而该指令在进行浮点运算时相比其他指令集会有更好的效率和速度,故在此记录将AVX512指令集添加进程序的编译过程。2. 编译OpenBLASopenblas 是一个开源的矩阵计算库,包含了诸多的精度和形式的矩阵计算算法。就精度而言,包括float和double,两种数据类型的数据,其矩阵调用函数也是不一样。不同矩阵,其计算方式也是有所不同,(姑且认为向量也是一维矩阵),原创 2020-10-12 10:08:54 · 6452 阅读 · 1 评论 -
Faiss(15):OpenMP并行编程
1. 说明在上一篇分析CPU search过程的文档中,发现Faiss为提高搜索效率,缩短搜索时间,应用了OpenMP并行运算的功能,这一篇文档针对IndexIVF.cpp->search_preassigned函数中使用的OpenMP命令进行分析。2. 概述OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C、C++和Fortran。OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的并行程序设计。编译器根据程序中添加的pragma指令,自动将原创 2020-10-12 09:59:20 · 1861 阅读 · 1 评论 -
Faiss(14):IndexIVFPQ的CPU search过程分析
1. 说明之前分析过了faiss 在GPU中的search过程,这里分析一下IndexIVFPQ在CPU中的search过程,即不将index拷贝到GPU中。2. 过程分析2.1 python接口CPU search的python接口与GPU的完全一致,没有差别。D, I = gpu_index.search(xq_t[x],top_k)2.2 faiss coreIndexIVF::search因为IndexIVFPQ没有override search,所以在实际运行过程中会调用父类原创 2020-10-12 09:41:23 · 1615 阅读 · 3 评论 -
Faiss(13):update_vectors分析
1. 说明update_vectors用于更新索引中的dataset而不需要重新生成和训练的过程,从代码追踪的情况来看,update_vectors()函数只有在IndexIVFFlat索引中有实际的定义,所以只有该类型以及该类型索引的子类有update的功能。本篇文档也以IndexIVFFlat为基础进行分析和实验。2. 过程分析2.1 Python接口上篇文章中说明,faiss的python接口定义都是在swigfaiss.py文件内,update_vectors也一样,如下所示:# n:原创 2020-10-10 09:44:34 · 2366 阅读 · 0 评论 -
Faiss(12):python接口faiss.py文件分析
1. 前言本篇笔记主要分析faiss code下的python接口文件——faiss.py的工作流程以及内容。2. faiss.py分析2.1 导入文件在faiss code 编译完成后,在python目录下执行make/make install命令后,会在该文件下产生faiss.py, faiss/, faiss.egg-info/等文件和目录,其中faiss.py和faiss/目录下的__init__.py内容一样,但是在应用程序中import faiss时,导入的是__init__.py文件原创 2020-10-07 13:25:33 · 2232 阅读 · 0 评论 -
Faiss(11):关于GPU-CPU的数据Copy back
1. 前言在之前的文档中记录了Faiss框架search时各个阶段的逻辑顺序和时间消耗,其中发现在第2.3节GPUIndex的搜索中,Copy back占的时间比值不小(达到了45.61%),相信如果要对整体方案进行优化,那么这一部分将是一个重要的突破口。所以这篇文档主要对数据的copy back进行分析。2. Copy back说明GPU search完成后会将输出结果distances和labels的数组保存到内存中,但仍然是在GPU内部的内存,应用程序无法知道实际结果,那么就需要将这部分数据原创 2020-10-07 10:30:55 · 1802 阅读 · 2 评论 -
Faiss(10):IVFPQ-search过程分析
1. 说明前面从创建索引、训练、添加向量等过程分析过来,终于要到搜索部分了,对于整个faiss框架来说,前面的操作虽然费时但都是一次完成的,实际上经常需要使用的只有search一项内容,所以这也是整个研究重点。2. 过程分析2.1 python coreD, I = gpu_index.search(xq_t[x],top_k)上面是调用一次搜索的过程。gpu_index是索引的实例,search是实现在该索引内的方法,xq_t[x]是一个64维向量,即要搜索的原数据。比如top_k = 100原创 2020-09-27 10:35:44 · 2287 阅读 · 0 评论 -
Faiss(9):将Index从CPU复制到GPU过程分析
1. 说明在前面的文章里提到使用了一个python语言编写的APP,用于测试faiss 的search时间,在该程序中train和add Index的过程都是在CPU中进行的,而search的过程则在GPU中进行,这就涉及到将Index从CPU的内存中复制到GPU的内存的过程。个人对这一过程如何实现颇感兴趣,所以特地对此进行分析。2. 过程分析2.1 应用程序假设此时已经创建了一个可用的Index,已经train,add过了等等。在程序中调用:gpu_index = faiss.index_原创 2020-09-18 23:19:23 · 4501 阅读 · 5 评论 -
Faiss(8):IVFPQ-Add过程分析
1. 说明已经完成训练的向量仍然只是一个空壳子,还需要向里面添加dataset包含的向量,才能用于后期的搜索。2. 过程分析2.1 appfor n, s in enumerate(range(4010,4010+enu*10,10)): np.random.seed(s) xb = np.random.random((seg,d)).astype('float32') xb[:,0] += (np.arange(seg)+n*seg) * 1.0/nb index.原创 2020-09-12 15:46:44 · 1417 阅读 · 1 评论 -
Faiss(7):IVFPQ-train训练过程分析
说明本篇主要分析IVFPQ类型的索引的训练过程。遵循从APP -> 到faiss core的实现的流程。过程分析app假设现在已经有了一个可用的IVFPQ类型索引index实例,那么可以直接在程序中调用:index.train(learning_d)这里的learning_d表示训练集,这里的值是database总数与学习率的乘积。faiss coretrain()IndexIVFPQ类里面没有override train函数,所以上面的接口调用的是其父类IndexIVF下定义的t原创 2020-09-12 10:20:37 · 3771 阅读 · 2 评论 -
Faiss(6):IndexIVFPQ类定义
1. 说明Faiss中有大量不同的Index适用于各种不同的场景,但是步骤无非都是三步:训练、构造索引和查询。所以无论研究那种Index类型都可以遵循上述三个内容做具体研究。由于我实际项目中使用的是IndexIVFPQ进行图搜索,所以这里针对这一类型进行分析。1.1 IndexIVFPQ关系图2. 类以下代码基于Faiss-1.6.1版本。2.1 基类 Index这是所有索引的抽象基类,它定义了索引基本的函数和方法,但是只是一些虚函数,即这些函数大多会在实际类型的索引子类中重新定义。//原创 2020-09-05 11:03:59 · 1912 阅读 · 0 评论 -
Faiss(5):IndexIVFPQ原理
说明原本想尝试自己从头写,但看了下网上的各位前辈的博客后,感觉自己还是才疏学浅,没有理解透彻,所以在这里做个搬运工,偶尔加些个人的理解在里面。原文链接:https://blog.razrlele.com/p/2594,侵删。Faiss 的原理首先来介绍一下Faiss使用时候的数据流:在使用Faiss的时候首先需要基于原始的向量build一个索引文件,然后再对索引文件进行一个查询操作,在第一次build索引文件的时候,需要经过Train和Add两个过程,后续如果有新的向量需要被添加到索引文件的话还可原创 2020-08-23 00:42:13 · 5124 阅读 · 5 评论 -
Faiss(4):索引(Index)
在前面的文章中已经有说明,Faiss库的运行是基于索引的,这个索引与传统数据库中的Index不同,它是包含向量集,训练和查询方法等的类。1. Index类汇总 Method Class name index_factory Main parameters Bytes/vector Exhaustive Comments Exact Sea.原创 2020-08-06 18:00:35 · 6551 阅读 · 2 评论 -
Faiss(3):基于IndexIVFPQ的demo程序
这一步其实在创建index实例之后就可以进行,那么后续的train、add则直接调用index_gpu在GPU中进行,也可以在cpu中add和train之后再整体拷贝到GPU中。由于我用的Tesla P4的shared memory只有48M,而当m设置为64时所需的shared memory为64M,所以我通过co.useFloat16=True来“useFloat16LookupTables”,否则会报如下错误:原创 2020-06-08 23:22:40 · 3196 阅读 · 0 评论 -
Faiss(2):编程环境搭建
1. 环境硬件平台cpu: Intel Skylake系列, 20corememory: 32GBGPU: NVIDIA Tesla P4软件环境OS :Ubuntu16.04NVIDIA Driver : 440.33.01CUDA : 10.2CONDA : 4.8.0Faiss源代码版本: 1.6.12. 通过Conda安装这里基于GPU安装Faiss安装步骤1. 安装系统更新sudo apt-get updatesudo apt-get upgrad原创 2020-06-06 16:11:14 · 2556 阅读 · 0 评论 -
Faiss(1): 相似性类库搜索说明
Faiss(1): 相似性类库搜索说明1. 概述Faiss的全称是Facebook AI Similarity Search。是Facebook 2017年发布的一个相似搜索开源库,针对高维空间中的海量数据,提供了高效且可靠的检索方法。它可以提供基于十亿级别的数据集构建最近邻搜索算法的实现。这个场景是基于查询的传统搜索引擎无法解决的。举个例子,假设我们做人脸检索,每个人脸图像经过神经网络后可以提取出一个2048维的特征向量,把全中国13亿人的人脸特征全部存储在一个数据库中。在查询时,任意拍摄一张人脸图像原创 2020-06-06 15:14:15 · 2011 阅读 · 1 评论