专栏首页Reinvent Data ScienceMilvus 最佳实践之如何设置API参数 (3)

Milvus 最佳实践之如何设置API参数 (3)

在上文《 Milvus 最佳实践之如何设置系统配置项 (2) 》中,针对 Milvus 0.6.0 版本的关键系统配置项给予了详细说明。本文针对 Milvus 0.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万条数据针对 index_file_size 的一个测试,索引类型为 SQ8:

如上图所示,在 CPU 模式和 GPU 模式下,index_file_size 设为2048MB,其搜索性能相对于1024MB有显著提高。

nlist和nprobe

nlist 是调用 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:两者结合综合考虑,需用户在性能和准确率之间进行取舍。

本文分享自微信公众号 - ZILLIZ(Zilliztech),作者:老莫

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 让音乐伴随你左右-Milvus 在丸音的应用

    丸音 APP 是一款基于 AI 音乐创作的音乐分享社区。我们希望通过丸音,让更多喜欢音乐的人能轻松地进行音乐创作,在丸音拥有属于你自己的音乐!

    ZILLIZ
  • Milvus数据管理:删除的实现原理

    本文将主要讲述 Milvus 是怎么实现删除功能的。删除是许多用户期待已久的功能,这次终于在 Milvus 0.7.0 版本中发布。区别于直接调用 FAISS ...

    ZILLIZ
  • 快速搭建对话机器人,就用这一招!

    问答系统是自然语言处理领域一个很经典的问题,它用于回答人们以自然语言形式提出的问题,有着广泛的应用。其经典应用场景包括:智能语音交互、在线客服、知识获取、情感类...

    ZILLIZ
  • R中的自定义函数function

    函数语法 函数名<-function(parameters){ statemens return(expression)} printLine <- funct...

    Erin
  • 最懂机器学习的围棋高手,解读柯洁首战AlphaGo时的失误

    解读柯洁大战AlphaGo,当然离不开围棋界最懂机器学习的高手。 本次,我们很荣幸邀请到围棋队的电脑专家——余平大师,来为我们讲解第一盘人机大战。 首先,当然...

    AI科技大本营
  • 理解JavaScript立即执行函数

    立即执行函数通常包含两种使用格式,具体使用那一种风格可以根据个人习惯和团队规范选择:

    伯爵
  • 64位内核开发第二讲.内核编程注意事项,以及UNICODE_STRING

    我们编写驱动.一定要知道驱动是如何运行的 首先在我们安装一个驱动的时候,会创建一个服务.(注册表)

    IBinary
  • 命名函数表达式

    好文章,可惜中文译文已经无法访问了。不过在cssrain上找到一篇:www.cssrain.cn/demo/named%20function%20express...

    meteoric
  • 获取元素CSS样式

    ProsperLee
  • Django基础篇-查询字段

    注意:filter(**kwargs)方法:根据参数提供的提取条件,获取一个过滤后的 QuerySet。

    小团子

扫码关注云+社区

领取腾讯云代金券