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,一经查实,立即删除!

相关文章

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;例如部署新的存储硬件、更改配置和修…

2.4 OpenCV随手简记(五)

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

[Redis]List类型

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

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

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

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

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

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

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

【数据结构】二叉树-堆

目录 一.树概念及性质 二.二叉树的概念与实现 三.堆的概念和结构 四.堆的实现 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;从该单元格往上…

SpringBoot项目启动后访问网页显示“Please sign in“

SpringBoot启动类代码如下 SpringBoot项目启动后访问网页显示"Please sign in"&#xff0c;如图 这是一个安全拦截页面&#xff0c;即SpringSecurity认证授权页面&#xff0c;因为SecurityAutoConfiguration是Spring Boot提供的安全自动配置类&#xff0c;也就是说它…

城规跨考地信:你需要知道的几件事

24考研结束&#xff0c;25地信考研的小伙伴也开始准备。 在这期间发现一个现象&#xff0c;城规跨考GIS的讨论度非常高。 对这一点&#xff0c;我并不感到意外&#xff0c;因为随着地产行业的节节败退&#xff0c;很多单位不需要那么多规划人和建筑人&#xff0c;乃至土木人。…

SpringCloud 微服务中网关如何记录请求响应日志?

在基于SpringCloud开发的微服务中&#xff0c;我们一般会选择在网关层记录请求和响应日志&#xff0c;并将其收集到ELK中用作查询和分析。 今天我们就来看看如何实现此功能。 日志实体类 首先我们在网关中定义一个日志实体&#xff0c;用于组装日志对象 Data public class …

使用Java apache commons包五分钟搞定NCR解析(内附源码)

在网上看到很多关于解析NCR(Numeric Character Reference)字符串的java实现&#xff0c;核心都是通过自定义正则表达式来解析&#xff0c;其实org.apache.commons 已经为我们提供了jar包 解决该问题&#xff0c;非常的方便&#xff01;在这里我就来简单分享一下具体实现方法&am…

这就是英伟达 CEO 黄仁勋所说的人工智能“下一波浪潮”|TodayAI

在台湾一年一度的科技展 COMPUTEX 开幕前的周日&#xff0c;英伟达&#xff08;Nvidia&#xff09;首席执行官黄仁勋&#xff08;Jensen Huang&#xff09;表示&#xff0c;机器人和“理解物理定律的 AI”将成为下一波技术浪潮。他指出&#xff0c;英伟达目前正在推动生成式人工…

MyBatis核心对象

MyBatis核心类对象主要有俩个&#xff1a; 1&#xff1a;对相关配置文件信息进行封装的Configuration对象 2&#xff1a;用来执行数据库操作的Executor对象。 核心对象----存储类对象Configuration Configuration对象主要有三个作用&#xff1a; 1&#xff1a;封装MyBatis…

Pulsar 社区周报 | No.2024-05-30 | BIGO 百页小册《Apache Pulsar 调优指南》

“ 各位热爱 Pulsar 的小伙伴们&#xff0c;Pulsar 社区周报更新啦&#xff01;这里将记录 Pulsar 社区每周的重要更新&#xff0c;每周发布。 ” BIGO 百页小册《Apache Pulsar 调优指南》 Hi&#xff0c;Apache Pulsar 社区的小伙伴们&#xff0c;社区 2024 上半年度的有奖问…

AIGC和ChatGPT有什么区别?

AIGC和ChatGPT有什么区别? 首先先解释一下它们各自的概念 什么是AIGC AIGC&#xff0c;全称为Artificial Intelligence Generated Content&#xff0c;中文译为人工智能生成内容。这是一种利用人工智能技术自动生成内容的生产方式。例如&#xff0c;它可以创作出各种形式的内…