开源向量数据库性能对比: Milvus, Chroma, Qdrant

莱莱  金牌会员 | 2024-12-25 14:27:58 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 876|帖子 876|积分 2628


  

  

  01.
  前言  为应对公司在大规模文本、图像等非布局化数据处置惩罚上的业务增长需求,笔者着手调研当前流行的开源向量数据库。主要针对查询速度、并发度和召回率这几大焦点维度进行深入分析,以确保选定的数据库方案能够在现实业务场景中高效应对大规模数据检索和高并发需求。通过全面对比不同数据库的体现,得出可靠的调研结论。
  笔者首先在墨天轮排行榜中查看了国产向量数据库的排行情况。前三名分别是 Milvus、TensorDB、腾讯云VectorDB。Milvus 是一个非常受接待的开源向量数据库,目前在GitHub上已经有30K的star,足以分析它的关注度非常的高。TensorDB 是爱可生的闭源向量数据库,想使用只能走贸易途径。腾讯云VectorDB 从名字上就能看出来是腾讯的向量数据库,它也是闭源的,但是可以在腾讯云上申请试用。试用的设置只有1核,1G内存,20G磁盘空间,不满足笔者的测试需求。
  
  目前看来,只有 Milvus 能满足开源的测试条件。看来笔者不能局限在国产数据库了,于是在 DB-Engines 排行榜,笔者找到了前几名的纯向量数据库 Pinecone、Milvus、Chroma、Qdrant。其中只有 Pinecone 是闭源的,只能通过云来访问使用。所以接下来笔者会对 Milvus、Chroma、Qdrant 三个数据库做一次性能测试。
  
  PS:想相识向量数据库本领相关的比对(包括数据库架构、支持的索引类型、不同的特性等等),可以移步到 zilliz 官网中查看详细信息:https://zilliz.com/comparison
  

  02.
  性能测试工具的选择  现在已经找到了需要测试的开源向量数据库,下一步当然是挑选测试的工具啦。在评估向量数据库的过程中,ANN Benchmark 和 VectorDBBench 是两个常用的性能测试工具。他们也有各自的优缺点:
  ANN Benchmark 是一种外部性能测试工具,专门用于评估不同的向量索引算法在真实数据集上的性能。向量索引是向量数据库中资源斲丧大的组件,其性能直接影响整个数据库的体现。ANN Benchmark 在评估向量索引算法方面体现出色,有助于选择和比力不同的向量搜索库。然而,它并不适用于评估复杂且成熟的向量数据库体系,也未能涵盖如“向量搜索+条件过滤”这样的情况。
  VectorDBBench 是一个为开源向量数据库(如 Milvus 和 Weaviate)以及全托管向量数据库服务(如 Zilliz Cloud 和 Pinecone)设计的开源性能测试工具。它支持查看向量数据库的 QPS 和召回率。VectorDBBench 专为向量数据库全面评估而设计。它关注资源斲丧、数据加载本领和体系稳定性等因素。VectorDBBench 能够进行的测试更接近真实世界的生产环境。
  为了更全面且真实的测试,笔者末了选择了 VectorDBBench 测试工具。
  PS:VectorDBBench 已经做过一些基准测试,并且把结果公布在官网中了,可以到这里查看:https://zilliz.com.cn/vector-database-benchmark-tool?database
  

  03.
  向量数据库的当地摆设  本次测试,三个数据库都会用docker的方式摆设在一台 12c64g 的CentOS7的机器上,每次测试只启动其中一个数据库的 docker 实例来保证测试数据的精确性。
  1. Qdrant 摆设

  最新的版本是 1.11.5,本次摆设为此版本。
  1. # 从 Dockerhub 下载最新的 Qdrant 镜像
  2. docker pull qdrant/qdrant
  3. #运行服务
  4. docker run -d -p 6333:6333 -p 6334:6334 \
  5.     -v /home/caiyfc/Qdrant/qdrant_storage:/qdrant/storage:z \
  6.     qdrant/qdrant
复制代码
Qdrant 现在可以访问:
  REST API:http://localhost:6333/
  Web 用户界面:http://localhost:6333/dashboard
  GRPC API:http://localhost:6334/
  2. Chroma 摆设

  本次使用的版本是 v0.5.8.dev16
  推荐使用 pip install chromadb 摆设。但是为了方便测试,所以这里使用docker摆设。
  1. # 从 Dockerhub 下载最新的 chroma 镜像
  2. docker pull chromadb/chroma:0.5.8.dev16
  3. #运行服务,由于 VectorDBBench 连接 Chroma,必须输入密码,所以这里需要先创建一个密码
  4. docker run -d -p 6335:8000 -e CHROMADB_DB_PASSWORD='admin123' chromadb/chroma:0.5.8.dev16
复制代码
留意:笔者在后续的测试过程中发现,chroma 选择了不同向量维度的测试用例时,会出现一种向量维度的测试用例能正常测试,而另一种必然会失败。在排查之后发现,chroma 的docker 实例中,是有报错的:
  
  这是分析当前的设置不答应实行 "重置" 操纵,所以在一种向量维度的测试用例完成后,VectorDBBench 在 drop old collection 时,会失败,导致无法切换到另一个向量维度。所以在摆设的时间要加上环境变量ALLOW_RESET=TRUE,命令是:
  1. docker run -d -p 6335:8000 -e CHROMADB_DB_PASSWORD='admin123' -e ALLOW_RESET=TRUE chromadb/chroma:0.5.8.dev16
复制代码
3. Milvus 摆设

  本次使用的版本是 v2.4.5
  1. # Download the installation script
  2. $ curl -sfL https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh -o standalone_embed.sh
  3. # Start the Docker container
  4. $ bash standalone_embed.sh start
  5. # 集群管理
  6. # Stop Milvus
  7. $ bash standalone_embed.sh stop
  8. # Delete Milvus data
  9. $ bash standalone_embed.sh delete
复制代码
  至此,三个数据库已经全部摆设乐成。接下来就要开始摆设 VectorDBBench 了。
  

  04.
  VectorDBBench 当地摆设及使用  本次是在 win11 操纵体系上直接摆设的,机器的cpu是i5-8600K,内存16G。
  1. # 先决条件 python >= 3.11
  2. pip install vectordb-bench
  3. # 安装执行客户端
  4. pip install vectordb-bench[qdrant]
  5. pip install vectordb-bench[chromadb]
  6. #启动
  7. init_bench
复制代码
启动之后,会主动打开欣赏器,并进入VectorDBBench 的主页,其中表现了 VectorDBBench 提供的标准基准测试结果,此外,用户本身实行的所有测试的结果也将在此处表现。
  
  笔者需要本身来进行测试,所以直接选择了“Run Your Test”的功能。
  
  点击“Run Your Test”按钮之后,需要选择待测试的向量数据库。如果内置的没有想要测试的数据库,那可以根据GitHub的例子手动增加:https://github.com/zilliztech/VectorDBBench?tab=readme-ov-file#adding-new-clients
  
  选择好了待测试数据库,需要填写上对应数据库的连接信息:
  PS:为了制止干扰,本次测试每次只选择一个数据库进行测试,并关闭其他两个数据库的 Docker 实例。虽然可以同时选择并填写多个数据库,VectorDBBench 也会进行串行测试,但为了更好地记载数据库使用体系资源的情况,分开测试能够淘汰干扰,记载更精确的结果。
  
  由于资源不敷,测试用例同一选择如下,在不同的数据量及不同的向量维度下来进行测试,其他设置保持默认。
  
  
  
  
  
  
  然后点击 “Run Your Test” 就可以开始测试。
  
  在测试过程中,如果发现测试结果有失败的情况,可以查看 VectorDBBench 的输出,内里会有详细的报错情况。笔者就遇到了一次报错:
  
  这里提示了:
  1. vectordb_bench.models.PerformanceTimeoutError: Performance case optimize timeout
复制代码
分析这是超时导致的报错。需要修改参数,由于笔者在win11中摆设的 VectorDBBench ,所以设置文件在:
  1. C:\Users\xxxx\AppData\Local\Programs\Python\Python311\Lib\site-packages\vectordb_bench\__init__.py
复制代码
修改如下参数,并重启 VectorDBBench 即可:
  
  

  05.
  测试结果  1. 资源斲丧情况

  资源斲丧需要观察CPU使用率、内存斲丧、磁盘IO及网络情况,所以笔者在另外一台虚拟机中搭建了 prometheus + grafana 的监控体系。并且在向量数据库的机器上安装了 node_exporter,给 prometheus 提供实时的监控数据。
  Qdrant:
  
  Chroma:
  
  Milvus:
  
  2. 性能指标情况

  性能指标主要从以下四个方面来体现:
  

  • QPS (Queries Per Second):

    • 每秒处置惩罚的查询数目。QPS 是权衡体系查询处置惩罚本领的指标,越高的 QPS 表示体系能够在单元时间内处置惩罚更多的查询。

  • Recall

    • 是检索体系的精确率指标,用来权衡查询结果中返回的相关项与现实相关项的比例。Recall 越高,表示返回的查询结果中包罗更多精确的匹配项。用来评估体系在近似查询时的结果。

  • Load Duration

    • 数据加载时间,表示将数据加载到数据库中所花费的总时间。这个指标权衡数据库的加载效率,通常数据量越大,加载时间越长。

  • Serial Latency P99

    • 这是 99% 的查询处置惩罚时间的上限,表示体系处置惩罚 99% 的查询所需的最长时间(99th percentile latency)。这个指标是用来权衡体系响应时间的一致性,值越低,体系的响应越稳定。P99 延迟越高意味着体系偶然会有慢查询。

  性能测试的结果如下如图:
  
  3. 测试总结

  Qdrant:
  

  • 优点:中规中矩,Qps 相对较高、延迟相对较低。在CPU和磁盘IO方面的利用率较高,能够在处置惩罚高负载时提供较好的性能。
  • 缺点:在大数据集的加载时间和总体检索精度上略逊于 Milvus,适合对过滤查询有需求但不追求极端性能的场景。对CPU和内存的需求较大,尤其在高并发和复杂查询时可能会出现较高的资源斲丧,导致体系负载上升。
  Chroma:
  

  • 优点:对于较小的数据集,Chroma 更容易上手和集成。对CPU的依靠较低,更多依靠内存来处置惩罚大规模数据。
  • 缺点:性能在 Qps、Recall、加载时间和延迟方面都不如 Milvus 和 Qdrant,尤其是在大规模和高并发场景下体现较差。并且内存斲丧较大,在长时间运行时对体系的内存要求较高,可能会影响其他应用步伐的运行。
  Milvus:
  

  • 优点:团体性能最强,尤其是在 Qps、Recall、加载时间和延迟方面都体现优异,适合大规模、高并发的向量查询场景。且CPU与内存使用率的控制较为出色。
  • 缺点:大数据集的加载时间还有提升的空间,团体上仍然体现出色。
  根据测试结果来看,Milvus 是当前最优的选择,适合处置惩罚大规模数据集和对性能要求较高的应用。Qdrant 则中规中矩,有着较低的延迟,适合规模不大且对延迟有高要求的应用,而 Chroma 更适合小规模、低负载的应用。
  参考文献
  [1] 向量数据库性能测试技巧
  作者先容
  

  
Zilliz 黄金写手:蔡一凡

  推荐阅读
  

  

  

  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

莱莱

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表