1、模型参数:1000代表聚类中心个数
随着聚类个数的增加,模型索引的构建时间近似指数增加但搜索精度也线性增加,不影响内存占用,几乎不影响搜索耗时
结论:在 Faiss 引擎的聚类情况下,对于百万级别
的数据大概 4000
个聚类基本足够,符合 Faiss 官网文档聚类取 4*sqrt(N),即100w的item,聚类中心个数设置为4000,精度能达到99%
2、搜索聚类个数
结论:固定聚类数量后,随着探针数量的增加,搜索耗时会近似均匀增加,搜索精度会逐渐接近 100%。因此在 Faiss 引擎的聚类情况下,建议 10%
的聚类数量作为探针数量是一个比较合适的搜索耗时和精度的平衡点。
索引性能优化建议
合理设置索引参数可显著提升搜索性能,下面针对常用的参数进行说明。
分片数
分片用来把大数据集切成多个子数据集。在搜索时,全部分片是并发执行的,分片数量越多,平均耗时越低,但是过多的分片会带来额外开销导致性能恶化。分片数设置原则:
- 单分片数据量建议控制在100万以内,例如500万向量,可设置5个分片。
- 如果数据量小于100万,建议使用1分片。系统对1分片有特定优化,可显著提升性能。
- 如果数据量非常大,分片数量也尽量控制在50个以内。
副本数
副本数是指每个主分片有多少个相同的备份,用来容灾和负载均衡。副本数加上主分片就是总副本数。总副本数越大,占用的内存越多。副本数设置原则:
- 一般情况下,线上环境副本数设置为2。副本数为0或1时,存在数据丢失的风险,建议仅在测试时选用。
- 总副本数上限为集群总节点数。超过这个限制创建索引时会报错:
Not enough nodes in cluster to create shard ...
- 如果分片数设置为1,当总副本数等于集群总节点数时,搜索性能最好,但是占用内存也最多,相当于退化为单机版。
- 搜索请求量越高的索引,应该设置越多的副本数,避免负载不均衡。
索引类型
索引类型指具体使用的ANN算法。目前有3种选择:Faiss、二进制、HNSW。索引类型设置原则:
- 可以
二值化
的向量,优先选择二进制索引。二进制索引占用内存资源比浮点型向量少。 - 数据量少于100万,建议优先选择HNSW。
- 其它情况选择Faiss类型索引。
距离类型
直接支持的距离类型有内积距离、欧式距离、汉明距离,间接支持cosine距离。建议使用cosine距离和欧式距离,内积距离不是严格意义上的距离类型。
- metric=0:内积距离(inner product),值越大越相似。如果向量提前做过
normalize L2
归一化,等价于cosine距离(cosine distance)。 - metric=1:欧氏距离(european distance),值越小越相似(注意:系统返回的欧式距离是欧式距离的平方,如果需要用到真实值,自行开平方)。
- Faiss二进制索引metric参数不用指定,强制使用汉明距离(Hamming distance),值越小越相似。
向量维度
系统对向量维度没有限制,但是合适的维度有助于提升性能。
- 维度建议为4的整数倍,字节对齐有助于提升搜索性能。非4的整数倍维度可以添0增加维度至4的整数倍。
- 维度越高,存储成本越高,检索效率越低。可提前做PCA降维处理,或者设置Faiss索引的参数降维