Faiss框架学习

Faiss框架

Faiss是Facebook AI团队开源的针对聚类和相似性搜索库,为稠密向量提供高效相似度搜索和聚类,支持十亿级别向量的搜索,是目前最为成熟的近似近邻搜索库。使用C++编写,提供完美与numpy完美衔接的python接口。

一、核心算法实现

  • 聚类使用k-means高效聚类
  • PCA降维算法
  • PQ解码编码

二、功能流程

按列存储,压入内存index中存储。
在这里插入图片描述

三、index的使用方法

3.1 index

3.1.1 index创建
  • IndexFlatL2
    欧式距离计算,暴力搜索(穷尽搜索)
    IndexFlatL2(d)
    d:向量维度,构建Flat2索引,add向向量中添加向量,search提供搜索
  • IndexFlatIP
    点积计算,使用方式类似IndexFlatL2
  • IndexHNSWFlat
    分层,在小数据上性能优秀,使用id_map让id与向量关联
  • IndexIVFFlat
    索引精确检验(使用聚类),nlist划分搜索空间,quantizer量化器L2或点积,倒序索引,聚类中心个数,查询时检索几个聚类。
    fails.IndexIVFFlat(quantizer, d,nlist,faiss.METRIC_L2) quantizer量化器L2或点积,d向量维度,nlist划分的子搜索空间。METRIC_L2计算L2距离,faiss.METRIC_INNER_PRODUCT内积
  • IndexLSH
    局部敏感哈希
  • IndexScalarQuantizer
    标量量化
  • IndexPQ
    量化,全样本计算转化到子空间中心点的距离计算,特征编码,降低内存使用
  • IndexIVFScalarQuantizer
    ScalarQuantizer+IVF(聚类)
  • IndexIVFPQ
    聚类、量化
    faiss.IndexIVFPQ(quantizer, d,nlist,m,8)quantizer量化器L2或点积,d向量维度,nlist划分的子搜索空间,m向量降维参数,维度d必须是m的倍数,8每个子空间存储8bits。
  • IndexIVFPQR
    IndexIVFPQ的优化版
3.1.2 Matrix变换
  • 随机旋转:RandomRotationMatrix
  • 重新映射维度:RemapDimensionsTransform
  • PCA:PCAMatrix
  • OPQ量化:OPQMatrix
3.1.3 index创建和矩阵变换结合

remapper = fairs.RemapDimensionsTransform(d,d2,true)
index_pq = fais.indexPQ(d2,M,8)
index = fais.IndexPreTransform(remapper,index_pq)

3.1.4 index的功能函数

index.ntotal. index.is_trained
在这里插入图片描述

3.2 indexBinary

3.2.1 IndexBinary创建

IndexBinaryFlat
IndexBinaryIVF
IndexBinaryHNSW
faiss.index_binary_factory(d,“BIVF32”)

3.2.2 IndexBinary方法

在这里插入图片描述

3.3 index_factory

3.3.1前缀
  • IDMap IndexIDMap 支持add_with_ids,remove,reconstruct,reconstruct_n
3.3.2向量变换
  • PCA64, PCAR64, PCAW64, PCAWR64——PCAMatrix
  • OPQ16, OPQ16_64——OPQMatrix
  • RR64——RandomRotation
  • L2norm——NormalizationTransform
  • ITQ256, ITQ——ITQMatrix
  • Pad128——RemapDimensionsTransform
3.3.3非穷举搜索
  • IVF4096——IndexFlatL2 or IndexFlatIP
  • IMI2x9——MultiIndexQuantizer
  • IVF65536_HNSW32——IndexHNSWFlat
  • HNSW32——IndexFlatL2
  • HNSW32_SQ8——IndexScalarQuantizer
  • HNSW32_PQ12——IndexPQ
  • HNSW32_16384+PQ12——Index2Layer
  • HNSW32_2x10+PQ12——Index2Layer
3.3.4编码
  • Flat——IndexFlat, IndexIVFFlat
  • PQ16, PQ16x12——IndexPQ, IndexIVFPQ
  • SQ4, SQ8, SQ6, SQfp16——IndexScalar Quantizer, IndexIVF ScalarQuantizer
  • Residual128, Residual3x10——Index2Layer
  • ZnLattice3x10_6——IndexLattice
  • LSH, LSHrt, LSHr, LSHt——IndexLSH
3.3.5 index_factory使用

index = faiss.index_factory(d,“PCA32,IVF100,PQ8”)

index = faiss.index_factory(d,“IDMap,Flat”)
等价于
index = faiss.IndexFlatL2(d)
index = fais.IndexIDMap(index)

四、使用GPU

4.1 单gpu

res = faiss.StandardGpuResources()
gpu_index_flat = fairs.index_cpu_to_gpu(res,0,index_flat)

4.2 多gpu

cpu_index = faiss.IndexFlatL2(d)
gpu_index = faiss.index_cpu_to_all_gpus(cpu_index)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值