🚀 免费试用 Zilliz Cloud,完全托管的 Milvus,体验 10 倍的性能提升!立即试用>

milvus-logo
LFAI

1.index_file_size

  • Engineering
February 26, 2020
milvus

在《Milvus 配置的最佳实践》中,介绍了 Milvus 0.6.0 配置的一些最佳实践。在本文中,我们还将介绍在 Milvus 客户端中设置关键参数的一些最佳实践,这些参数用于包括创建表、创建索引和搜索等操作。这些参数会影响搜索性能。

1.index_file_size

创建表格时,index_file_size 参数用于指定用于存储数据的单个文件的大小(单位:MB)。默认值为 1024。导入向量数据时,Milvus 会以增量方式将数据合并到文件中。当文件大小达到 index_file_size 时,此文件不接受新数据,Milvus 会将新数据保存到另一个文件中。这些都是原始数据文件。创建索引时,Milvus 会为每个原始数据文件生成一个索引文件。对于 IVFLAT 索引类型,索引文件的大小大约等于相应原始数据文件的大小。对于 SQ8 索引,索引文件的大小约为相应原始数据文件的 30%。

在搜索过程中,Milvus 会逐个搜索每个索引文件。根据我们的经验,当 index_file_size 从 1024 变为 2048 时,搜索性能会提高 30% 到 50%。但是,如果该值过大,大文件可能无法加载到 GPU 内存(甚至 CPU 内存)。例如,如果 GPU 内存为 2 GB,而 index_file_size 为 3 GB,索引文件就无法加载到 GPU 内存。通常,我们将 index_file_size 设置为 1024 MB 或 2048 MB。

下表显示了使用 sift50m 对 index_file_size 进行的测试。索引类型为 SQ8。

1-sift50m-test-results-milvus.png 1-sift50m-test-results-milvus.png

我们可以看到,在 CPU 模式和 GPU 模式下,当索引文件大小为 2048 MB 而不是 1024 MB 时,搜索性能明显提高。

2.nlist nprobe

nlist 参数用于创建索引,而nprobe 参数用于搜索。IVFLAT 和 SQ8 都使用聚类算法将大量向量分成簇,即桶。nlist 是聚类过程中桶的数量。

使用索引搜索时,第一步是找到一定数量最接近目标向量的桶,第二步是通过向量距离从桶中找出最相似的 k 个向量。nprobe 是第一步中的桶数。

一般来说,在聚类过程中,增加nlist 会导致桶数增加,桶内向量减少。因此,计算负荷会减少,搜索性能也会提高。不过,由于用于相似性比较的向量较少,可能会错过正确的结果。

增加nprobe 会带来更多的搜索桶。因此,计算负荷会增加,搜索性能会下降,但搜索精度会提高。不同分布的数据集情况可能不同。设置nlistnprobe 时还应考虑数据集的大小。一般来说,建议nlist 可以是4 * sqrt(n) ,其中 n 是向量的总数。至于nprobe ,您必须在精度和效率之间做出权衡,最好的方法是通过反复试验来确定值。

下表显示了使用 sift50m 对nlistnprobe 进行的测试。索引类型为 SQ8。

sq8-index-test-sift50m.png sq8-index-test-sift50m.png

该表比较了使用nlist/nprobe 的不同值时的搜索性能和精度。由于 CPU 和 GPU 测试的结果相似,因此只显示了 GPU 的结果。在该测试中,当nlist/nprobe 的值以相同百分比增加时,搜索精度也会增加。当nlist = 4096 和nprobe 为 128 时,Milvus 的搜索性能最好。总之,在确定nlistnprobe 的值时,必须根据不同的数据集和要求,在性能和精确度之间做出权衡。

总结

index_file_size:当数据大小大于index_file_size 时,index_file_size 的值越大,搜索性能越好。nlistnprobe:必须在性能和精度之间做出权衡。

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started

Like the article? Spread the word

扩展阅读