ES 8.x 向量检索性能测试 把向量检索性能提升100倍!

  向量检索不仅在的跨模态检索场景中应用广泛,随着chat gpt的或者,利用es的向量检索,在Ai领域发挥着越来越大的作用。

  本文,主要测试es的向量检索性能。我从8.x就开始关注ES的向量检索了。当前ES已经发布到 8.10 版本。以下是官方文档的链接:

   https://www.elastic.co/guide/en/elasticsearch/reference/current/release-highlights.html

  本文,在测试的时候使用的是8.3版本(因为测试的时候只发布到这里 )。

  在本文中,妥妥滴都是干货,因为不仅有性能测试,还有搜索性能优化。这里预告以下,在千万规模数据中做的测试,将检索性能提升了将近100倍。在本文中可以看看性能是如何被优化的。

一、背景

测试ES - KNN向量检索性能、写入性能、准确度、资源占用情况。针对该需求,搭建一个8.3.0版本的ES节点,使用ES8.3.0版本的java Client高级API来调用KNN搜索。

测试资源介绍

机器情况

ES情况

插件

数据规模

数据情况

单台机器

48核心

64G内存
磁盘为HDD盘(也测了SSD盘)

单个节点

单个索引

单个分片

不带副本

优化后的段的个数为1

ES版本 8.3.0
JVM31G

elastiknn

 

  1. 34W(340507)
  2. 1000W

数据结构(索引结构和配置)

结构:三个字段,一个向量字段存放512维度的向量数据。一个路径字段,存放图片路径,一个文档id

二、测试结果

写入性能

批量写数据,使用es bulk提交数据,数据刷新间隔时间30s(近实时)。

数据量

总耗时

平均每张耗时

340507

170s

0.5ms

写入数34万,耗时170s。

最佳查询性能

 最终的性能如下表,千万级别的检索可以在毫秒级别。经历了两轮优化。

数据规模

检索 top-N

平均耗时

最长耗时

34w

(512维度)

检索 top-1

[3] ms

[110] ms

检索 top-10

[6] ms

[150] ms

检索 top-100

[26] ms

[810] ms

1000W

(512维度)

检索 top-1

[14] ms

[390] ms

检索 top-10

[22] ms

[220] ms

检索 top-100

[42] ms

[73] ms

~ps 最长耗时是非常重要的指标,要重点关注。这很可能是用户在第一次点击搜索的时候出现的情况。短板效应。

检索优化过程

  说明:使用ES原生KNN检索,尝试做了三轮优化。第一轮是对写入的数据,进行一次合并优化;第二轮使用使用开源的插件elastiknn进行优化。第三轮是将数据放在SSD磁盘的机器上。每轮提升两倍。整体性能提升近10倍。(测试结果会受到了Linux os cache的影响,磁盘上的数据从磁盘读取到os cache中 )如果追求检索性能,应该增加内存,来达到将更多的数据放在缓存中去做检索的目的。

  ps~ 以下相同颜色做对比。第一轮对比,是forceMerge的优化。第二轮是插件优化。第三轮在千万数据集下做测试,接近生产需求,并且包含了三项优化一起做的场景。把三种优化,放在一起,带来更多的提升!

  其中forceMerge优化,只能对不再发生变化的数据做优化。比如昨天入库的数据不再新增和修改,则优化可以生效。但是不适用于实时入库的数据!

数据规模

优化项

检索 top-N

调用次数

总耗时

平均耗时

最长耗时

30W

不优化

检索 top-2

22727

[1148351] ms

[50] ms

-

force

Merge

检索 top-2

22727

[698089] ms

[30] ms

-

不优化

检索 top-10

22727

[1962618] ms

[86] ms

[5183] ms

插件优化

检索 top-10

22727

[795893] ms

[35] ms

[360]

force

Merge

检索 top-10

22727

[1385920] ms

[60] ms

[2016] ms

1000W

不优化(HDD)

检索 top-10

-

-

10 - 20 s

20s

SSD 优化

检索 top-10

22727

[2781526] ms

[122] ms

5s

SSD + 插件 优化

检索 top-10

22727

[1046376] ms

[46] ms

5s

SSD + 插件 + merge优化

检索 top-10

22727

[] ms

[22] ms

[220] ms

使用elastiknn插件优化检索(只看插件优化)

数据合并

检索 top-N

调用次数

总耗时

平均耗时

最长耗时

优化前

检索 top-10

22727

[1161129] ms

[51] ms

[387]

优化后

检索 top-10

22727

[795893] ms

[35] ms

[360]

优化后

检索 top-100

22727

[5776099] ms

[254] ms

[8759]

华为云es + 自研插件 性能(性能比原生好10倍左右

测试数据集

DataSet1SIFT开源数据集,维度128Base数据集100万条

DataSet2SIFT10M开源数据集,维度128Base数据集1100万条

DataSet3GIST开源数据集,维度960Base数据集100万条

检索性能

数据

索引类型

查询Top1

查询Top10

查询Top100

Rec

RT

QPS

Rec

RT

QPS

Rec

RT

QPS

SIFT

GRAPH

0.992

2.63

6200

0.998

2.66

6000

0.992

3.79

4200

SIFT10M

GRAPH

0.998

3.20

5000

0.998

3.31

4800

0.985

4.82

3400

GIST

GRAPH

0.971

10.0

1500

0.963

12.0

1350

0.911

20.1

600

GIST

GRAPH_PQ

0.954

4.06

4000

0.934

6.54

2450

-

-

-

说明

Rec表示Topk召回率,RT表示平均查询时延(毫秒),QPS表示查询吞吐量;

由于GIST的维度较高,通过使用GRAPH_PQ加速能够极大地提升查询性能,以损失精准度为代价,来提升速度

三、索引结构

以下索引,30万数据规模用一个分片即可。1000万数据规模,给3个分片。

"knn_image_index": {"aliases": {},"mappings": {"properties": {"my_image_vector": {"type": "dense_vector","dims": 512,"index": true,"similarity": "l2_norm"},"pic": {"type": "keyword"},"pic_path": {"type": "keyword"}}},"settings": {"index": {"routing": {"allocation": {"include": {"_tier_preference": "data_content"}}},"refresh_interval": "30s","number_of_shards": "1","provided_name": "knn_image_index","creation_date": "1681825402139","number_of_replicas": "0","uuid": "KjqLhlv2SMGxlwWIjgJCMw","version": {"created": "8030099"}}}}
}

四、资源使用情况

磁盘占用量

30W数据,占用1.7G磁盘空间。

内存占用量

内存使用量极少。

五、测试结论

  ES支持ANN检索、支持删除、支持修改、数据写入性能平均每条耗时5ms。数据存储不占用内存空间,都在磁盘上。1000W图片占用磁盘空间50GB。

  检索性能以下为最佳状态。存储使用SSD盘、使用elastiknn插件做优化、对数据做合并,merge成一个segment。能够达到最好的性能如下表。

数据规模

检索 top-N

平均耗时

最长耗时

34w

(512维度)

检索 top-1

[3] ms

[110] ms

检索 top-10

[6] ms

[150] ms

检索 top-100

[26] ms

[810] ms

1000W

(512维度)

检索 top-1

[14] ms

[390] ms

检索 top-10

[22] ms

[220] ms

检索 top-100

[42] ms

[73] ms

是否能够满足使用需求

、插件调研、开源测试工具调研、向量算法

KNN - plugin

插件

优点

缺点

git地址

活跃度

elastiknn

1、性能提升一倍

2、社区持续活跃,一直跟着最新版本的ES版本去发布的插件

3、不用改官方的检索语法

暂未发现待调研

GitHub - alexklibisz/elastiknn: Elasticsearch plugin for nearest neighbor search. Store vectors and run similarity search using exact and approximate algorithms.

最后一次更新一天前。持续活跃

k-NN

相对elastiknn,该插件支持把底层生成hnsw一个结构加载进内存

基于内存构建

GitHub - opendistro-for-elasticsearch/k-NN: ��� A machine learning plugin which supports an approximate k-NN search algorithm for Open Distro.

最后一次更新时间在2021年

GSI's Elasticsearch K-NN Plugin

据说是使用GPU加速的插件

未开源,找不到

GSI's Elasticsearch k-NN Plugin | GSI Technology

-

开源向量性能测试工具

项目

优点

缺点

git地址

活跃度

对N个向量检索数据库做性能测试

GitHub - erikbern/ann-benchmarks: Benchmarks of approximate nearest neighbor libraries in Python

最近两天

对十亿规模的向量数据做测试

GitHub - harsha-simhadri/big-ann-benchmarks: Framework for evaluating ANNS algorithms on billion scale datasets.

最近两天

GSI's Elasticsearch K-NN Plugin

GitHub - jobergum/dense-vector-ranking-performance: Performance evaluation of nearest neighbor search using Vespa, Elasticsearch and Open Distro for Elasticsearch K-NN

两年前(21年)

向量检索相关算法

图像检索:向量索引 

蚂蚁金服 ZSearch 在向量检索上的探索 · SOFAStack

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

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

相关文章

mybatis书写

mybatis <select id"selectUserList" resultType"map"> select * from user </select><!--根据主键查询一条--> <select id"selectById" resultType"map" parameterType"java.lang.Integer"> sele…

Tomcat及jdk安装下载及环境配置(超超超详解)

我是看了两篇博客安装配置好的 jdk 最详细jdk安装以及配置环境&#xff08;保姆级教程&#xff09;_安装jdk需要配置环境变量吗-CSDN博客 tomcat Tomcat的下载安装与配置及常见问题处理【Win11】 - 鞠雨童 - 博客园 (cnblogs.com) 本篇文章是我解决了很多朋友的tomcat配置问题总…

Spring MVC常用十大注解

Spring MVC常用十大注解 一&#xff0c;什么要使用注解 使用注解可以简化配置&#xff0c;提高代码的可读性和可维护性。通过注解可以实现依赖注入&#xff0c;减少手动管理对象的代码量。注解还支持面向切面编程&#xff0c;实现切面、切入点和通知等。此外&#xff0c;注解提…

数据可视化素材分享 | 数十图表、无数模板

很多人在后台求分享报表、源代码&#xff0c;其实何必这么麻烦&#xff0c;在奥威BI数据可视化平台上点击即可获得大量的可视化素材&#xff0c;如数十种可视化图表&#xff0c;适用于不同分析场景&#xff1b;又如大量不同主题的BI数据可视化报表模板&#xff0c;套用后替换数…

GoLong的学习之路(四)语法之循环语句

书接上回&#xff0c;上回说到运算符&#xff0c;这次我们说一个编程语言中最重要的一点&#xff1a;流程控制&#xff0c;及循环语句 文章目录 循环语句if else(分支结构)if条件判断特殊写法 for(循环结构)for range(键值循环) switch casegoto(跳转到指定标签)break(跳出循环…

按键中断控制LED灯亮灭

EXTI—外部中断/事件控制器 EXTI&#xff08;External interrupt/event controller&#xff09;—外部中断/事件控制器&#xff0c;管理了控制器的 20 个中断/事 件线。每个中断/事件线都对应有一个边沿检测器&#xff0c;可以实现输入信号的上升沿检测和下降沿的 检测。EXTI可…

【广州华锐互动】关于物理力学的3D实验实操平台

在科学的广阔领域中&#xff0c;物理力学是一个至关重要的分支&#xff0c;它探索了物体在力作用下的运动规律。然而&#xff0c;传统的物理实验往往需要复杂的设备和大量的操作&#xff0c;这对于学生来说是一项巨大的挑战。为了解决这个问题&#xff0c;广州华锐互动开发了物…

Hadoop3教程(三十五):(生产调优篇)HDFS小文件优化与MR集群简单压测

文章目录 &#xff08;168&#xff09;HDFS小文件优化方法&#xff08;169&#xff09;MapReduce集群压测参考文献 &#xff08;168&#xff09;HDFS小文件优化方法 小文件的弊端&#xff0c;之前也讲过&#xff0c;一是大量占用NameNode的空间&#xff0c;二是会使得寻址速度…

浅谈RabbitMQ的延迟队列

Part 01、 延迟队列是什么 延迟队列代表了一种强大的消息传递机制&#xff0c;允许我们在将消息发送至RabbitMQ时&#xff0c;规定它们只能在未来某个预定的时间点被消费。这种特殊类型的消息被简称为"延迟消息"。 以RabbitMQ为例&#xff0c;它允许我们通过延迟…

聊聊分布式架构10——Zookeeper入门详解

目录 01ZooKeeper的ZAB协议 ZAB协议概念 ZAB协议基本模式 消息广播 崩溃恢复 选举出新的Leader服务器 数据同步 02Zookeeper的核心 ZooKeeper 的核心特点 ZooKeeper 的核心组件 选举算法概述 服务器启动时的Leader选举 服务器运行期间的Leader选举 03ZooKeeper的…

人工智能算法PPT学习

YOLO You only look once 是一种图像识别算法&#xff0c;速度较快。高效、灵活、泛化性能好&#xff0c;在工业中较为受欢迎。 图像金字塔 一幅图像的多个不同分辨率的子图构成的图像集合。是通过一个图像不断的降低采样率产生的&#xff0c;最小的图像可能仅仅有一个像素点…

C# out参数out多个参数

文章目录 C# out参数out多个参数背景说明作用方法定义调用方法测试结果注意 C# out参数out多个参数 背景说明 一个方法返回多个相同数据类型的变量&#xff0c;可以采用数据的方式&#xff1b; 我需要返回多个不同数据类型的方法&#xff0c;在这里采用out多个参数的方式。 …

vue3项目使用TypeIt打字机

官网: TypeIt | The most versatile JavaScript typewriter effect library on the planet. 下载: npm i typeit 使用方法: 正常打字 多行打字机 input输入框实现打字机效果 打字机颜色变化 删除,光标移动,最全面的打字机效果 官网最下面还可以输入你想有的打字效果,然后生…

【文件操作】Java -操作File对象

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 文件操作 Java - File对象 Java - File对象 Fi…

计算机视觉-数学基础*变换域表示

被研究最多的图像&#xff08;或任何序列数据&#xff09;变换域表示是通过傅 里叶分析 。所谓的傅里叶表示就是使用 正弦函数的线性组合来表示信号。对于一个给定的图像I(n1,n2) &#xff0c;可以用如下方式分解它&#xff08;即逆傅里叶变换&#xff09;&#xff1a; 其中&a…

【lesson14】进程控制之进程等待

文章目录 为什么要有进程等待&#xff1f;如何等待和什么是等待&#xff1f; 为什么要有进程等待&#xff1f; 1.子进程退出&#xff0c;父进程不管子进程&#xff0c;子进程就要处于僵尸状态------会导致内存泄漏 2.父进程创建子进程是要让子进程办事的&#xff0c;那么子进…

【Tensorflow 2.12 简单智能商城商品推荐系统搭建】

Tensorflow 2.12 简单智能商城商品推荐系统搭建 前言架构数据召回排序部署调用结尾 前言 基于 Tensorflow 2.12 搭建一个简单的智能商城商品推荐系统demo~ 主要包含6个部分&#xff0c;首先是简单介绍系统架构&#xff0c;接着是训练数据收集、处理&#xff0c;然后是召回模型、…

“深入探讨Java JUC中的ReentrantLock锁:实现多线程同步与并发控制“

简介 1、从Java5开始&#xff0c;Java提供了一种功能更强大的线程同步机制——通过显式定义同步锁对象来实现同步&#xff0c;在这种机制下&#xff0c;同步锁由Lock对象充当。 2、Lock 提供了比synchronized方法和synchronized代码块更广泛的锁定操作&#xff0c;Lock允许实…

arcgis js api FeatureLayer加载时返回数据带*问题

接着这一问题衍生出来的问题 arcgis的MapServer服务查询出来的结果geometry坐标点带*的问题-CSDN博客 个人感觉像是server版本的问题&#xff0c;具体不清楚&#xff0c;pg数据库里面的shape点集合坐标点的精度是8&#xff0c;但是server服务查出来的默认都十几位。所以存在一…

使用CPR库和Python编写程序

以下是一个使用CPR库和Python编写的爬虫程序&#xff0c;用于爬取。此程序使用了proxy的代码。 import requests from cpr import CPR ​ def get_proxy():url "https://www.duoip.cn/get_proxy"headers {"User-Agent": "Mozilla/5.0 (Windows NT …