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

news2024/10/2 10:39:31

  向量检索不仅在的跨模态检索场景中应用广泛,随着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.coloradmin.cn/o/1128783.html

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

相关文章

微信小程序商城制作教程

在这个数字化快速发展的时代,微信小程序商城已经成为越来越多商家的首选。搭建微信小程序商城不仅能够拓宽销售渠道,还能增加品牌曝光度和用户粘性。本文将指导你如何搭建微信小程序商城,从登录乔拓云网后台到发布上线全流程介绍。 1. 登录乔…

【0229】libpq库实现压测PG服务器max_connections的最大连接数

1. PG服务器接收的最大连接数 在PG服务的postgresql.conf配置文件中,参数:max_connections 注明了PG服务所能够接受的最大客户端的连接数量。此值默认是100,那么PG服务此参数最大能够调到多大呢? 本文将采用libpq库编写demo来进行压测,并将最终的结论和数据于文章中给出。…

Redis过期处理策略、惰性删除、定期删除、RDB和AOF、内存淘汰机制

文章目录 🍊 Redis过期策略🎉 惰性删除流程🎉 定期删除流程 🎉 内存淘汰机制🎉 RDB对过期key的处理🎉 AOF对过期key的处理 📕我是廖志伟,一名Java开发工程师、Java领域优质创作者、C…

领导:给你一个项目,如何开展性能测试工作。我:***

01 怎么开展性能测试 01 测试的一般步骤 性能测试的工作是基于系统功能已经完备或者已经趋于完备之上的,在功能还不够完备的情况下没有多大的意义(后期功能完善上会对系统的性能有影响,过早进入性能测试会出现测试结果不准确、浪费测试资源…

react项目实现文件预览,比如PDF、txt、word、Excel、ppt等常见文件(腾讯云cos)

使用腾讯云文档预览&#xff0c;需要开通文档预览功能&#xff0c;该功能需要收费的。 使用限制 如果需要图片预览、视频或音频可以使用获取下载链接。 页面代码 <button onClick() > {handleClick(myself/文档.xlsx)}>预览</button><div style{{ height:…

百度AI代码辅助工具Baidu Comate初体验

国内的程序员们也可以使用国产的代码辅助工具了。百度Comate智能代码助手正式上线SaaS版本&#xff0c;即日起可申请试用。官网&#xff08;https://comate.baidu.com/&#xff09;。 点开使用手册&#xff0c;先瞜一眼&#xff0c;后面再细看&#xff0c;手册里面有详细的说明…

yum管理openssh服务

文章目录 yum工具使用1.yum的配置文件2.yum仓库的管理本地仓库网络仓库 3.使用yum管理软件listcleanrepolistinstallupdatedowngraderemoveinfoprovideshistorydeplistgrouplistgroupinstall opensshsshd服务Secure Shell 示例ssh主机密钥配置免密登录SSH 安全注意事项 yum工具…

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

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

Matlab绘制散点的95%置信区间图

Matlab常绘制95%置信区间图&#xff0c;主要使用到patch函数。 如果直接使用散点进行拟合&#xff0c;在patch函数绘制95%置信区间时&#xff0c;会绘制的很乱&#xff0c;这个是由于patch函数所导致的&#xff0c;其实这个问题在 Matlab绘制95%置信区间图 中已经讲到过&#…

JS 严格模式和正常模式详解

JavaScript 严格模式&#xff08;Strict Mode&#xff09;和正常模式&#xff08;Non-Strict Mode&#xff09;是用于控制 JavaScript 代码执行的两种不同模式。严格模式引入了一些限制和变化&#xff0c;旨在帮助开发人员编写更可靠、安全和高效的代码。在本文中&#xff0c;我…

js实现将文本生成二维码(腾讯云cos)

示例 页面代码 import { getQCodeUrl } from /utils/cosInstance; import { PageContainer } from ant-design/pro-components; import { Access, useAccess } from umijs/max; import { Button, Image } from antd; import { useState } from react;const AccessPage: Reac…

SpringCloud复习:(2)@LoadBalanced注解的工作原理

LoadBalanced注解标记了一个RestTemplate或WebClient bean使用LoadBalancerClient来进行负载均衡。 LoadBalancerAutoConfiguration类给带注解的RestTemplate添加了拦截器&#xff1a;LoadBalancerInterceptor. 具体流程如下&#xff1a; 首先定义一个LoadBalancerInterceptor…

超强满血不收费的AI绘图教程来了(在线Stable Diffusion一键即用)

超强满血不收费的AI绘图教程来了&#xff08;在线Stable Diffusion一键即用&#xff09; 一、简介1.1 AI绘图1.2 Stable Diffusion1.2.1 原理简述1.2.2 应用流程 二、AI绘图工具2.1 吐司TusiArt2.2 哩布哩布LibLibAI2.3 原生部署 三、一键即用3.1 开箱尝鲜3.2 模型关联3.3 Cont…

小白必看,手把手教你重装系统

一&#xff0c;安装步骤 二&#xff0c;重装之前需要做的准备 1、重装之前请大家务必注意备份重要资料。电脑有价&#xff0c;数据无价——重要数据备份之后&#xff0c;电脑随便折腾都没问题。大不了就是重装不成功。系统软件问题多试几次总能解决的&#xff0c;但重要数据一…

《红蓝攻防对抗实战》七.常规反弹之利用NC在Linux系统执行反弹shell

目录 一.利用NC工具在linux执行反弹shell 1.Linux正向连接shell 2.利用Linux自带bash反弹Shell 前文推荐&#xff1a; 《红蓝攻防对抗实战》一. 隧道穿透技术详解《红蓝攻防对抗实战》二.内网探测协议出网之TCP/UDP协议探测出网《红蓝攻防对抗实战》三.内网探测协议出网之H…

最新壁纸自动采集系统网站PHP源码/360壁纸官方数据接口采集/ZHEYI采集源码

源码介绍&#xff1a; 最新壁纸自动采集系统网站PHP源码&#xff0c;它是ZHEYI自动采集源码&#xff0c;能够在360壁纸官方数据接口采集。很好用的壁纸网站源码分享&#xff0c;仅供学习&#xff0c;请勿商用。 ZHEYI自动采集壁纸PHP源码&#xff0c;能全自动采集高清壁纸网源…

设计模式—设计模式总览

设计模式—设计模式总览 在 1994 年&#xff0c;由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 四人合著出版了一本名为 《Design Patterns - Elements of Reusable Object-Oriented Software》&#xff08;中文译名&#xff1a;《设计模式 - 可复用的面向对…

Wish如何入驻?最全防封攻略

近日来&#xff0c;跨境电商平台Wish有了新改革&#xff0c;为提高产品质量把控效率&#xff0c;Wish最近将入驻机制又完全开放转变为“邀请制”&#xff0c;加强了品控措施&#xff0c;也意味着商家入驻门槛变高&#xff0c;流程与之前截然不同。但对于已有跨境电商经验/没有跨…

Mybatis 简介(一)

这里使用的是3.5.11版本 MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO&#xff08;P…

非连续分配管理方式-基本分页存储管理

非连续分配-可为用户进程分配分散的内存空间 一、存储过程 1.将内存空间分成大小相等的分区&#xff0c;每个分区为一个页框/页帧(内存块/物理块/物理页面)&#xff0c;每个页框有一个编号(页框号/内存块号/物理块号)&#xff0c;从0开始 2.将进程的逻辑地址空间也分为与页框…