选择计算插件
为您的向量工作负载选择合适的计算插件。
您有两种扩展向量工作负载的选项:
- 增加数据库大小。本指南将帮助您为工作负载选择合适的大小。
- 将工作负载分散到多个数据库。您可以在工程扩展中找到关于此方法的更多详细信息。
维度
嵌入向量的维度数量是选择合适计算附加组件的最重要因素。一般来说,维度越低性能越好。我们为一些更常见的嵌入维度提供了指导建议。对于每个基准测试,我们使用Vecs创建集合,将嵌入向量上传到单个表,并为嵌入列创建IVFFlat
和HNSW
索引(使用inner-product
距离度量)。然后我们运行了一系列查询来测量不同计算附加组件的性能:
HNSW
384 维向量
该基准测试使用 dbpedia-entities-openai-1M 数据集,其中包含 1,000,000 个文本嵌入向量,重新生成为 384 维向量。每个嵌入向量都是使用 gte-small 生成的。
计算规格 | 向量数量 | m | 构建ef值 | 搜索ef值 | QPS | 平均延迟 | P95延迟 | 内存使用量 | 内存 |
---|---|---|---|---|---|---|---|---|---|
微型 | 100,000 | 16 | 64 | 60 | 580 | 0.017 秒 | 0.024 秒 | 1.2 (交换) | 1 GB |
小型 | 250,000 | 24 | 64 | 60 | 440 | 0.022 秒 | 0.033 秒 | 2 GB | 2 GB |
中型 | 500,000 | 24 | 64 | 80 | 350 | 0.028 秒 | 0.045 秒 | 4 GB | 4 GB |
大型 | 1,000,000 | 32 | 80 | 100 | 270 | 0.073 秒 | 0.108 秒 | 7 GB | 8 GB |
超大 | 1,000,000 | 32 | 80 | 100 | 525 | 0.038 秒 | 0.059 秒 | 9 GB | 16 GB |
2倍超大 | 1,000,000 | 32 | 80 | 100 | 790 | 0.025 秒 | 0.037 秒 | 9 GB | 32 GB |
4倍超大 | 1,000,000 | 32 | 80 | 100 | 1650 | 0.015 秒 | 0.018 秒 | 11 GB | 64 GB |
8倍超大 | 1,000,000 | 32 | 80 | 100 | 2690 | 0.015 秒 | 0.016 秒 | 13 GB | 128 GB |
12倍超大 | 1,000,000 | 32 | 80 | 100 | 3900 | 0.014 秒 | 0.016 秒 | 13 GB | 192 GB |
16倍超大 | 1,000,000 | 32 | 80 | 100 | 4200 | 0.014 秒 | 0.016 秒 | 20 GB | 256 GB |
基准测试准确率为 0.99。
960维向量
该基准测试使用了gist-960数据集,其中包含1,000,000个图像嵌入向量。每个嵌入向量为960维。
计算规格 | 向量数量 | m | ef_construction | ef_search | QPS | 平均延迟 | p95延迟 | 内存使用量 | 内存 |
---|---|---|---|---|---|---|---|---|---|
微型 | 30,000 | 16 | 64 | 65 | 430 | 0.024秒 | 0.034秒 | 1.2 GB (交换) | 1 GB |
小型 | 100,000 | 32 | 80 | 60 | 260 | 0.040秒 | 0.054秒 | 2.2 GB (交换) | 2 GB |
中型 | 250,000 | 32 | 80 | 90 | 120 | 0.083秒 | 0.106秒 | 4 GB | 4 GB |
大型 | 500,000 | 32 | 80 | 120 | 160 | 0.063秒 | 0.087秒 | 7 GB | 8 GB |
超大 | 1,000,000 | 32 | 80 | 200 | 200 | 0.049秒 | 0.072秒 | 13 GB | 16 GB |
2XL | 1,000,000 | 32 | 80 | 200 | 340 | 0.025秒 | 0.029秒 | 17 GB | 32 GB |
4XL | 1,000,000 | 32 | 80 | 200 | 630 | 0.031秒 | 0.050秒 | 18 GB | 64 GB |
8XL | 1,000,000 | 32 | 80 | 200 | 1100 | 0.034秒 | 0.048秒 | 19 GB | 128 GB |
12XL | 1,000,000 | 32 | 80 | 200 | 1420 | 0.041秒 | 0.095秒 | 21 GB | 192 GB |
16XL | 1,000,000 | 32 | 80 | 200 | 1650 | 0.037秒 | 0.081秒 | 23 GB | 256 GB |
基准测试的准确率为0.99。
通过增加m
和ef_construction
参数可以进一步提升QPS。这将允许您使用更小的ef_search
值来提高QPS。
1536 维向量
该基准测试使用 dbpedia-entities-openai-1M 数据集,其中包含 1,000,000 个文本嵌入向量。对于计算附加项 large
及以下规格,还使用了来自维基百科文章的 224,482 个嵌入向量。每个嵌入向量均为 1536 维,由 OpenAI 嵌入 API 生成。
计算规格 | 向量数量 | m | ef_construction | ef_search | QPS | 平均延迟 | p95 延迟 | 内存使用量 | 内存 |
---|---|---|---|---|---|---|---|---|---|
Micro | 15,000 | 16 | 40 | 40 | 480 | 0.011 秒 | 0.016 秒 | 1.2 GB (交换) | 1 GB |
Small | 50,000 | 32 | 64 | 100 | 175 | 0.031 秒 | 0.051 秒 | 2.2 GB (交换) | 2 GB |
Medium | 100,000 | 32 | 64 | 100 | 240 | 0.083 秒 | 0.126 秒 | 4 GB | 4 GB |
Large | 224,482 | 32 | 64 | 100 | 280 | 0.017 秒 | 0.028 秒 | 8 GB | 8 GB |
XL | 500,000 | 24 | 56 | 100 | 360 | 0.055 秒 | 0.135 秒 | 13 GB | 16 GB |
2XL | 1,000,000 | 24 | 56 | 250 | 560 | 0.036 秒 | 0.058 秒 | 32 GB | 32 GB |
4XL | 1,000,000 | 24 | 56 | 250 | 950 | 0.021 秒 | 0.033 秒 | 39 GB | 64 GB |
8XL | 1,000,000 | 24 | 56 | 250 | 1650 | 0.016 秒 | 0.023 秒 | 40 GB | 128 GB |
12XL | 1,000,000 | 24 | 56 | 250 | 1900 | 0.015 秒 | 0.021 秒 | 38 GB | 192 GB |
16XL | 1,000,000 | 24 | 56 | 250 | 2200 | 0.015 秒 | 0.020 秒 | 40 GB | 256 GB |
基准测试的准确率为 0.99。
通过增加 m
和 ef_construction
可以进一步提升 QPS。这将允许您使用更小的 ef_search
值从而提高 QPS。例如,对于 4XL 规格,将 m
增加到 32 并将 ef_construction
增加到 80 可使 QPS 提升至 1280。
如果内存允许(例如 4XL 及以上规格的 OpenAI 嵌入),可以向单个表上传更多向量。但这会影响查询性能:QPS 会降低,延迟会增加。扩展应接近线性关系,但建议对您的工作负载进行基准测试,以找到每个表和每个数据库实例的最佳向量数量。
IVFFlat 索引
(注:IVFFlat 是 Inverted File with Flat Compression 的缩写,是一种用于向量相似性搜索的索引方法。在中文技术文档中通常保留原名不翻译,但可以在首次出现时添加说明)
IVFFlat 是一种基于聚类的近似最近邻(ANN)搜索算法,通过将向量空间划分为多个聚类单元来加速搜索。它通过以下两个阶段工作:
- 训练阶段:使用 k-means 算法将向量空间划分为
nlist
个聚类中心 - 搜索阶段:只搜索距离查询向量最近的
nprobe
个聚类中的向量
这种索引方法在搜索精度和性能之间提供了良好的平衡,特别适合中等维度的向量数据(通常维度在100-1000之间)。
384 维向量
该基准测试使用 dbpedia-entities-openai-1M 数据集,包含 1,000,000 个文本嵌入向量,专门针对 384 维向量重新生成。每个嵌入向量均使用 gte-small 模型生成。
计算规格 | 向量数量 | 列表数 | 探测数 | QPS | 平均延迟 | p95延迟 | 内存使用量 | 内存 |
---|---|---|---|---|---|---|---|---|
Micro | 100,000 | 500 | 50 | 205 | 0.048 秒 | 0.066 秒 | 1.2 GB (交换) | 1 GB |
Small | 250,000 | 1000 | 60 | 160 | 0.062 秒 | 0.079 秒 | 2 GB | 2 GB |
Medium | 500,000 | 2000 | 80 | 120 | 0.082 秒 | 0.104 秒 | 3.2 GB | 4 GB |
Large | 1,000,000 | 5000 | 150 | 75 | 0.269 秒 | 0.375 秒 | 6.5 GB | 8 GB |
XL | 1,000,000 | 5000 | 150 | 150 | 0.131 秒 | 0.178 秒 | 9 GB | 16 GB |
2XL | 1,000,000 | 5000 | 150 | 300 | 0.066 秒 | 0.099 秒 | 10 GB | 32 GB |
4XL | 1,000,000 | 5000 | 150 | 570 | 0.035 秒 | 0.046 秒 | 10 GB | 64 GB |
8XL | 1,000,000 | 5000 | 150 | 1400 | 0.023 秒 | 0.028 秒 | 12 GB | 128 GB |
12XL | 1,000,000 | 5000 | 150 | 1550 | 0.030 秒 | 0.039 秒 | 12 GB | 192 GB |
16XL | 1,000,000 | 5000 | 150 | 1800 | 0.030 秒 | 0.039 秒 | 16 GB | 256 GB |
960 维向量基准测试
该基准测试使用 gist-960 数据集,其中包含 1,000,000 个图像嵌入向量。每个嵌入向量为 960 维。
计算规格 | 向量数量 | 列表数 | QPS | 平均延迟 | P95 延迟 | 内存使用量 | 内存 |
---|---|---|---|---|---|---|---|
微型 | 30,000 | 30 | 75 | 0.065 秒 | 0.088 秒 | 1.1 GB (交换) | 1 GB |
小型 | 100,000 | 100 | 78 | 0.064 秒 | 0.092 秒 | 1.8 GB | 2 GB |
中型 | 250,000 | 250 | 58 | 0.085 秒 | 0.129 秒 | 3.2 GB | 4 GB |
大型 | 500,000 | 500 | 55 | 0.088 秒 | 0.140 秒 | 5 GB | 8 GB |
超大 | 1,000,000 | 1000 | 110 | 0.046 秒 | 0.070 秒 | 14 GB | 16 GB |
2倍超大 | 1,000,000 | 1000 | 235 | 0.083 秒 | 0.136 秒 | 10 GB | 32 GB |
4倍超大 | 1,000,000 | 1000 | 420 | 0.071 秒 | 0.106 秒 | 11 GB | 64 GB |
8倍超大 | 1,000,000 | 1000 | 815 | 0.072 秒 | 0.106 秒 | 13 GB | 128 GB |
12倍超大 | 1,000,000 | 1000 | 1150 | 0.052 秒 | 0.078 秒 | 15.5 GB | 192 GB |
16倍超大 | 1,000,000 | 1000 | 1345 | 0.072 秒 | 0.106 秒 | 17.5 GB | 256 GB |
1536 维向量
本基准测试使用 dbpedia-entities-openai-1M 数据集,其中包含 1,000,000 个文本嵌入向量。每个嵌入向量是通过 OpenAI 嵌入 API 生成的 1536 维向量。
计算规格 | 向量数量 | 列表数 | QPS | 平均延迟 | P95延迟 | 内存使用量 | 内存 |
---|---|---|---|---|---|---|---|
微型 | 20,000 | 40 | 135 | 0.372 秒 | 0.412 秒 | 1.2 GB (交换) | 1 GB |
小型 | 50,000 | 100 | 140 | 0.357 秒 | 0.398 秒 | 1.8 GB | 2 GB |
中型 | 100,000 | 200 | 130 | 0.383 秒 | 0.446 秒 | 3.7 GB | 4 GB |
大型 | 250,000 | 500 | 130 | 0.378 秒 | 0.434 秒 | 7 GB | 8 GB |
超大 | 500,000 | 1000 | 235 | 0.213 秒 | 0.271 秒 | 13.5 GB | 16 GB |
2XL | 1,000,000 | 2000 | 380 | 0.133 秒 | 0.236 秒 | 30 GB | 32 GB |
4XL | 1,000,000 | 2000 | 720 | 0.068 秒 | 0.120 秒 | 35 GB | 64 GB |
8XL | 1,000,000 | 2000 | 1250 | 0.039 秒 | 0.066 秒 | 38 GB | 128 GB |
12XL | 1,000,000 | 2000 | 1600 | 0.030 秒 | 0.052 秒 | 41 GB | 192 GB |
16XL | 1,000,000 | 2000 | 1790 | 0.029 秒 | 0.051 秒 | 45 GB | 256 GB |
对于 1,000,000 个向量,10 次探测的准确率为 0.91。而对于 500,000 及以下数量的向量,10 次探测的准确率在 0.95-0.99 之间。要提高准确率,需要增加探测次数。
如果内存允许(例如对于 OpenAI 嵌入向量使用 4XL 及以上规格),可以向单个表上传更多向量。但这会影响查询性能:QPS 会降低,延迟会升高。扩展性几乎是线性的,但建议对您的工作负载进行基准测试,以找到每个表和每个数据库实例的最佳向量数量。
性能优化技巧
有多种方法可以提升您的 pgvector 性能。以下是一些实用建议:
数据库预热
在生产环境上线前执行数千次"预热"查询非常有用。这有助于优化内存利用率,同时也能帮助确认您为工作负载选择了合适的计算规格。
微调索引参数
您可以通过增加 m
、ef_construction
或 lists
参数来提高每秒请求数。但需要注意一个重要事项:这些参数值越高,构建索引所需的时间就越长。
更多技巧和完整的分步指南,请参阅AI应用生产环境部署指南。
基准测试方法
我们遵循ANN Benchmarks方法中概述的技术。Python测试运行器负责上传数据、创建索引和执行查询。pgvector引擎使用vecs实现,这是一个用于pgvector的Python客户端。
每个测试至少运行30-40分钟。测试包含在不同并发级别下执行的一系列实验,以测量引擎在不同负载类型下的性能表现。最终结果取平均值。
作为通用建议,我们推荐对大多数工作负载使用5或更高的并发级别,对高负载工作负载使用30或更高的并发级别。