需求背景
向量检索
全球每天产生的数据中,有80%是非结构化数据,而20%的结构化数据拥有最完善最强大的数据库基础软件用来存储与分析。从统计上来说前端性能优化,有80%的数据并没有很好的被挖掘出来,当今缺乏用来分析非结构化数据的基础软件。
将非品悟性能优化结构化的数据通过深度学习等AI技术,进行特征提取生成的向量本质上是对非结构化数据在高维度空间的映射,他从排序算法的时间复杂度和空间复杂度非结构化数据中抽取出关键的信息编码到向量中排序算法复杂度,然后我们对这种高维向量进行存储并分析处理,可以用来解决一些传统技术手段无法解决的问题,通过向量检索技术,人们拓宽了计算机技术的边界。
所有需要对非结构化数据进行检排序算法索的场景都可以使用向排序算法的时间复杂度和空间复杂度量检索方法(或许也是唯一的方法),几乎涵盖所有AI场景。
在AI业务application上,将通过模型计算处理后的非结构化数据所表征的向量称之为Embedding。
Embe排序算法复杂度dding 的理解
可视化Embed排序算法有哪些ding
KNN 问题
如何在海量数据检索最近邻的K个数据? 所谓最近邻就是说由用户定义的两个节点之间的距离最近,距离的计算公式由用户定义(类似于排序算法中的比较函数,可以由用户去定义)。
常缓存英文见的有 : 欧氏距离,余弦相似度,内积等 。
特征向量的距离度量
相似度计算方式
基本KNN算法介绍
Br排序算法的时间复杂度和空间复杂度ute Force
两两计算向量距离,暴力检索,然后返回topk距离结果
K-means
论文缓存视频合并原文
基于聚类的思想,计算各个类簇的中心点,然后让query向量与中心点比较快速筛选最近邻
问题在于 聚类边缘的节点存在割裂问题,边缘节点的最近邻可能跨越到另一个聚类域阿里巴巴1688货源批发官网来
KD Tree
论文原文
通过计算各个维度的方差,计算分割维,取分割维手机性能优化排序的中点为划分点,得到左右子树,递归构建
查询时递归查询到KD Tree的叶子节点,然后回溯到父节点,以目标点和叶节点画圆判断父节点的其他子节点是否在这个区域,在appstore崩了的话计算最近距离,然后逐一检索到直到全部搜索完毕。
Annoy
论文原文
根据聚类中心点划分超平面作为非叶子结点,每个包含k个向量的桶作为叶子,形成一颗二阿里嘎多叉树
LSH 局部敏感哈希
原作者主页
用k个局部敏感哈希函数,计算k个cell,然后取并集或者交集,返回topk内容
PQ 乘积量化
论文原文
利阿里云盘用分段降维的方式,对128维向量分4段,得到4个32位的的子空间向量,然后对4个子段利用k-APPmeans进行聚类,通常得到4*256个码点表,查询时先计算出4个码点,然后分别计算与中心点的距堆排序算法离,将距离和分别相加得到最终非对称距离表征相似距离。
可以先通过k-means 进行粗量化计算,聚类1024类 可以快速的筛选出感兴趣区域,然后对感兴趣区域内的向量缓存垃圾克星使用排序算法有哪些PQ 的距离计算进行检索 这称之为I堆排序算法VF-PQ。
HNSW 算法
论文原文
使用图结构来存储索引
插入与查找的过程:
-
维护一个topk的堆,插入节点时在顶层随机选择一个节点开始,得到他的友点,计算这些友点到目标向量的距离,并以距离为socre放入topk的小顶堆中,选择堆顶节appearance点为下一跳节阿里员工离职感言点 贪心的完成当前层的搜索,然后得到topk的节点列表,将插阿里巴巴股票入目标点和列表中的节点建立友点关系
-
然后选择topk的顶点作为下一层检索的起始点,重复上面搜索过程,直到到达最后一层,此时topk 堆中的节点就是 KNN的检索结果
-
查性能优化的方法找过程只需要把建立新友点的过程去除即缓存是什么意思可
组合索引
一文纵览KNN(ANN)向缓存是什么意思量检索
暴力搜索召回率是百品悟性能优化分百的,可以看作是聚类中心点为向量本身的K-means,也可以看作是聚类中心点为1的K-means,可以划分出大量的中心点,减少聚类的倒排长度,来解决HNSW算汽车性能优化法占用内存过多的问题,然后用HNSW算法来组织中心点,来缓存视频变成本地视频解决聚类算法召回率低的问题。
朴素解
根据不同的索引算法,可以发现一个在线索引服务的基本步骤是:
-
离线构建索引文件
-
分发索引文件到服务器
-
加载索引文件构建内存数据结构
-
服务器对外提供索引查询
问题约束
- 数据量过大,构建索引文件的速度需要保证在小时级
- 大规模数据上的检索精度和性能
- 数据实时appstore崩了产生,索引需要实时更新才能更好的反应增量信息,提高商业指标
- 业务复杂化,通过指定APP标签属APP性的方式,缩小检索范围加快查询
- 没有一种算法模型适用于所有场景,因此要支持不同的索引构建算法
- 复杂的索引算法具有较多的参数,排序算法有哪些如果对这些参数进行超参数调优?
- 百亿规模向量(412810 Billion = 5T), 5小时完成一轮离线构建
- 支持上百个索引模型,多版本的同时离线构建与在线服务
- 支持 toappointmentpk k=5000 查询 p99 10ms (0 <= k <= 5000)
- 毫秒级动态修改实时索引
架构演绎
最核心的领域对象是什么? ->排序算法; 索引
基本架构
小时级构建索引文件
索引构建是一个计算密集缓存文件夹名称型任务,需要并行数据处理架构
MapRe阿里众包duce 论文导读
GFS-论文导读
大规模数据集的毫秒级KNN查询,并保证精度最高
数据密集approve型系统设计
KNN算法中基于图的检索其精度是最高的,HNSW的性能也是最好的,但其弊端在于内存占用大,单机难以存储百亿规模向量索引。所以 只能对索引进行分片来水平扩展,但性能优化分片会导致图性能优化前端面试检索的割裂,减少一些边的建立造成检索性能和精度的微小损失,但换来水平可伸缩性是值得的。
分片就会涉及几个问题品悟性能优化:
-
分片的依据是什么?
hash range clustering 随机分配形成N个分片索引文件无序,数据分布均匀 按向量排堆排序算法序分片(不现实)有序,写请求存在热点 先对向量聚类,按聚类中心点分类构电脑性能优化建过程慢,数据分布不均衡
-
如何路由并聚合结果?
全扇出 随机 聚缓存视频合并app下载类 精度最高,带宽占用高 精度低,随机性强(推荐),带宽消耗低 精度高,IO消耗低,路由逻辑需要计算消耗CPU高
根据返回结果的距离作为分值排序,选择TOPK即可
-
谁来执行路由策略? 【客户端/代理服务】
客户端 代理服务 成本低,但灵活性降低,并占用调用者的服务器资源 成品悟性能优化本高,灵活度高,对调用者无入侵
-
如何应对热点key?
冗余副本 局部性缓存 需要考虑复制造成的一致性 LRU,LFU等淘汰策略,命中率appreciate等
分片副本的复制,造成大规模的数据迁移IO,网络带宽打满影响构建和查询
主从复制 | 链式复制 |
---|---|
复制延迟低,吞吐差,鲁棒性强 | 延迟高,吞吐强,鲁棒性差 |
pipeline 优化 |
---|
将数据传输过程中的文件进行分片,在未完成一个文件的接收时就将数据传排序算法复杂度输到下一个节点,充分利用快速排序算法网络带宽资源 |
如何增量构建,实现索引的实时更新
特征生产方 直接RPC插入 serving的HNSW索引中 | 通过 MQ 形成时间窗口,小批量构建索引分片 |
---|---|
H阿里巴巴1688货源批发官网NSW 插入性能差,会影响查询性能,高QPS的场景不能直接插入 | 在线索引都是只读因此性能不受影响,但是会形成多个小分片,需要在每个serving内也聚合一次结果1. 多久或多少聚合一次apple? 要在时间和空间上做取舍 |
-
小 分片 数量要存多少?如何冒泡排序算法选择?
- 维护1阿里云盘28个小阿里供应链分片
- 取最新的,并随机取其他分片4个共五个分片 |
更好的架构排序算法总结
实现原理
Meta Server设计
-
调度索引离线构建过程
-
维护分片与副排序算法的时间复杂度和空间复杂度本的路由信息
-
周期性健康检查,对失败任务或serving缓存视频怎样转入相册进行调度,保证集群可用性
模型的状态机缓存垃圾克星
-
Meta server 维护模型appear构建的整个生命周期,新创建的index构建任务,index状态为init。
-
为当前index创建多个build task放到队列中分发给多缓存个build server并将状态变更为building, Build缓存文件夹名称er server根据领取到的task中配置的file path去fs上拉取文件到本地,并触发hnsw_lite算法库构建模型并save到本地,同步到FS上;Builde阿里众包r server 告知meta server任务构建完成,更新模型状态为trans。
-
Meta server 创建多个trans task分发至task队列 , 告知最近的serving group的master模型分片已经构建完毕,Serving group 的master节点从FS pull下来模型,启动链式复制,同步分片到副本上,并通知me排序算法的一般选择规则ta同步完毕。
-
等到所有的trans task完成后,将状态变更为loadiapproachng并将loading task放到队排序算法的时间复杂度列。
-
链式链表的性能优化尾节点确认模型加载完毕后模型状态变更为appreciateOnli缓存视频在手机哪里找ne并更新etcd中模型的版本信息。
-
通过metappreciatea server服务阿里巴巴1688将模型状态改为offline,访问该模型的分片路由请求将收到拒绝。
-
平台侧可对offline或者online索引进行更新变更为update,用新的向量来构建索引
-
Bu阿里云ilder server 通过对path的版本号变更去FS加载对应版本的手机性能优化向量文件进行新一轮的构建
DAG 任务描述
{
"build":{
"work_dir":"hdfs://biz/table/index/"
},
"trans":{
"dep":["build"]
},
"load":{
"dep":["trans"]
},
"shard_num":3,
"verison":1
}
路由信息
使用map可以加速查询,同时在node排序算法节点中要维护一些健康检查的信息
Serving/Query 设计
服务启动
-
服务器启动时注册到etcd,以便于meta server 发现
-
meta server 健康检查serving 节点,发现链条不可用则会触发一轮group 复制链条选举,选举nodeid最大的节点,在etcd中通过配置变更实现。
为避免 meta server单点问排序算法有哪些题,可以由复制链条基于 etcd 自行选举。
-
Seappearrving 从etcd得到group 信息,组织成复制链条(通过ip距离选择最近的节点组织成链)
加载模型
-
master得到me排序算法的一般选择规则ta的任务通知从fs上拉取文件按version区分文件夹
-
加载过程中流式的将文件内容发送给关联的group的下一个节点
-
加载完毕后mv到工作目录,覆盖老版本文件,并触发load逻辑
-
加载文件手机性能优化内容到内存,构建新版阿里巴巴1688本模型,在线无缝切换底层模型
-
清空实缓存文件夹名称时索引模型列表,准备接收新kafka的消费内容构建实时索引
在线查询
-
query请阿里员工离职感言求主索引,缓存视频变成本地视频并发的请求最新的索引以及随机请求其他实时索引
-
在超时时间达到时需要通知检索线程立即终止,以节省线程资源
-
在机器上做toapplicationpk聚合,然后在代理服务再排序算法的时间复杂度和空间复杂度做一个topk安卓性能优化
Proxy Server 设计
分发
-
Proxy 周期的向meta电脑性能优化拉取最新的路由信息
-
通过
biz-table-index-version
确认访问的索引模型 -
通过
route_model
字段指明所使用的路由策略,1代表随机,2代表聚类,3代表扇出 -
随机时从route中返回group列表中,利用快速洗牌选择1-5个列表中随机某个shard进行请求
-
聚类时根据label字段筛选出具体的group列表,每个group请求随机一个shard。
-
扇出时则请求route下的所有group中的随机shard。
聚合
-
推荐通常阿里嘎多召回5k item,性能优化在调用serving时可以配置请求top缓存视频合并k接阿里口的大小为query count的一半
-
拿到2.5k*shardNum 数量的itme后,取分值最高的top 5k内容返回
改进方向
性能优化
离线计算
这样能保证5小时构建百亿级向量吗?
- 百亿个float32存储128维度的向量需要412810 Billion = 5T 文件大小的存储
- 线上至少有100+索引,总处理数据集合有500T
流式构建 状态机
- Task manager 不需要等待一个DAG子阶段任务全部执行完毕后在执行下性能优化前端面试一汽车性能优化个阶段的任务
- 只需要在一个子任务结束后开启下一个关联任务,执行的处理粒度从状态下沉到子任务
浮点数计算过慢应该如何加速?
- 使用FPU&手机性能优化amp;GP阿里巴巴1688货源批发官网U 加速计算
- 使用SIMD&AVX指令集并行计算,一次性加载128位数据进行计算
- 使用定点数存储数据,减少文件大小以及索引内存大小
在线分发
检索过程中会创造大量小对象,造成回收压力和内存碎片
在用户态实现SLAB分配器,对小对象进行资源池
Serving 服务存在状态,重启时排序算法复杂度会造成服务抖动
使用性能优化前端面试共享内存来存储索引数据,在serving因故障或升级重启时无负担
稳定性优化
如何快速的进行版本回滚提高可用性?
- 讲文件加载性能优化的方法到对应的版本目录下
- 然后复制到一个tmp目录中
- 将tmp目录中过的文件mv 到工作目录中覆盖当前缓存视频合并app下载版本的索引文安卓性能优化件
- 在快速回阿里云滚或兜性能优化前端面试底时,去指定版本目录下加缓存视频合并载对应版本的索引文件
延迟取决于最慢的一个算子,如何处理超时情况?
- 检索时给予任务一个截止时间超过检索时间则尽量返回当前的列表
- 设定一个距离阈值,小于此阈值时返空,否则截断返回兜底结果
- 返回局部可用结果来处理失败,并级联的快速回收线程资源
Meta server 存在单点问题,如何保证 元数据 的可靠性排序算法复杂度?
- 元数据全部存储application在etcd中,mata server 仅进行调度计阿里员工离职感言算(存储和计算分离)
- 无状态的mata serve冒泡排序算法r可以水平扩展,并且缓存etcd存储层结果提高性能
成本优化
未完待前端性能优化续….
架构升级
clo缓存垃圾克星ud.tenc性能优化ent手机性能优化.com/developer/a…
流批一体化,日志即数据
表与日志APP的二象性,类似raft的日志一致性来维护状态机。表是某一刻的状态,日志缓存视频合并app下载是流式的状态
舍弃离线构建application过程,所有的数据全部以日志来管理,日志聚合成快照,在快照上建立索引提供查询
集市架构
Milvus 论文
- 初始化时,各个节点向event bus发送注册事件,meta server构建集群状态,写入etcd
- Meta server 将集群状态通过event bus同步给所有节点,所有阶段订阅读取后对外提供服务
- 写SDKappointment调用RPC向appender服务写入数据,appender服务做鉴权缓存视频合并app下载/数据处理/向量归一化等操作
- apappearancepende缓存视频在手机哪里找r写入event bus 向量写入事件后,builder订阅此事缓存文件夹名称件,对写入数据在内存中聚合(时间&空间)
- 对聚合数据调用Lib构建一个索引块并同步写入对象存储服务并发送索引块创建事件发送到event bu阿里嘎多s
- query节点订阅索引块创建事件从oss读取写入的索引块文件到本地,并加载到内存,对外提供服务。
- Proxy 节点订阅meta的集群状态事件选择排序算法,得知bizID-table-index-version的在group的分布情况
- 查询请求通过SDK负缓存视频变成本地视频载均衡(一致性hash等)访问 proxy节点
- Proxy 会根据路由情况拆分sub缓存视频怎样转入相册 query task给到query节点,并对query 节点的返回结果做reduce
- query节点查询命中的索引块,并缓存对结果做reduce,然后返阿里拍卖回结果
- 任何一个节点崩溃,都可以通过event bus 的快照事件快速恢复状态
- 通过控制索引块的时间窗口,可以调节实时和吞吐的指标平衡
- 需要提供离线导入工具,支持初始化集群时批量导入数据到向量检索数据库中
- 每个事件都有其全局唯一排序算法有哪些ID,appreciate通过meta server分配,可以阿里众包分段批量分配来提高性能。
参考文献
-
分布式向量检索引擎
-
K-means论文原文
-
KD Tree 论文原文
-
AnnoyANN 论文原文
-
LS缓存英文H 原作者主页
-
PQ 论文原文
-
赋能阿里多业务场景,达摩院自研向量检索引擎 Proxima 公开 – 达摩院
-
向量检索的基本算法介绍
-
KD树详解及KD树最近邻算法 –
-
KNN算法综述
-
Fast Approximate Nearest Neighbor Search With The Navigating Spreading-out Graph
-
局部敏感哈希在推荐系统中的应用
-
一文看懂HNSW算法理论的来龙去脉_缓存视频合并u011233351的博客-CSDN博客
-
图像检索:再叙ANN Search
-
CPU和GPU的设计区别 – Magnum Programm Life
-
SIMD+SSE+AVX
-
使用SIMD为Golang加速
-
AVX512 golang/go Wiki
-
一文纵览KNN(ANN)向量检索