Faiss 如何选择索引

Faiss 如何选择索引

flyfish

问题一:是否需要精确结果?
如果是,那么应该使用 “Flat”

能保证精确结果的只有 IndexFlatL2 或 IndexFlatIP(Inner Product). 它们作为其他索引的基线结果.

问题二:是否关心内存?

请记住,所有Faiss索引都存储在RAM中。 以下内容认为,如果不需要精确的结果,则RAM是限制因素,并且在内存限制内,我们优化了精度与速度之间的权衡。

如果不在乎内存,那么应该使用 “HNSWx”
如果你的内存很大,或数据集很小,那么 HNSW 是最好的选择, 它是非常快、精确的索引.

如果稍微有点在意,那么应该使用 “…,Flat”

"…"表示必须事先执行数据集的聚类。 聚类后​​,“Flat”仅将向量安排到存储桶(bucket)中,因此不会压缩它们,保存的是原始数据,存储大小与原始数据集相同。 速度和精度之间的权衡是通过nprobe参数设置的。

如果很在意,那么应该使用 “PCARx,…,SQ8”
如果存储所有的向量开销太大, 那么可以如下两个操作:
1、用主成分分析来减小到x维以减小维度
2、每个向量分量的标量量化为1个字节

如果非常非常在意,那么应该使用 “OPQx_y,…,PQx”

问题三:根据数据集的大小,应该怎么选择?
M=百万个向量
B=十亿个向量

如果小于1M, 应该使用 “…,IVFx,…”
如果在1M-10M, 应该使用 “…,IVF65536_HNSW32,…”
如果在10M-100M,使用"…,IVF262144_HNSW32,…"
如果在100M-1B: “…,IVF1048576_HNSW32,…”

官网针对典型的用户案例进行了详细的说明
Indexing 1M vectors(1百万)
Indexing 1G vectors (10亿)
Indexing 1T vectors (1万亿)

原文地址

你可能感兴趣的:(深度学习)