在上面的《?Milvus 最佳实践之如何设置系统配置项 (2)?》中,对Milvus0.6.0版本的关键系统配置项进行了详细的说明。本文对Milvus0.6.0版本的API关键参数进行了详细的说明和测试验证,并给出了设置建议。这些API参数包括调用create_table、create_index和search时的参数设置,会影响搜索性能。index_file_size在调用create_table时有一个index_file_size参数,用于指定数据存储时单个文件的大小,单位为MB,默认值为1024。我们知道,当矢量数据不断导入时,Milvus会增量合并数据到文件中。当一个文件达到index_file_size设置的值时,该文件将不再接收新数据,Milvus会将新数据合并保存为另一个文件。这些都是原始矢量数据文件。如果建立了索引,则会为每个原始文件生成一个索引文件。对于IVFLAT索引,索引文件的大??小基本等于对应的原始文件的大小。对于SQ8索引,索引文件大小约为原始文件的30%。Milvus搜索时,会依次搜索每个索引文件。根据我们的经验,当index_file_size从1024改为2048时,搜索性能会提升大约30%到50%。但需要注意的是,如果该值设置过大,大文件可能无法加载到显存(甚至内存)中。比如显存只有2GB,如果这个参数设置成3GB,显存就明显装不下了。常用的index_file_size为1024MB和2048MB。下面是使用公开测试数据集sift1b的5000万条数据对gpu_search_threshold的测试,索引类型为SQ8:如上图所示,在CPU模式和GPU模式下,index_file_size设置为2048MB,其搜索性能明显比1024MB有所提高。nlist和nprobenlist是调用create_index时设置的参数,nprobe是调用search时设置的参数。我们知道,IVFLAT和SQ8索引都是通过聚类算法把大量的向量划分成很多“簇”(也叫“桶”),nlist是指聚类时划分的桶总数。通过索引查询时,第一步是找到离目标向量最近的几个桶,第二步是通过比较向量距离,在这几个桶中找到最相似的k个向量。nprobe指的是第一步的桶数。一般来说,增加nlist会增加桶的数量,减少每个桶中的向量数量,减少所需的向量距离计算量,从而提高搜索性能。但是,由于比较向量的数量减少,可能会错过正确的结果,因此准确率下降;增加nprobe意味着搜索更多的桶,因此计算量变大,搜索性能下降,但准确率提高。具体情况在面对不同分布的数据集时会有一些差异,数据集的大小也会影响nlist和nprobe的选择。通常,我们推荐的nlist值是4*sqrt(n),其中n是数据向量的总数;而nprobe的取值需要在精度可接受的情况下,在兼顾效率的同时综合考虑。更好的方法是通过多次实验确定一个合理的值。下面是使用公开测试数据集sift1b的5000万条数据对nlist和nprobe的测试,索引类型为SQ8:上图是使用不同的nlist/nprobe组合时的搜索性能和准确率对比。由于CPU和GPU测试结果相似,这里只展示GPU测试结果。在本次测试中,对于按比例增加的nlist/nprobe,随着它们的增加,准确率呈上升趋势,当nlist为4096,nprobe为128时表现最佳。因此,在实际选取nlist的取值时而nprobe,需要针对不同的数据集,根据用户自身的需求,在速度和准确率之间做适当的权衡。总结→index_file_size:当数据量大于这个值时,参数值越大,搜索性能越好。→nlist和nprobe:两者的结合需要用户在性能和准确性之间做出权衡。欢迎加入Milvus社区Milvus源码github.com/milvus-io/milvusMilvus官网milvus.ioMilvusSlack社区milvusio.slack.com?2020ZILLIZ?
