ES 8的向量检索性能调优实践

前言

ES的官方实验室曾发布过一篇博客,介绍了使ES向量检索性能获得显著提升的技术要点与展望:

  1. 多线程搜索能力的利用:Lucene 的分段架构允许实现多线程搜索能力。Elasticsearch 通过同时搜索多个段来提高性能,使用所有可用的 CPU 核心的计算能力显著减少了单个搜索的延迟。
  2. 加速多图向量搜索:通过在邻近图中平衡探索和利用,调整扩展匹配集的大小,控制运行时间和召回率之间的权衡,这对于在多个图中实现最佳搜索性能至关重要。
  3. 信息交换优化:在多图搜索场景中,通过智能地在搜索之间共享状态,使基于全局和局部竞争阈值的遍历决策更加明智,从而提高搜索效率。
  4. Java 最新进展的利用:通过 Project Panama Vector API,Java 代码现在可以无缝地与 SIMD 指令交互,解锁矢量引擎。
  5. 标量量化:Lucene 引入了标量量化技术,这是一种有损压缩技术,可以在不牺牲搜索性能的情况下显著减少内存需求。
  6. 压缩技术的改进:通过将每个维度从 7 位压缩到 4 位,进一步减少了数据大小,同时保持了搜索结果的准确性。
  7. 二进制量化的探索:未来可能会将二进制量化技术集成到 Lucene 中,这有可能彻底改变向量存储和检索。
  8. 多向量集成:Lucene 和 Elasticsearch 通过嵌套字段和连接功能,支持在顶级文档中管理多个嵌套文档,允许跨嵌套文档进行搜索,并随后与它们的父文档连接。
  9. 预连接优化:在搜索子向量段落时,Lucene 能够在搜索 HNSW 图的同时预先连接到父文档,确保返回的是文档而不是段落,这提高了效率。

这些技术如果得到集成,大部分是对用户透明的,我们今天要说的是在实践层面,对于向量检索有哪些调优考虑。

段合并只有20%的性能提升吗?

在之前的初步测试中,我们已经得出一个确定的结论(ESrally已专门为此设计了测试用例),在测试工具默认参数的情况下,段合并可以带来全面的 20%性能提升(也就是无论其他参数如何变换,QPSlatency性能表现提升趋势接近一致)。

我们观察数据量(约 260 万 96 维数据):

原始文档的大小解压缩后是 20 GB。

将数据写入ES后索引实际占用的存储:

# 合并前:4.5GB
curl  http://localhost:9200/_cat/indices/vectors?v
health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size dataset.size
green  open   vectors f4iuM6vjTGiBwz8lofwqFw   2   0    2500000            0      4.5gb          4.5gb        4.5gb## Running force-merge 100%- 合并后:1GB
curl  http://localhost:9200/_cat/indices/vectors?v
health status index   uuid                   pri rep docs.count docs.deleted store.size pri.store.size dataset.size
green  open   vectors f4iuM6vjTGiBwz8lofwqFw   2   0    2500000            0        1gb            1gb          1gb

跟随后续的并发调优,我们可以看出段合并的巨大优势,不止 20%!

并发 QPS 调优

并发10的情况

无法直接修改搜索并发,需要改动源码目录 .rally/benchmarks/tracks/default/dense_vector/challengesdefault.json

# 修改示例
{"name": "knn-search-100-1000_multiple_segments","operation": "knn-search-100-1000","warmup-iterations": 100,"clients": 10,"iterations": 1000
}

测试指令:

./esrally race --track-path=/root/.rally/benchmarks/tracks/default/dense_vector --target-hosts=localhost:9200 --pipeline=benchmark-only  --offline  --report-file=/home/elastic/ssd_dv_s2-c1-30g-d1-sc10-1.csv --report-format=csv --track-params="bulk_indexing_clients:1" --user-tags="shards:2,clients:1,mem:30g,disk:1,sc:10"

对比基线为全默认值,变量为 sc:10,也就是搜索并发度为 10。

比较两次测试结果:

 ./esrally compare --baseline b337fb0a-39cf-4119-abe5-6dd4be745a32 --contender 576b29d8-98a0-458d-8af1-27830068df80 --report-file /home/elastic/dv-shards2-sc10_1.csv  --report-format csv
  • knn-search-10-100 +883.02%

  • knn-search-100-1000 +866.39%

  • knn-search-10-100_multiple_segments +496.02%

  • Knn-search-100-1000_multiple_segments +269.07%

    在 10 搜索并发的情况下,对比结果显示 QPS 相比默认参数提高数倍。而且,段合并对性能的影响也放大了

CPU 使用率明显上升了:

总体 52.9%使用率, es 进程使用了 2538% 的 CPU。

注意,每轮测试需主动删除 ES 中的测试索引(vectors)!

curl -XDELETE  http://localhost:9200/vectors

继续测试

并发 20/30/40/50 的情况。

20 search
Mean Throughput,knn-search-10-100_multiple_segments,169.83212959330336,1223.2297240422738,+1053.39759,ops/s,+620.26%90th percentile latency,knn-search-10-100_multiple_segments,4.8985810310114175,15.743541764095427,+10.84496,ms,+221.39%99th percentile latency,knn-search-10-100_multiple_segments,6.255753734731111,61.14699723257214,+54.89124,ms,+877.45%Mean Throughput,knn-search-100-1000_multiple_segments,71.8843832772858,286.788544718593,+214.90416,ops/s,+298.96%99th percentile latency,knn-search-100-1000_multiple_segments,15.602529068710282,114.20343654463056,+98.60091,ms,+631.95%Mean Throughput,knn-search-10-100,198.15221100022976,4285.480938609085,+4087.32873,ops/s,+2062.72%99th percentile latency,knn-search-10-100,3.9556266699219123,3.956923596560939,+0.00130,ms,+0.03%Mean Throughput,knn-search-100-1000,93.08795806647417,2109.4832627430874,+2016.39530,ops/s,+2166.12%99th percentile latency,knn-search-100-1000,13.300802457379177,12.577712316997342,-0.72309,ms,-5.44%
30 search

后续仅记录代表性的结果:

Mean Throughput,knn-search-10-100,198.15221100022976,5736.259111262101,+5538.10690,ops/s,+2794.88%Mean Throughput,knn-search-10-100_multiple_segments,169.83212959330336,1253.008883159874,+1083.17675,ops/s,+637.79%

注意到,多段的检索性能已经达到瓶颈了,1223 -> 1253 ops。

40 search
# 合并段
Mean Throughput,knn-search-10-100,198.15221100022976,6327.666524710088,+6129.51431,ops/s,+3093.34%# 多段
Mean Throughput,knn-search-10-100_multiple_segments,169.83212959330336,1307.2178700891045,+1137.38574,ops/s,+669.71%## 延迟
99th percentile latency,knn-search-10-100,3.9556266699219123,8.661079301964493,+4.70545,ms,+118.96%99th percentile latency,knn-search-10-100_multiple_segments,6.255753734731111,112.7571176411585,+106.50136,ms,+1702.45%

在这里插入图片描述

监控数据显

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/849228.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关闭windows11磁盘地址栏上的历史记录

关闭windows11的磁盘地址栏上的历史记录 windows11打开磁盘后访问某一个磁盘路径后会记录这个磁盘路径,而且有时候会卡住这个地址栏(关都关不掉),非常麻烦。 如下图所示: 关闭地址栏历史记录 按下windows键打开开…

Python 机器学习 基础 之 【常用机器学习库】 Matplotlib 数据可视化库

Python 机器学习 基础 之 【常用机器学习库】 Matplotlib 数据可视化库 目录 Python 机器学习 基础 之 【常用机器学习库】 Matplotlib 数据可视化库 一、简单介绍 二、Matplotlib 基础 1、安装 Matplotlib 2、导入 Matplotlib 3、基本绘图 3.1 绘制简单折线图 3.2、绘…

【AutoSar网络管理】如何循环测试CAN网络管理的唤醒时间

测试用例: Preconditions: DUT出于休眠状态 Steps to reproduce: Step1:仿真外部NM报文,唤醒ECU。 Step2:停止仿真Step1的报文,从总线上最后一帧NM开始,等待时间T。 Step3:仿真外部NM报文,此时记录为T1。 Step4:等待DUT发送第一帧报文,此时记录为T2,计算T2 - T1。…

8086 汇编笔记(十二):int 指令 端口 直接定址表

一、int 指令 int 指令的格式为:int n,n 为中断类型码,它的功能是引发中断过程 CPU 执行 intn 指令,相当于引发一个n号中断的中断过程,执行过程如下: (1) 取中断类型码 n; (2) 标志寄存器入栈,IF0&…

Vue3页面进入动画

这里我使用了一种页面动画库animate.css 这里我附上它的链接 Animate.css | A cross-browser library of CSS animations. 我使用的是Vue3 //App.vue代码如下 <router-view v-slot"{ Component, route }"><transitionbefore-enter"beforeEnter"en…

Framework | Android Rescue Party: 提升设备恢复力的机制

Framework | Android Rescue Party: 提升设备恢复力的机制 什么是 Rescue Party? Rescue Party 是 Android 操作系统中的一种机制,旨在当设备遇到系统崩溃或启动失败时提供自动恢复的方案。这一机制特别针对系统关键组件的反复崩溃,防止设备陷入无法使用的状态。 主要功能…

【内窥镜】内窥镜行业中需要FPGA解决的问题

医用内窥镜的开发难点 技术集成&#xff1a;内窥镜集成了光学、人体工程学、精密机械、现代电子、计算机软件等多项技术&#xff0c;这些技术的集成对研发团队的技术广度和深度提出了高要求。 图像质量&#xff1a;内窥镜的图像质量直接影响诊断的准确性。提高图像分辨率、色彩…

学习笔记——网络参考模型——TCP/IP模型(网络层)

三、TCP/IP模型-网络层 1、IPV4报头 (1)IPV4报文格式 IP Packet(IP数据包)&#xff0c;其包头主要内容如下∶ Version版本∶4 bit&#xff0c;4∶表示为IPv4; 6∶表示为IPv6。 Header Length首部长度∶4 bit&#xff0c;代表IP报头的长度(首部长度)&#xff0c;如果不带Opt…

给自己Linux搞个『回收站』,防止文件误删除

linux没有像windows里一样的回收站&#xff0c;工作时候删除文件容易不小心删错&#xff0c;造成麻烦的后果。所以给自己整了个回收站&#xff1a; 文件删除&#xff0c;新建~/opts/move_to_trash.sh&#xff0c;然后在里面新增&#xff0c;将${your_name}改成你的用户名。同时…

Java 还能不能继续搞了?

金三银四招聘季已落幕&#xff0c;虽说行情不是很乐观&#xff0c;但真正的强者从不抱怨。 在此期间&#xff0c;我收到众多小伙伴的宝贵反馈&#xff0c;整理出132道面试题&#xff0c;从基础到高级&#xff0c;有八股文&#xff0c;也有对某个知识点的深度解析。包括以下几部…

【第二篇】SpringSecurity源码详解

一、SpringSecurity中的核心组件 在SpringSecurity中的jar分为4个,作用分别为 jar作用spring-security-coreSpringSecurity的核心jar包,认证和授权的核心代码都在这里面spring-security-config如果使用Spring Security XML名称空间进行配置或Spring Security的Java configura…

HackTheBox-Machines--Aragog

Aragog 测试过程 1 信息收集 NMAP 服务器开启了 21、22、80端口 21 端口测试 首先测试 21 端口&#xff0c;21端口开启了匿名登录 ftp服务器上存在 test.txt 文件&#xff0c;test.txt 文件是 xml 格式。 80 端口测试 echo "10.129.97.250 aragog.htb" | sudo tee…

鸿蒙全栈开发-基于ARKTS开发之初识框架-app.json5

前言 随着鸿蒙的不断发展,华为自行研制的“鸿蒙系统”横空出世&#xff0c;华为用实力为自己开辟了一个全新的时代&#xff0c;让中国品牌走向世界,并为程序员们带来了新的职业机遇。 这里来跟大家简单的聊一下鸿蒙基于ARKTS开发之初识框架-app.json5 当我们新建一个工程或者…

python的视频处理FFmpeg库使用

FFmpeg 是一个强大的多媒体处理工具,用于录制、转换和流式传输音频和视频。它支持几乎所有的音频和视频格式,并且可以在各种平台上运行。FFmpeg 在 Python 中的使用可以通过调用其命令行工具或使用专门的库如 ffmpeg-python。以下是详细介绍如何在 Python 中使用 FFmpeg,包括…

沃可趣产品增PC版,员工社区登上大屏幕

作为企业内部沟通与协作的枢纽&#xff0c;员工互动社区在促进信息流通、增强团队凝聚力方面扮演着关键角色。 沃可趣&#xff0c;这一匠心打造的员工互动社区&#xff0c;融汇了工作、学习与社交的精髓&#xff0c;为职场人构筑了一站式互动天地。 为了满足更广泛的工作场景…

交流回馈老化测试负载:行业竞争态势

在当今的科技行业中&#xff0c;交流回馈老化测试负载设备已经成为了一个重要的组成部分。这种设备主要用于模拟电力系统中的各种负载情况&#xff0c;以便对电力系统进行全面的测试和评估。随着科技的不断发展&#xff0c;这个行业的竞争态势也在不断变化。 从市场竞争的角度来…

Flutter 中的 ListWheelViewport 小部件:全面指南

Flutter 中的 ListWheelViewport 小部件&#xff1a;全面指南 Flutter 是一个功能强大的 UI 框架&#xff0c;由 Google 开发&#xff0c;允许开发者使用 Dart 语言构建高性能、美观的移动、Web 和桌面应用。在 Flutter 的丰富组件库中&#xff0c;ListWheelViewport 是一个用…

Foxmail邮箱的简单实用

Foxmail邮箱是我们办公邮箱中比较有代表性和使用性的一款邮箱软件&#xff0c;今天笔者为大家介绍一下Foxmail邮箱的功能和使用方法。 1、首先我们从安装Foxmail邮箱开始 2、点击安装等待安装成功 3、双击打开 &#xff0c;出现邮箱设置界面输入我们的账号密码&#xff0c;点击…

电商数据采集决策智慧:深度解析数据采集与应用||电商API数据采集接口的接入与应用

引言 在数字化时代&#xff0c;数据已成为电商企业最宝贵的资产之一。通过有效的数据采集&#xff0c;企业能够洞察市场动态、理解消费者需求、优化运营策略&#xff0c;从而在激烈的市场竞争中脱颖而出。本文将深入探讨电商数据采集的重要性、常用方法以及应用实践。 一、电…

Python接口自动化测试:Json 数据处理实战

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 上一篇说了关于json数据处理&#xff0c;是为了断言方便&#xff0c;这篇就带各位小伙伴实战一下…