向量检索服务迭代演进

news2024/10/5 19:11:52

背景

在搜索推荐系统里,有一个重要的服务是向量检索服务,也就是求向量在空间中最相近的topk个向量,在搜索系统里,涉及大量的召回引擎可能需要用到向量检索服务,需要在线实时计算,并且可快速响应;

所以这里需要解决两个问题,一个是存储所有待计算的向量,并对输入的向量,做向量相似度计算,求得最近的向量列表排序,取得top k个;另一个因为要达到在线服务即时响应需求,因为这个是基础服务,所以要做到毫秒级别响应

解决方案&迭代演进

1、最粗暴的向量KNN计算

对输入的向量,遍历待计算的所有向量做相似度计算,再用有限容量K最大堆排序,取得最后topk向量;

优点是:算法实现简单,服务维护成本低;针对向量数量小的,在万级别的情况下,也可以达到毫秒级响应;

缺点:面向十万级别以上向量,每一次的请求计算量一样,都要做全量计算,计算代价太大,响应性能不能满足;

2、引入HNSW java开源算法库

对向量做索引,主要索引存储在内存里,提高响应速度,针对大数据量的向量可快速响应;

优点:直接用java服务开发管理向量,向量的更新管理,直接内嵌在服务里,不需要再增加多一层请求服务。管理简单,实现成本 也不高;

存在风险问题: 因为索引放在内存里,要占用比较多的内存资源 ,特别是数据量较大的情况下,内存占用太大,400W左右的数据量大概占用10G左右;

索引更新,直接在线上构建,占用cpu使用,索引更换过程时,需要双倍内存资源,更新索引时候容易发生fullgc,导致其它响应问题;

3、引用hnsw c++开源算法库,离线索引&分布式索引构建

采用c++实现库索引则使用了堆外内存,减少gc,并且利用c++对密集计算性能的优势,提高响应性能;

针对大数据量向量,拆分多分片,除了支持更大数据量,增加并行计算提高响应速度;

  • 索引也会先在离线建完,序列化持久到文件,线上直接加载索引文件反序列化再提供服务;

  • 更新索引虽然占用双倍内存,但使用堆外内存,避免引起FULLGC风险问题,只要机器预留一定的内存资源足以;

  • 分布式索引,支撑索引数据量是单机n倍,并提高并行计算,提高响应性能;

存在的问题点:

  • 分布式管理 会比原有单点管理 复杂性变大,系统的开发成本与维护成本 也会相应增加;

  • 现有的hnsw实现里有两块占用比较大内存,label 与内部id映射,向量的存储。可考虑转移到外存,减少内存消耗;

4. 基于第3种方案,再优化了一版,修改了hnsw源码,将id->vector , label->id对应的数据结构移到外存上,减少依赖的内存资源;

优化点:比前一版,可以将部分内存资源转移到外存,减少资源成本 ;

存在问题点: 修改了源生代码 ,并且多了一个RocksDB外存管理 ,整体依赖的技术栈也增加,复杂度也会因此增加。

未来展望

hnsw索引目前遇到一个相似度计算问题,不能比较好支持点乘相似度计算,所以还是得再换用fasis,它支持比较多种类型的索引,以及相似度计算也支持比较多类,比较能满足需求;可以在现有的架构上,改用fasis接入替换hnsw;

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

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

相关文章

Jetpack Compose中的startActivityForResult的正确姿势

之前在 Jetpack Compose中的导航路由 里简单的提到了从 Compose 导航到其他 Activity 页面的方式,对于不带返回结果的则就是跟以前一样简单的启动Activity的代码,而如果是startActivityForResult方式的,需要使用带回调的方式去启动&#xff0…

为什么 TCP 协议有性能问题

TCP 协议可以说是今天互联网的基石,作为可靠的传输协议,在今天几乎所有的数据都会通过 TCP 协议传输,然而 TCP 在设计之初没有考虑到现今复杂的网络环境,当你在地铁上或者火车上被断断续续的网络折磨时,你可能都不知道…

Python 机器学习 数据归一化

众所周知机器学习使计算机从研究数据和统计数据中学习机器学习是向人工智能(AI)方向迈进的一步。机器学习是一个分析数据并学习预测结果的程序。此篇文章主要介绍Python机器学习的数据归一。1、数据归一化当您的数据具有不同的值,甚至具有不同…

一些神经网络基础知识归纳

神经网络(NN)复杂度 NN复杂度,多用NN层数和NN参数个数表示 如上图示 空间复杂度 层数隐藏层的层数1个输出层 上图为2层NN 总参数 3*44 4*2226 时间复杂度 乘加运算次数 3*44*220 指数衰减学习率 可以先用较大学习率,快速得…

KingbaseES V8R3数据库运维案例之---不完整的启动包(incomplete startup packet)复现

案例说明: 在KingbaseES V8R3数据库的sys_log日志中,出现以下故障信息“不完整的启动包(incomplete startup packet)”日志信息。本案例复现此日志信息发生的原因。 如下图所示,日志信息: 适用版本: KingbaseES V8R3 1…

计算最大公约数和最小公倍数被Java程序员用代码写出来啦

沉淀、分享、成长,让自己和他人都能有所收获!😄 一、前言 嘿,怎么突然讲到最大公约数了? 这么想你肯定是没有好好阅读前面章节中讲到的RSA算法,对于与欧拉结果计算的互为质数的公钥e,其实就需…

树莓派系统安装,网络配置,系统配置

如何安装树莓派的系统 以及 树莓派新系统SSH连接被拒绝的解决方法 1. 烧录方式1(官方,简单) 在下面网站下载 https://www.raspberrypi.com/software/ 打开以后选64位系统 选择安装的u盘 设置ssh,WiFi,登录密码等…

MySQL高级【表级锁】

1:表级锁1.1:介绍表级锁,每次操作锁住整张表。锁定粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、 InnoDB、BDB等存储引擎中。 对于表级锁,主要分为以下三类: 表锁元数据锁&#xff0…

PLC常见的输入设备及其接线方式列举

PLC常见的输入设备有按钮、行程开关、接近开关、转换开关、拨码器、各种传感器等,输出设备有继电器、接触器、电磁阀等。下面,我们来详细看看PLC如何与这些设备正确地连接输入和输出线路。1.PLC与主令电器类设备的连接下图是PLC与按钮、行程开关、转换开…

现代C++并行与并发笔记 附C++17线程池实现项目实战

文章目录让程序在特定时间休眠启动和停止线程互斥量(mutex)进行延迟初始化——std::call_once将执行的程序推到后台——std::async信号量(condition_variable)C11 线程池前置知识返回值类型推导 result_of 和 invoke_resultpackag…

天翼物联获中国信通院2022 AIoT先锋企业

近日,由中国信息通信研究院组织开展的2022 AIoT先锋企业评选活动成果发布,中国电信天翼物联凭借为AIoT发展作出的积极贡献获“2022 AIoT先锋企业”,是唯一获得该奖项的通信企业。 2022 AIoT先锋企业评选活动由中国信息通信研究院组织开展&…

IDEA 下载依赖包源码报错Sources not found for: org.springframework.cloud:XXX

IDEA 在使用某些类方法想看下源码时,由于只有 class 反编译的类文件,没有原始 Java 文件,想要将源码下载下来,右下角一直报一个错误 Cannot download sources Sources not found for:XXX,很是烦恼,怎么解决…

数据结构---线性表课后习题详解(朱昌杰编著)

刘佳瑜*,王越 *, 黄扬* , 张钊* (淮北师范大学计算机科学与技术学院,安徽 淮北) *These authors contributed to the work equllly and should be regarded as co-first authors. 🌞欢迎来到数据结构的世界 🌈博客主页&#xff1…

【Docker】docker部署前后端分离项目( 前:nginx + vue 后:springboot+ redis + mysql)

目录一.安装docker二.docker安装和配置nginx1.拉取nginx2.创建临时nginx容器3.从nginx容器复制 nginx.conf 文件到宿主机4.删除临时nginx容器5.启动真正的nginx容器6.查看是否挂载成功7.配置nginx.conf 和 vue的包放到指定位置三 docker安装部署redis1.安装redis2.部署redis四 …

如何计算结构体的大小?结构体内存对齐【C语言】

今天我们来讲讲结构体的大小如何来计算 其中涉及到一个结构体中的热门考点:结构体内存对齐 话不多说,开始学习! 要想计算结构体的大小,首先要了解结构体的对齐规则。 目录 结构体内存对齐规则 举例 为什么存在内存对齐? 如…

测试用例该怎么设计?—— 日常加更篇(上)

😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。…

火山引擎 DataTester 升级:降低产品上线风险,助力产品敏捷迭代

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群 在企业竞争加剧的今天,精益开发和敏捷迭代已成为产品重要的竞争力。如何保障每一次 Feature 高效迭代与安全,如何快速实现面对不同用户的精细化运营…

Java设计模式——单例模式

目录 一、设计模式介绍 二、设计模式类型 三、单例设计模式介绍 单例设计模式八种方式 (一)饿汉式(静态常量) (二)饿汉式(静态代码块) (三) 懒汉式(线程…

【Flink系列】部署篇(二):独立部署高可用Flink集群实战

服务器操作系统:centos7本机操作系统:MacFlink version: 1.15JDK version: java11HA service: ZookeeperFile System: NFS 资源分配: iphostnamerole10.250.0.1main0JM10.250.0.2main1JM10.250.0.3main2JM10.250.0.4worker1TM10.250.0.5wor…

Spring Cloud Eureka的使用

Spring Cloud Eureka 🐻 一个服务注册与发现的组件 🐻🐻🐻🐻🐻🐻ZT😄🐻🐻🐻🐻🐻🐻🐻🐻…