共计 2879 个字符,预计需要花费 8 分钟才能阅读完成。
- 文档更新于 2.1.4 版本公布之际,很快乐和大家分享 Milvus 的新变动和产品的成长。
- Zilliz 合伙人兼技术总监 栾小凡
继年初公布 Milvus 2.0 版本之后,在数百位 Milvus 社区贡献者六个月的共同努力下,咱们在早些时候公布了 Milvus 2.1 版本,通过两个月的数次迭代,版本趋于稳定,被国内外头部厂商信赖和抉择应用。
在此次大版本更新中,最为重要的两个关键词莫过于:易用性 和性能。
为了可能买通算法工程师笔记本到海量向量召回生产场景的“最初一公里”,在这个令人激动的版本中,咱们除了在程序性能、可扩展性、安全性、可观测性方面做出了诸多改良之外,还减少了以下新个性:字符串数据类型、Kafka 音讯队列、Embedded 形式运行 Milvus。
性能晋升:3.2 倍只是开始
相较于传统 KNN 检索,Milvus 此前提供的 ANN 检索形式尽管曾经带来了质的飞跃。然而,当用户面向亿级大规模向量数据的召回场景时,吞吐量和提早仍旧存在很大的挑战。
在 Milvus 2.1 中,咱们次要进行了五个方面的性能改良和性能晋升。
更高效的路由协定:5ms 检索提早
在 Milvus 2.1 中,咱们设计了全新的路由协定,并在检索链路中去除了对音讯队列的依赖,让小数据集场景下的检索提早失去了大幅升高。结果显示,以后版本的 Milvus 在百万数据规模的测试中,提早可能达到 5ms 左右,足以满足搜寻、举荐等在线要害链路对于提早的刻薄要求。
更高性能的并发模型:3.2 倍性能晋升
在 Milvus 2.1 中,咱们对并发模型也进行了调整。在以后版本中,咱们引入了新的代价评估模型和并发调度器。实现了两个要害能力:并发管制和小查问合并。
前者保障了咱们既不会存在大量并发申请争抢 CPU 和缓存资源的状况,也不会因为并发太少而导致 CPU 无奈被齐全利用;后者则是通过在调度器层面智能地合并申请参数统一的小 nq 查问,可能解决在查问 nq 较小、并发又十分高的场景下 Milvus 的性能压力。在这个场景下,业务不须要批改任何一行代码就可能取得 3.2 倍的性能晋升。
残缺的性能测试报告目前曾经在官网公开:《Milvus 2.1 Benchmark Test Report》。
平安高效的内存多正本机制
在 Milvus 2.1 中,咱们引入了内存多正本机制。除了可能晋升零碎在小数据规模下的扩展性和可用性之外,还可能解决读 QPS 较高场景下的性能压力。
这个新机制相似传统数据库中的只读正本性能,可能通过加机器来简略实现零碎的横向扩大。特地适宜泛滥向量检索利用场景中的举荐零碎利用场景,满足惯例举荐零碎在小数据集场景下提供远超单机性能限度的 QPS 的需要。
在接下来的版本演进中,咱们将基于多正本机制进一步实现 Hedged Read 机制,让零碎可能在“故障复原场景”下避开有问题的正本,快速访问数据和性能失常的正本,充分利用内存冗余晋升零碎的可用性。
高性能的数据加载实现
Milvus 2.1 中,最初一个性能晋升的改变来自于对数据加载的优化。在以后版本的 Milvus 中,咱们引入了 Zstandard(zstd),对 Binlog 进行实时数据压缩,大幅缩小了数据加载过程中的网络开销,以及对象存储和音讯队列中数据所占用的空间。
除此之外,通过引入 Golang 协程池技术,Milvus 实现了在管制内存资源最大使用量的状况下,并发加载 Segment,同样大幅升高了故障复原工夫,以及加载数据所须要的工夫。
重磅性能:字符串类型反对与标量索引
向量数据库场景中最常见的用户需要之一是属性过滤,例如“寻找价格在 200~300 元区间与某个用户爱好类似的商品”、“找到带有向量数据库这个关键词并和云原生话题相干的文章”。
在新版本的 Milvus 中,咱们反对了变长字符串的数据类型,用户能够将字符串类型用做主键,并作为后果进行输入。当然,也能够基于字符串类型实现比拟过滤和前缀匹配。
为了解决以往数据过滤慢的问题,新版本中还减少了针对标量数据的倒排索引实现。
咱们基于 Succinct MARISA-trie 实现了字符串类型的倒排索引,可能以极低的内存耗费将全副数据加载进内存,疾速进行字符串的比拟过滤和前缀匹配操作。相比拟 Python 字典的实现,咱们仅须要十分之一的内存耗费,就可能实现全副数据的加载并提供查问能力。
在将来的版本中,Milvus 将会继续投入标量查问相干的性能建设,反对更多标量索引类型以及查问算子,提供基于磁盘存储的标量查问能力,继续升高标量数据的存储和应用老本。
易用性晋升:让零碎更好用
Milvus 反对应用 Kafka 作为音讯队列
让 Milvus 应用 Apache Kafka 作为流式存储组件,始终以来是 Milvus 社区中用户呼声最高的性能之一。
得益于 Milvus 2.x 版本中更好的形象封装,以及来自 Confluent 公司奉献的 Go Kafka SDK,在 Milvus 2.1 版本中,咱们提供了一个新的性能:用户能够自行抉择配置应用 Pulsar 或者 Kafka 作为流式存储组件。
生产级别的 Java SDK 正式公布
通过测试团队的紧密测试,Milvus Java SDK 正式公布。Java SDK 具备了与 Python SDK 完全一致的能力,并且领有更好的并发性能。在接下来的产品布局中,咱们将和社区的同学们一起欠缺 Java SDK 的文档及应用案例。
晚些时候,Go SDK 和 RESTful SDK 也将进入生产级别的版本公布,敬请期待!
可观测性和可维护性晋升
Milvus 2.1 减少了重要的性能监控指标,如:向量插入计数、检索提早记录、检索吞吐量记录、节点内存开销、CPU 资源开销。
此外,在新版本中,咱们对于日志输入也进行了大幅优化,当初用户可能通过调整日志级别,缩小日志打印量,更加不便直观地观测零碎的运行状况。
Embedded Milvus
Milvus 的呈现极大地简化了海量大规模数据检索场景下检索服务的部署。然而,不论是应用 Docker 还是 K8s,对于想要在更小规模数据上实现算法验证的数据科学家来说,零碎部署的过程仍旧比较复杂。
随着 Embedded Milvus 的引入,咱们当初能够应用 pip 来实现 Milvus 的装置,如同应用 PyRocksDB 和 PySQLite 一样。Embedded Milvus 反对单机和集群版 Milvus 的所有性能,让用户可能在无需批改任何代码的状况下,轻松地从笔记本电脑切换到分布式生产环境,大大减少算法工程师应用 Milvus 进行原型验证的老本。
心动不如口头:体验开箱即用的向量检索
除了以上内容之外,咱们在稳定性和可扩展性上也做出了很大的晋升,期待您的应用!
如果您在应用过程中遇到了问题,或者有好的倡议,欢送与咱们分割!
文章补充材料
- Milvus 2.1 版本 Release Notes
- Milvus 装置文档
如果你感觉咱们分享的内容还不错,请不要悭吝给咱们一些激励:点赞、喜爱或者分享给你的小伙伴!
流动信息、技术分享和招聘速递请关注:https://zilliz.gitee.io/welcome/
如果你对咱们的我的项目感兴趣请关注:
用于存储向量并创立索引的数据库 Milvus
用于构建模型推理流水线的框架 Towhee