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

news2024/11/20 4:45:42

前言

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.coloradmin.cn/o/1798868.html

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

相关文章

网易云音乐格式在线转换

应用分享:众所周知网易云下载的格式为 .NCM,只能在网易云音乐里播放。 今天提供在线转换为MP3格式 NCM TO MP3,无需安装,转换后就能在任意播放器使用。 使用地址: https://ncm.worthsee.com/ 网络研究观 数据泄露…

【NOIP普及组】税收与补贴问题

【NOIP普及组】税收与补贴问题 💖The Begin💖点点关注,收藏不迷路💖 每样商品的价格越低,其销量就会相应增大。现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),…

Win10 Edge提示兼容性问题打不开|解决浏览器兼容性问题

Edge有时候会与某些安全软件不兼容,导致报错 报错代码:STATUS_INVALID_IMAGE_HASH 解决Edge浏览器兼容性问题方法/步骤: 1、按 Win R 组合键,打开运行,并输入 regedit 命令,确定或回车,可以…

Linux Shell脚本编写指南

大家好,在当今快节奏的科技时代,自动化和高效的工作流程对于个人和组织来说变得愈发重要。而Shell脚本编写作为一种强大且广泛应用的技能,成为了实现自动化任务和系统管理的利器。通过编写Shell脚本,我们可以将繁琐的重复任务自动…

JavaScript的核心语法

JavaScript JavaScript:JavaScript的组成:核心语法:Hello:变量:JS的基本数据类型:特殊点: 数组:流程控制语句:函数:函数的重载:函数的递归:预定义…

算法:226. 翻转二叉树

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1]示例 2: 输入:root [2,1,3] 输出:[2,3,1]示例 3&#x…

算法学习笔记(7.4)-贪心算法(区间调度问题)

目录 ##什么是区间调度问题 ##贪心解法 ##具体的例题示例讲解 ##452. 用最少数量的箭引爆气球 - 力扣(LeetCode) ##435. 无重叠区间 - 力扣(LeetCode) ##56. 合并区间 - 力扣(LeetCode) ##什么是区间调…

学习周报:文献阅读+Fluent案例+Fluent相关算法学习

目录 摘要 Abstract 文献阅读:求解正逆运动波问题的物理信息神经网络 文献摘要 讨论|结论 理论基础 KWM(运动波动方程) Hard constraint (硬约束方式) 具有重新分布的搭配点的PINN 具有停止梯度的分数阶方程 …

解决Nginx出现An error occurred问题

每个人遇到Nginx的An error occurred情况可能都不一样(见图1),Nginx造成该错误的原因: 1. 我在配置域名解析成IP时,没有把所有解析配置都修改,见图2:解析 *.hanxiaozhang.xyz 配置的是新IP地…

4.通用编程概念

目录 一、变量与常量1.1 变量1.2 常量 二、遮蔽三、数据类型3.1 标量类型1. 整型2. 浮点型3. 布尔类型4.字符类型 3.2 复合类型1. 元组2. 数组 四、函数五、语句和表达式六、函数的返回值 一、变量与常量 1.1 变量 在Rust中默认的变量是不可变的,如果修改其值会导致…

汽车EDI——Volvo EDI 项目案例

项目背景 作为Volvo的长期合作伙伴,C公司收到Volvo的EDI对接邀请,需要实现EDI对接。C公司将会面临哪些挑战?又应该相应地选择何种EDI解决方案呢? 汽车行业强调供需双方的高效协同(比如研发设计、生产计划、物流信息等…

BIOS主板(非UEFI)安装fedora40的方法

BIOS主板(非UEFI)安装fedora40的方法 现实困难:将Fedora-Workstation-Live-x86_64-40-1.14.iso写入U盘制作成可启动U盘启动fedora40,按照向导将fedora40安装到真机的sda7分区中得到报错如下内容: Failed to find a suitable stage1 device: E…

最大矩形问题

柱状图中最大的矩形 题目 分析 矩形的面积等于宽乘以高,因此只要能确定每个矩形的宽和高,就能计算它的面积。如果直方图中一个矩形从下标为 i 的柱子开始,到下标为 j 的柱子结束,那么这两根柱子之间的矩形(含两端的柱…

论文敲公式敲到“崩溃”?合合信息扫描全能王“公式识别”一键解决公式提取难题

毕业季临近,全国高校毕业生陆续进入了忙碌的“答辩季”。进入“百米冲刺”阶段,论文至关重要。对于理科工学生而言,论文中的数理化公式,稍不注意就容易输错,手动输入误差难以避免。 近日,合合信息旗下扫描…

【C++课程学习】:C++入门(函数重载)

🎁个人主页:我们的五年 🔍系列专栏:C课程学习 🎉欢迎大家点赞👍评论📝收藏⭐文章 目录 🌈函数重载: 🍉1.参数个数不同: 🍉2.参数…

【计算机视觉(9)】

基于Python的OpenCV基础入门——形态学操作 形态学操作腐蚀膨胀开运算闭运算梯度运算顶帽黑帽 形态学操作代码实现以及效果图 形态学操作 形态学操作是数字图像处理中的一种方法,用于改变和提取图像中的结构和形状信息。它基于图像的形状和大小特征,通过…

【Framework系列】Excel转Json,配置表、导表工具介绍

今天来介绍一下Framework系列的配置部分,这一部分归属于Framework-Design之中。读过《Framework系列介绍》的小伙伴应该了解整个Framework框架是由多个工程项目组成,没看过的小伙伴可以点击链接了解一下。 Framework-Design设计的初衷是给策划同学用的&a…

为Android组件化项目搭建Maven私服

概览 文章目录 概览前言搭建 maven 私服服务器环境jdk安装配置nexus安装配置管理创建存储点、仓库 项目中使用 maven 私服上传 module 到仓库自动发布 module手动上传单个aar包 引用仓库中的 modulebuild.gradle引入远程module FAQ开发阶段有些module用远程依赖,有些…

苹果警告部分 iPhone 用户称他们遭到雇佣间谍软件攻击

苹果警告部分 iPhone 用户称他们遭到“雇佣间谍软件攻击 苹果正在提醒用户注意针对 iPhone 的新一轮已识别雇佣间谍软件攻击。可能的受害者已经收到来自苹果的电子邮件,其中描述了该攻击如何“远程破坏 iPhone”。据路透社报道,印度和其他 91 个国家的受…

内容产品运营方案业务架构解析与实践探索

### 背景 在信息爆炸的时代背景下,内容产品运营成为各行各业竞争的重要环节。构建合理的内容产品运营方案业务架构,能够帮助企业更好地管理内容生产、推广和变现,提升品牌影响力和商业价值。 ### 业务架构设计 #### 1. 内容生产与管理 建立…