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)