1.index_file_size
在《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
我们可以看到,在 CPU 模式和 GPU 模式下,当索引文件大小为 2048 MB 而不是 1024 MB 时,搜索性能明显提高。
2.nlist
和 nprobe
nlist
参数用于创建索引,而nprobe
参数用于搜索。IVFLAT 和 SQ8 都使用聚类算法将大量向量分成簇,即桶。nlist
是聚类过程中桶的数量。
使用索引搜索时,第一步是找到一定数量最接近目标向量的桶,第二步是通过向量距离从桶中找出最相似的 k 个向量。nprobe
是第一步中的桶数。
一般来说,在聚类过程中,增加nlist
会导致桶数增加,桶内向量减少。因此,计算负荷会减少,搜索性能也会提高。不过,由于用于相似性比较的向量较少,可能会错过正确的结果。
增加nprobe
会带来更多的搜索桶。因此,计算负荷会增加,搜索性能会下降,但搜索精度会提高。不同分布的数据集情况可能不同。设置nlist
和nprobe
时还应考虑数据集的大小。一般来说,建议nlist
可以是4 * sqrt(n)
,其中 n 是向量的总数。至于nprobe
,您必须在精度和效率之间做出权衡,最好的方法是通过反复试验来确定值。
下表显示了使用 sift50m 对nlist
和nprobe
进行的测试。索引类型为 SQ8。
sq8-index-test-sift50m.png
该表比较了使用nlist
/nprobe
的不同值时的搜索性能和精度。由于 CPU 和 GPU 测试的结果相似,因此只显示了 GPU 的结果。在该测试中,当nlist
/nprobe
的值以相同百分比增加时,搜索精度也会增加。当nlist
= 4096 和nprobe
为 128 时,Milvus 的搜索性能最好。总之,在确定nlist
和nprobe
的值时,必须根据不同的数据集和要求,在性能和精确度之间做出权衡。
总结
index_file_size
:当数据大小大于index_file_size
时,index_file_size
的值越大,搜索性能越好。nlist
和nprobe
:必须在性能和精度之间做出权衡。
- 2.nlist 和 nprobe
- 总结
On This Page
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word