pgvector 0.6.0:并行索引构建速度提高 30 倍
pgvector 0.6.0 今日发布,带来一项重大改进:支持并行构建 HNSW 索引。对于未记录日志的表,构建 HNSW 索引的速度现在提升了 30 倍。
此版本对于 pgvector 来说是一个巨大的进步,使得调整 HNSW 构建参数和提高搜索准确性和性能变得更加容易。
pgvector 中的 HNSW 索引
我们在之前的一篇文章中探讨了HNSW 的工作原理,现在简单回顾一下:HNSW 是一种近似最近邻搜索算法。它使用邻近图,由两部分组成:分层结构和可导航的小世界网络。它在多个节点密度或节点间距离不同的层上运行,其中层代表节点之间不同的连接长度。因此,HNSW 可以在线性对数时间内完成搜索、插入和删除操作。
pgvector 并行索引构建
在 0.6.0 版本之前,pgvector 仅支持使用单线程构建索引——这对于大型数据集来说是一个很大的瓶颈。例如,为 1536 维的 100 万个向量构建索引大约需要 1 小时 27 分钟(使用'm'=16, 'ef_construction'=200
)。
通过并行索引构建,您可以在 9.5 分钟内为同一数据集构建索引 - 速度提高 9 倍:
性能比较:pgvector 0.5 与 0.6
我们使用dbpedia-entities-openai-1M数据集(100 万条向量,1536 个维度)测试了索引构建时间,以比较并行和单线程 HNSW 索引构建的性能。同时,我们验证了生成的索引在准确率和每秒查询次数 (QPS) 方面是否相同。
我们对各种数据库大小运行基准测试,以了解并行构建的影响:
- 4XL 实例(16 核 64GB RAM)
- 16XL 实例(64 核 256GB RAM)
4XL 实例(16 核 64GB RAM)
该基准测试使用了以下参数:
0.5.1 | 0.6.0 | |
---|---|---|
维护工作内存 | 30GB | 30GB |
最大并行维护工作者数 | - | 15 |
max_parallel_maintenance_workers
控制用于构建索引的并行线程数。在后续章节中,我们将使用包含领导者在内的工作线程总数。
0.6.0 的索引构建时间快了 7-9 倍,而两个版本的每秒查询次数和准确率保持不变:
v0.5.1
:所有基准测试的平均 QPS 为 938,准确率为 0.963。v0.6.0
:所有基准测试的平均 QPS 为 950,准确率为 0.963。
16XL 实例(64 核 256GB RAM)
您可以使用更强大的实例(这些参数最高可达 13.5 倍)进一步提高索引构建性能。
索引构建时间与所用核心数并非线性相关。合理的默认值max_parallel_maintenance_workers
是CPU count / 2
,也就是我们在 Supabase 平台上设置的默认值。准确率和 QPS 不受 的影响max_parallel_maintenance_workers
。
未记录表的嵌入
使用未记录的表可以进一步减少构建时间。
Postgres 中的“未记录表”是指其修改不会记录在预写日志中的表(以性能换取数据可靠性)。“未记录表”非常适合嵌入,因为原始数据通常单独存储,并且可以随时从源数据重新创建嵌入。
索引创建的步骤之一是最终扫描和 WAL 写入。这通常很短,但无法并行化。使用未记录日志的表可以跳过 WAL 写入,带来显著的效果:
ef_construction | 构建时间:v0.5.1 | 构建时间:v0.6.0(未记录) | 改进 |
---|---|---|---|
64 | 38分08秒 | 1分38秒 | 23倍 |
100 | 1小时06分59秒 | 2分10秒 | 31倍 |
200 | 1小时27分45秒 | 3分37秒 | 24倍 |
入门
pgvector 0.6.0刚刚发布,即将在 Supabase 项目中使用。再次特别感谢 Andrew Kane 以及所有参与并行索引构建工作的同事。
鏂囩珷鏉ユ簮锛�https://dev.to/supabase/pgvector-060-30x-faster-with-parallel-index-builds-i1l