深度解读 BigANN 2023 四大赛题,向量搜索还有更好的解决方案?

近年来,向量搜索大赛 BigANN 一直是行业关注的焦点。原因在于,BigANN 不仅是在向量搜索领域具有强大影响力的比赛,开发者在赛后贡献出的相关解决方案更是行业进步与发展的重要动力。

向量检索大赛 BigANN 旨在提升大规模 ANN 的研究创新和生产环境中的落地应用。BigANN 分设四条赛道,问题来自实际应用场景。作为 BigANN 曾经的赛道冠军得主、最新一届参与赛题设计的组织方,Zilliz 始终走在向量搜索场景探索的前列。

尤其是最新一届大赛,Zilliz 虽然未参赛,但团队工程师们在赛后对 BigANN 的 4 大赛题都提出了自己的解法。在所有赛道上,Zilliz 给出的解决方案均超过拿到最好结果的参赛队伍,获得了最多 2.5 倍的性能提升,同时也超越了所有其他厂商的方案。本文将带大家一起回顾 BigANN 大赛及详解 Zilliz 提出的算法问题解决方案。

01.为什么要在赛后给出解决方案?

ANN benchmark是业界最为权威和知名的向量搜索算法 benchmark。不过,开始由于数据集太小且场景过少,其对解决实际生产问题的指导意义较弱。BigANN 在 2021 年带来了更大的数据集和更复杂的场景,对于整个向量检索行业而言都意义非凡。2023 年,BigANN 更是带来了 4 个更加贴合当下向量搜索研究和发展趋势的场景。

2023 年,Zilliz 则作为大赛的组织方,参与了此次赛题的设计。比赛结束后,Zilliz 的算法工程师团队对于题目中设置的向量搜索难题产生了浓厚的兴趣,在此前获奖工程师方案的基础上不断优化和提升,最终形成了一套 SOTA(state of the art) 方案。

不止如此,Zilliz 认为 BigANN 此次的赛道设置非常具有生产指导价值,无论是支持 Filters、Sparse 这样多元化的搜索方式,解决 OOD 这个场景提出的“如何提高搜索质量”的问题,还是优化 Streaming 的生产常见场景,都是团队现阶段积极探索的方向。因此,尝试解决这些算法问题同样可以反哺于 Zilliz 的产品,帮助其在向量搜索领域走得更远。

02.传说中的 BigANN 2023 赛题

BigANN 2023 赛题是什么样的?不妨一起感受一下:

  1. Filters 赛道: 本赛道使用了 YFCC 100M 数据集,要求参赛者处理从该数据集中选取的 1000 万张图片。具体任务要求为提取每张图片的特征并使用 CLIP 生成 Embedding 向量,且需包含图像描述、相机型号、拍摄年份和国家等元素的标签(元素均来自于词汇表)。本赛道的主要挑战是参赛者需要成功地将 10 万个查询与数据集中的相应图像和标签匹配,每个查询都包含一个图像向量和特定的标签。

  2. Out-Of-Distribution(OOD) 赛道: 本赛道使用了 Yandex Text-to-Image 10M 数据集,强调跨模态数据的整合。基础数据集包括来自 Yandex 视觉搜索数据库的 1000 万张图像 Embedding 向量,这些向量由 Se-ResNext-101 模型生成的,但查询向量是基于文本搜索和不同的模型生成的。参赛者需要有效地弥合这些不同模态数据之间的差异。

  3. Sparse 赛道: 本赛道以 MSMARCO passage retrieval 数据集为核心,处理大量的文章(超过 880 万个),所有文章都通过 SPLADE 模型编码成稀疏向量。这些虽然维度高,但本质上是稀疏向量。查询数量近 7000个,且查询也通过相同的模型处理,但长度较短、非零元素较少。本赛道的主要挑战是选手需准确检索给定查询的 Top 结果,重点是查询向量和数据库向量之间的最大内积。

  4. Streaming 赛道: 本赛道基于 MS Turing 数据集中的一部分,包含 1000 万个数据。参与者的任务是遵循提供的“操作手册”(该手册详细说明了一系列数据插入、删除和搜索操作),并在 1 小时内完成操作。此外,选手们还有 8GB DRAM 的限制。赛道的重点是优化处理这些操作的过程,并保持数据集的索引流畅。

在 BigANN 大赛中,每条赛道都针对算法排名设置了具体的评分标准:

对于 Filters、 OOD 以及 Sparse 赛道,大赛根据 QPS 对算法进行排名,且算法需要至少 90% recall@10 • 对于 Streaming 赛道,大赛根据 recall@10 对算法进行排名,且算法 runbook 需要在 1 小时以内完成。

所有比赛都基于 Azure D8lds_v5 (8 vCPUs and 16 GiB 内存) 的资源来评估,Zilliz 提出的方案也是如此。目前,Zilliz 还未将所有解决方案开源,但是已将可执行的 binary 放在 BigANN's repo 中,方便大家获取和复现性能测试结果。

03.Zilliz 的解决方案及成果

  • Filters 赛道 alt

在private数据集上当 90% recall的情况下我们的解决方案达到了 ~82k qps,是baseline faiss (~3.2k) 的 25 倍,是赛道胜者 parlayivf (~32k) 的 2.5 倍,高于 pinecone 的解决方案 (~68k)

Zilliz 解决方案是基于图算法和 tag 分类。

Build 时,会对每种可能出现的 tag 组合进行 cardinality 分析;对于较包含向量较多的组合建图,其他的组合建立倒排索引;搜索时则根据不同的组合选取对应的搜索方式。

同时,团队对 query 按所属的 tag 进行分类,搜索时分别对每个 tag 所对应的 query 依次进行搜索。这样做的好处有两个,一是可以最大化 cache 利用率,二是在爆搜时可以使用矩阵乘法计算进行加速。当然,为了加速计算,我们使用了对数据进行量化,并利用 SIMD 优化相关的距离计算。

  • OOD 赛道 alt

由于 ood track 没有 private 数据集,因此我们在 public 数据集下进行比较。在90%recall下我们的解决方案达到了 ~33k qps,是 baseline diskann (~4k qps) 的 8 倍,超过了赛道胜者 pyanns (~23k qps) 和 pinecone 的解决方案 (~26k qps)。

Zilliz 的解决方案基于图算法以及高度优化的搜索过程。

在计算方面,用不同精度的量化进行搜索和 refine,并使用 SIMD 进行计算加速。

搜索开始前,先对 query 向量进行聚类。在图搜时,对分属不同的聚类的 query 分配不同的初始点,并且对每个聚类进行依次搜索。通过聚类可以体现两大优势,一是对不同聚类依次搜索优化了 cache 利用率,二是由于对不同聚类分配自适应的初始点一定程度上缓解了向量不同分布的问题。

值得关注的是,Zilliz 使用了多级的 bitset 数据结构。在图搜的过程中,一般需要一个数据结构来标记哪些点被访问过,传统的方法是使用一个 bitset 或者哈希表,bitset 的缺点是其中大部分的内存并不会被使用到,使得每次读取时会有大概率的 cache miss;哈希表的缺点是糟糕的常数导致性能低下。受内存中多级页表的启发,Zilliz 设计出了多级 bitset 的数据结构,将上层 bitset 缓存在 cpu cache 中,使得读写性能得到大幅提升。

  • Sparse 赛道 alt

在 private 数据集上当90% recall 的情况下我们的解决方案达到了~8200 qps,是baseline linscan (~100 qps) 的 82 倍,超过了赛道胜者 pyanns (~6000 qps) 和 pinecone 的解决方案 (~7400 qps)。

Zilliz 的解决方案是基于图算法和一些基于稀疏向量的优化。

每个稀疏向量通过 (data[float32], index[int32]) 元组的列表进行表示,团队对 data 进行多精度量化,分别用户图搜时的计算和最后的 refine。同时 index 也可以用 int16 表示,以降低内存带宽使用。

本赛道的题目为最大内积搜索。内积计算有一个重要特性即绝对值较大的值有更大的重要性,而绝对值较小的值有较小的重要性。可以根据这一特性设计剪枝策略,即在图搜过程中将绝对值较小的值裁剪掉,并在图搜结束后使用完整向量进行 refine。根据实验结果,可以在不大幅降低 recall 的前提下将 query 向量中超过 80% 的数据裁剪掉。

此外,团队还用 SIMD 进行快速的有序列表求交集,进而实现高效的稀疏向量内积计算。

  • Streaming 赛道 alt

在 final_runbook 上我们的解决方案获得了 0.9982 的 recall,超过了赛道胜者 puck (0.986 recall) 以及 pinecone 的解决方案 (0.9975 recall)。

Zilliz 的解决方案是基于图算法以及 SQ 量化。

对于删除操作,Zilliz 采用了惰性删除策略,即对被删除的向量我们只是将它标记为已删除,并不改变图的结构。等到删除操作累积到一定数量时才进行真正的图结构改变。

搜索中,对向量进行不同精度的量化分别用以图搜和 refine。粗略分为三个步骤:第一步是使用低精度量化后的向量进行图搜。由于使用惰性删除策略,搜索得到的一些向量已经被删除了,因此在第二步使用后置过滤的策略将被删除的向量过滤掉。最后一步,用更高精度的量化向量进行 refine 得到最终结果。

04.Make Something Different!

随着 AI 的快速发展,向量搜索也不再仅仅局限于传统意义上简单的 KNN 搜索,对于复杂的生产场景的支持变得越来越关键。因此,BigANN 2023 对于多场景的涵盖让它能更加具有现实意义。

Zilliz 一直致力于创造世界上最好用的向量数据库,利用向量搜索的力量解决实际问题。为此,Zilliz 也从未停止过对不同场景的探索,包括 BigANN 提出的场景及其他前沿场景。在这条道路上,我们需要有更多志同道合的朋友来 join efforts。无论你是对向量搜索、数据库还是对高性能优化感兴趣,无论是在哪个国家和地区,欢迎大家一起来 make something different!

本文由 mdnice 多平台发布

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

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

相关文章

Django模型(八)

一、修改数据 先获取对象,通过对象属性更新数据,再保存 (更新单一数据)通过QuerySet的update函数更新数据 (更新多条数据) #单条记录修改 save c = Cook.objects.get(pk=1) c.name = 安妮 c.save()# 更新多个值 update Cook.objects.filter(sect=粤菜).update(level=5)1.1、…

Methodot低代码实战教程(一)——熟悉可视化Echart组件

一、产品介绍: Methodot是行云创新旗下一款面向研发使用的一站式云原生开发及应用托管平台,产品内有大量开箱即用的服务和开发工具,例如: 支持开发团队进行微服务架构设计(例如一个袜子商店管理系统)&…

win11安装MySql5.7

1、下载 打开下载链接:MySQL :: Download MySQL Installer 2、安装 2.1、安装界面 2.2、选择自定义安装 2.3、根据自己系统的位数进行选择是X64还是X86 2.4、选择安装路径 2.5、继续下一步 2.6、选择服务器专用,端口是3306 2.7、设置密码 2.8、设置服…

Python系列-字典

🌈个人主页: 会编程的果子君 ​💫个人格言:“成为自己未来的主人~” ​ 目录 ​ 字典是什么 创建字典 查找key 新增/修改元素 删除元素 遍历字典元素 取出所有的key和value 合成的key类型 ​编辑 小结 字典是什么 字典是一种存储键值对的结…

开箱即用的Linux系统

经常会遇到这样的场景,临时需要演示一下linux环境,安装虚拟机耗时耗资源,如果有一个开箱即用的linux,而且还能包括主流的linux环境就好了。instantbox 是一个这样的项目,几秒内启动一个主流的 Linux 系统,支…

船员投保的数学模型(MATLAB求解)

1.问题描述 劳动工伤事故,即我们平时所说的“工伤事故”,也称职业伤害,是指劳动者在生产岗位上,从事与生产劳动有关的工作中发生的人身伤害事故、急性中毒事故或职业病。船员劳动工伤事故是指船员在船舶生产岗位上,从…

第七讲_JavaScript的Iterator和Generator

JavaScript的Iterator和Generator 1. Iterator1.2 for-of语法糖 2. Generator2.1 定义一个生成器函数2.2 常用的方法2.3 基本用法2.4 传参的用法2.5 异步的用法 1. Iterator ES6 中,默认的 Iterator 接口部署在数据结构的 Symbol.iterator 属性。一个数据结构只要拥…

字节跳动新一代云原生消息队列实践

作者:火山引擎云原生计算研发工程师|雷丽媛 上文我们了解了在字节跳动内部业务快速增长的推动下,经典消息队列 Kafka 的劣势开始逐渐暴露,在弹性、规模、成本及运维方面都无法满足业务需求。因此字节消息队列团队研发了计算存储分…

RISC-V指令集之RV32I

RISC-V指令集之RV32I 1 RV32I的寄存器2 RV32I的指令2.1 算术运算指令2.2 逻辑运算指令2.3 移位运算指令2.4 内存读写指令2.5 分支与跳转指令 本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 RV32I的寄存器 如下图,列出了RV32I 寄存器…

力扣hot100 数据流的中位数 大小根堆

Problem: 295. 数据流的中位数 文章目录 思路复杂度💖 Code 思路 👨‍🏫 参考 大根堆维护较小值(堆顶即中位数),小根堆维护较大值(堆顶可能是中位数之一)维护小堆长度较长&#x…

idea搭建spring5.3.x源码环境

1.写在前面的话 碰到了不少想阅读或者学习spring源码的同学,但是第一步搭建这个源码阅读环境就能难倒了一大批人。下面我就以spring5.3.x这个源码分支,来具体演示一下搭建过程。 2. 下载源码 下载源码这一步,说实话,由于某些原…

grafana安装DevOpsProdigy KubeGraf 1.5.2

安装DevOpsProdigy KubeGraf需要安装kube-state-metrics 官方地址:https://github.com/kubernetes/kube-state-metrics/tree/release-2.10/examples/standard 查看k8s版本和kube-state-metrics对应版本: [rootmaster1 kube-state-metrics]# ll 总用量 …

并查集(高阶数据结构)

目录 一、并查集的原理 二、并查集的实现 2.1 并查集的初始化 2.2 查找元素所在的集合 2.3 判断两个元素是否在同一个集合 2.4 合并两个元素所在的集合 2.5 获取并查集中集合的个数 2.6 并查集的路径压缩 2.7 元素的编号问题 三、并查集题目 3.1 省份的数量 3.2 等…

R-kknn包-类别插值可视化绘制

前面的推文我们介绍了使用scikit-learn结合分类散点数据,构建机器学习分类模型并将模型结果可视化展示,具体链接如下: 机器学习和可视化还能一起这样用?Python教你全搞定。今天这篇推文,我们就使用R语言的kknn包进行类…

【2023地理设计组一等奖】基于机器学习的地下水仿真与时空分析

作品介绍 1 设计思想 1.1 作品背景 华北平原是我国最重要的粮棉产地之一,然而近年来农业的低效用水以及过度压采正逐步加剧其地下水资源的紧张性,为经济可持续发展带来重大风险。而地下水动态变化与人为干预、全球气候波动呈现出高度相关性,因此,地下水的仿真模拟对保障粮…

JMeter 下载、安装、启动

JMeter安装部署依赖Java环境,所以首先得安装JDK。 JDK下载JDK环境变量配置 ① 新建系统环境变量JAVA_HOME ② 编辑系统变量Path ③ 新建系统变量CLASSPATH变量 JMeter下载安装 Apache JMeter - Apache JMeter™ JMeter安装部署依赖Java环境,所以首…

sql注入之GETSHELL

2024.2.1 GETSHELL 利用SQL注入获取MYSQL数据库权限的要求: 文件读写基本要求: 是root用户最高权限 知道网站的绝对路径 文件读写注入的原理: 利用文件的读写权限进行注入,它可以写入一句话木马,也可以读取系统文件的敏感信息 文件读写…

Qt设计师中(没有现成的控件):如何添加QToolBar工具栏

1、在QtCreator设计师界面中,在MainWindow上右键,有“添加工具栏”菜单项 2、但只有在MainWindow上右键才有,在其它控件上方点击则没有,那么怎么在对话框上添加呢? 可以添加一个QWidget,然后手动在ui文件里把class改为QToolBar就…

canvas设置全局透明度globalAlpha(图文示例)

查看专栏目录 canvas实例应用100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

睿尔曼超轻量仿人机械臂—外置按钮盒使用说明

睿尔曼RM系列机械臂的控制方式有很多种,包括:示教器、JSON、API等。在此为大家介绍外置按钮盒的使用方法。 按钮盒接线安装 按钮盒外观如下图所示,有:急停、暂停、开始、继续。四个功能按钮。用户可通过这四个按钮来实现对机械臂运…