pgvector v0.7.0 的新增功能

现实世界的嵌入数据集通常包含隐藏在向量空间中的冗余。例如,当向量聚集在多维空间中的某些中心点周围时,它会揭示一个可利用的结构。通过减少这种冗余,我们可以在对精度影响最小的情况下节省内存和性能。自 0.7.0 版以来,pgvector 中引入了几种利用这一想法的方法:

  • float16 向量表示
  • 稀疏向量
  • 位向量

Float16向量

当 HNSW 索引适合共享内存并避免因并发操作而被逐出时,其效率最高,Postgres 执行此操作以最大限度地减少昂贵的 I/O 操作。从历史上看,pgvector 仅支持 32 位向量。在 0.7.0 版本中,pgvector 引入了 16 位浮点 HNSW 索引,其占用的内存恰好是原来的一半。内存的减少使操作保持最佳性能,并且时间延长了一倍。

使用 float16 向量时有两个选项:

  • 索引使用 float16,但底层表继续使用 float32
  • 索引和底层表都使用 float16。此选项占用 50% 的磁盘空间,并且需要的共享内存减少 50% 才能高效运行。由于单个 Postgres 页面中可以容纳更多向量,并且并发操作导致的页面驱逐更少,因此性能得到进一步提升。

要将现有的 float32 嵌入表复制到 float16 嵌入表:

create table embedding_half (id serial,vector halfvec(1536),primary key (id)
);insert into embedding_half (vector)
selectvector::halfvec(1536)
fromembedding_full;

对于 900K OpenAI 1536 维向量,表大小为 3.5Gb。相比之下,embedding_full需要 7Gb。

然后我们可以构建一个 float16 HNSW 索引:

create index on embedding_half using hnsw (vector halfvec_l2_ops);

为了测试索引创建的性能,我们选择了c7g.metal128Gb内存的实例,其参数如下:

shared_buffers = 50000MB
maintenance_work_mem = 30000MB
max_parallel_maintenance_workers = {0-63}
wal_level=minimal
max_wal_size = 10GB
autovacuum = off
full_page_writes = off
fsync = off

安全绩效顾问

HNSW 构建时间在 0.6.2 版本中经历了逐步改善,引入了并行构建。具有 halfvec(float16)功能的 0.7.0 版本将速度进一步提高了 30%。

请注意,ARM 架构上的 float16 向量算法与 float32 相同,因此串行构建时间(使用一个并行工作器)没有改善。但是,由于页面和 I/O 利用率更高,并行构建存在显著差异。另请注意,此测试不使用预热或其他人工增强功能。

与之前的 float32 相比,float16 的堆和 HNSW 关系仅占用一半的空间。

有一项提案建议在将来通过在 ARM 架构上使用 SVE 内部函数来进一步加快速度(参见:https://github.com/pgvector/pgvector/pull/536)。

Jonathan Katz使用 (64 vCPU、512GiB RAM) 对 HNSW 性能进行了测量r7gd.16xlarge,结果甚至更好。对于 float16,HNSW 构建时间最多快 3 倍。对于 select 的性能,ANN 基准测试结果表明,精度不会随着位数的降低而改变,并且每秒查询数 (QPS) 与内存中的情况相似。但是,当实际机器查询使用 I/O 或由于并发连接导致某些 HNSW 页面从内存中被逐出时,就会出现明显的差异。只需要一半的内存即可容纳相同的 HNSW 索引,相同性能和精度的成本也显著降低。

矢量/矢量向量/HalfVec
索引大小 (MB)77343867
索引建立时间(秒)26490
回想一下@ef_search=100.8190.809
QPS @ ef_search=1012311219
回想一下@ef_search=400.9450.945
QPS @ ef_search=40627642
回想一下@ef_search=2000.9870.987
QPS @ ef_search=200191190

有关不同数据集的完整结果,请参阅此 GitHub 问题。

稀疏向量

如果向量包含许多零分量,则稀疏向量表示可以节省大量存储空间。例如,要填充稀疏向量:

create embedding_sparse (id serial,vector sparsevec(1536),primary key (id)
)insert into embedding_sparse (embedding) values ('{1:0.1,3:0.2,5:0.3}/1536'), ('{1:0.4,3:0.5,5:0.6}/1536');

稀疏向量仅占用非零分量的存储空间。在本例中,1536 个向量中有 3 个值。

请注意稀疏向量表示的新向量语法{1:3,3:1,5:2}/1536

select * from embedding_sparse order by vector <-> '{1:3,3:1,5:2}/1536' limit 5;

向量

使用二进制量化,我们可以将浮点向量表示为二进制空间中的向量。这大大减少了存储大小,旨在作为一种在子集内执行额外搜索之前快速从数据集中“预选”的方法。如果参数化得当,即使没有索引,二次选择也可以非常快。

create index on embeddingusing hnsw ((binary_quantize(vector)::bit(1000)) bit_hamming_ops);select*
fromembedding
order bybinary_quantize(vector)::bit(3) <~> binary_quantize('[1,-2,3]')
limit 5;

要使用二进制量化 HNSW 索引从更大的数据集中预先选择,然后从结果子集中进行快速选择,无需索引:

select * from (select*fromembeddingorder bybinary_quantize(vector)::bit(3) <~> binary_quantize('[1,-2,3]')limit 20
)
order byvector <=> '[1,-2,3]'
limit 5;

它允许为选择、插入或更新操作构建小型且快速的 HNSW 索引,同时仍具有快速向量搜索。子句的确切配置limit取决于数据,因此您需要直接在自己的数据集上试验子选择的大小和最终结果的数量。

新的距离[函数]

pgvector 0.7.0 还增加了对 L1 距离算子的支持<+>

以及用于索引的新距离类型:

L1 distance- 在 0.7.0 版中添加

create index on items using hnsw (embedding vector_l1_ops);

Hamming distance- 在 0.7.0 版中添加

create index on items using hnsw (embedding bit_hamming_ops);

Jaccard distance 在 0.7.0 版中添加

create index on vector using hnsw (vector bit_jaccard_ops);

结论

在过去的一年里,pgvector 在功能和性能方面都有了显著的发展,包括 HNSW 索引、并行构建和许多其他选项。随着半向量 (float16)、稀疏向量和位向量的引入,我们现在看到的速度比一年前提高了 100 倍以上。

要更全面地比较去年 pgvector 的性能,请查看Jonathan Katz 的这篇文章。

MemFire Cloud 中使用[v0.7.0]

所有新项目都附带 pgvector v0.7.0(或更高版本)。如果尚未启用扩展,请务必启用它:

create extension if not exists vector
withschema extensions;

如果您不确定项目使用的是哪个版本的 pgvector,请在MemFire Cloud扩展页面vector上搜索。

image.png

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

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

相关文章

【原创】win虚拟机克隆,没有esxi、VMware、Hyper-V和VirtualBox,只知道win系统的账号和密码能不能把系统克隆出来

迁移 Windows 系统的虚拟机(Virtual Machine, VM)涉及几个步骤,以确保虚拟机在迁移后能够正常工作。以下是迁移过程的一般步骤: 1. 准备工作 备份数据:在迁移之前,确保已经备份了虚拟机内的重要数据,以防迁移过程中出现意外情况。检查兼容性:确保目标主机的虚拟化平台…

Linux环境下安装MySQL详细教程(手把手附图安装!!!)

目录 一、前言 二、安装前的环境检查 三、下载官方的 MySQL 安装包 四、开始安装 MySQL 五、尝试初次启动 MySQL 六、给MySQL 做一些简单的小配置 七、共勉 一、前言 本次专题将带大家进入一个新的专题 ---- MySQL。作为本次专题的第一篇博客&#xff0c;肯定是带大家一起…

Jetson Orin Nano v6.0 + tensorflow2.15.0+nv24.05 GPU版本安装

Jetson Orin Nano v6.0 tensorflow2.15.0nv24.05 GPU版本安装 1. 源由2. 步骤2.1 Step1&#xff1a;系统安装2.2 Step2: nvidia-jetpack安装2.3 Step3&#xff1a;jtop安装2.4 Step4&#xff1a;h5py安装2.5 Step5&#xff1a;tensorflow安装2.6 Step6&#xff1a;jupyterlab安…

Golang——RPC

一. RPC简介 远程过程调用(Remote Procedure Call&#xff0c;RPC)是一个计算机通信协议。该协议运行运行于一台计算机的程序调用另外一台计算机的子程序&#xff0c;而程序员无需额外的为这个交互作用编程。如果涉及的软件采用面向对象编程&#xff0c;那么远程过程调用亦可称…

Thesios: Synthesizing Accurate Counterfactual I/O Traces from I/O Samples——论文泛读

ASPLOS 2024 Paper 论文阅读笔记整理 问题 在设计大规模分布式存储系统时&#xff0c;I/O活动的建模至关重要。具有代表性的/O跟踪&#xff0c;可以对现有硬件、配置和策略进行详细的性能评估。假设跟踪进一步支持分析假设情况&#xff0c;例如部署新的存储硬件、更改配置和修…

QT解析JSON格式超简单

目录 还是从最基础开始、什么是JSON 一、只解析json 1..解析JSON的主要类 2.主函数 二、解析并利用结构体存储 1.定义结构体 2.从 JSON 解析并填充结构体 实战示例 还是从最基础开始、什么是JSON JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数…

2.4 OpenCV随手简记(五)

一、图像翻转 第一个图像翻转&#xff0c;这个可是制作表情包的利器。 图像翻转在 OpenCV 中调用函数 flip() 实现&#xff0c;原函数如下&#xff1a; flip(src, flipCode, dstNone) src&#xff1a;原始图像。 flipCode&#xff1a;翻转方向&#xff0c; 如果 flipCode 为…

【前端面试常见问题】防抖(Debounce)与节流(Throttle)

目录 一、概念阐释 1. 防抖(Debounce) 2. 节流(Throttle) 二、实现方法 防抖函数的实现 节流函数的实现 三、区别与选择 四、面试技巧 在前端开发领域&#xff0c;性能优化是一个永恒的话题&#xff0c;尤其是在处理高频率触发的事件时&#xff0c;如窗口的resize、scroll事…

[Redis]List类型

列表类型来存储多个有序的字符串&#xff0c;a、b、c、d、e 五个元素从左到右组成了一个有序的列表&#xff0c;列表中的每个字符串称为元素&#xff0c;一个列表最多可以存储个元素。在 Redis 中&#xff0c;可以对列表两端插入&#xff08;push&#xff09;和弹出&#xff08…

Element UI:高效的 Vue.js 组件库

Element UI&#xff1a;高效的 Vue.js 组件库 Element UI 是由饿了么前端团队开发的一个基于 Vue.js 的桌面端组件库。自从发布以来&#xff0c;Element UI 因其高质量的设计、丰富的功能和易于使用的特性&#xff0c;迅速成为 Vue.js 开发者中最受欢迎的 UI 框架之一。本文将…

【动手学深度学习】多层感知机之权重衰减研究详情

目录 &#x1f30a;1. 研究目的 &#x1f30a;2. 研究准备 &#x1f30a;3. 研究内容 &#x1f30d;3.1 多层感知机权重衰减 &#x1f30d;3.2 基础练习 &#x1f30a;4. 研究体会 &#x1f30a;1. 研究目的 防止过拟合&#xff1a;权重衰减和暂退法都是用来控制模型的复…

五年制转本中比较难考的几个专业

五年制转本中比较难考的几个专业&#xff0c;你们知道吗&#xff1f;第一个就是医学类相关专业&#xff0c;医学界都流传着一句话&#xff0c;劝人学医&#xff0c;天打雷劈&#xff0c;想必大家都有所耳闻。并且大家在选专业的时候&#xff0c;都会有人告诉你&#xff0c;千万…

北大、腾讯强推!DynamiCrafter WebUI 在线教程,无需逐帧记录即可图片变视频

从史前时期开始&#xff0c;人类的祖先就曾以石为笔&#xff0c;在洞穴的石壁描绘出一系列野牛奔跑的分析图&#xff0c;壁画上的动物被叠加了多条腿&#xff0c;用来表现连贯的动作&#xff0c;这或许便是动态视频的最早雏形。 被焚之城的山羊陶碗 时光流转&#xff0c;最初&…

sqli-labs 靶场闯关基础准备、学习步骤、SQL注入类型,常用基本函数、获取数据库元数据

Sqli-labs的主要作用是帮助用户学习如何识别和利用不同类型的SQL注入漏洞&#xff0c;并了解如何修复和防范这些漏洞。 它提供了多个不同的漏洞场景&#xff0c;每个场景都代表了一个特定类型的SQL注入漏洞。 用户可以通过攻击这些场景来学习和实践漏洞利用技术&#xff0c;以及…

使用国内源加速pip安装包

文章目录 pip国内镜像源临时使用设为默认 pip国内镜像源 清华&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 阿里云&#xff1a;http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 华中理工大学&#xff1a;http://pyp…

【Linux】多进程基础--信号

文章目录 信号常见信号信号定时函数 信号 发生事件时通过信号向进程进行通知&#xff0c;在软件层次上模拟中断&#xff0c;也叫软件中断&#xff0c;处理优先级较高对于前台进程可以通过特殊的字符发送信号&#xff0c;例如CtrlC即给当前进程发送一个SIGINT中断信号。kill命令…

【数据结构】二叉树-堆

目录 一.树概念及性质 二.二叉树的概念与实现 三.堆的概念和结构 四.堆的实现 1.向下调整算法 2. 堆的创建 3.向上调整算法 4.堆的删除 五.堆排序 六.堆-源码 一.树概念及性质 树是一种非线性的数据结构&#xff0c;它是由数个节点组成的具有层次关系的集合。之所以叫…

干货 | SDR RFSoC技术框图大放送(附资源)

软件无线电(SDR) 本文参考《Software Defined Radio with Zynq UltraScale RFSoc》&#xff0c;全文共744页。需要的可以给公众号 迪普微科技 发送“SDR”。

【力扣】矩阵中的最长递增路径

一、题目描述 二、解题思路 1、先求出以矩阵中的每个单元格为起点的最长递增路径 题目中说&#xff0c;对于每个单元格&#xff0c;你可以往上&#xff0c;下&#xff0c;左&#xff0c;右四个方向移动。那么以一个单元格为起点的最长递增路径就是&#xff1a;从该单元格往上…

基于曲率的关键点检测

曲率是描述点云中每个点局部几何形状的一种度量。高曲率的点通常位于边缘、角点等显著位置。因此,通过检测曲率较高的点,我们可以找到点云中的关键点。 函数实现 下面是一个用于基于曲率检测关键点的函数实现 计算平均曲率 //计算平均曲率 float com_avg_curvature(pcl::P…