选购向量检索版实例前,通过规格计算器可获取推荐的查询节点和数据节点配置。本文还提供了 HNSW 和 IVF_SQ8 算法在不同数据规模下的 Benchmark 数据,作为规格选型的性能参考。
使用规格计算器
在向量检索版购买页面,单击规格计算器。
打开OpenSearch向量检索版规格计算器对话框,包含基础情况、向量数据情况和查询情况三个配置区域,填写完成后单击进行运算获取推荐规格。
基础情况
实例所在区域:需要创建引擎的区域。
是否有容灾需求:是否需要容灾,可下拉选择有或无。
向量数据情况
向量数据条数:写入引擎的向量数据条数。
向量维度:写入引擎的向量维度。
向量算法:根据需求选择,目前支持以下三种算法。
HNSW:基于图的向量检索算法,召回率极高且性能好,内存及存储占用与 Linear 相当,在低维度和高维度向量数据集上均有很好的表现,适用于大多数向量检索场景。
QC:基于量化聚类的向量检索算法,召回结果正确率极高,占用资源较少,性能较好。在低维度向量数据集上有更好表现,内存及存储占用一般只有 Linear 和 HNSW 的 1/4,适用于对召回率没有严苛要求的大数据量检索场景。
Linear:线性检索(暴力检索),召回结果完全正确,但占用资源多且性能较差,通常适用于小数据集(1 万条数据量以内)的精确检索。
查询情况
平均 QPS:接入引擎的流量 QPS。
期望搜索平均响应时间:期望的召回结果平均耗时,单位可选 s 或 ms。
填写完成后,单击进行运算。
推荐结果包括查询节点规格族、查询节点数量、查询节点规格、数据节点规格族、数据节点数量、数据节点规格以及单数据节点存储空间/磁盘空间等参数,根据推荐结果购买对应规格的资源。
HNSW Benchmark 数据
以下测试数据基于公开数据集,使用引擎版本 vector_service 1.5.9,采用 1 个查询节点 + 1 个云盘型数据节点的配置组合。建图参数:M = 100,ef-construction = 500。
数据集 | 规格 | 参数 | recall@k(串行) | P95 延迟(串行) | 峰值 QPS(并发) | 峰值并发 | 查询节点 CPU/Mem | 数据节点 CPU/Mem | 索引内存占用 |
OpenAI 1536D 50K | 2C8G 查询节点 + 2C16G 数据节点 | ef=20, k=10 | 0.9793 | 20ms | 643 | 10 | 89%/12% | 61%/10% | 311MB |
ef=200, k=100 | 0.9991 | — | — | — | — | — | |||
4C16G 查询节点 + 4C32G 数据节点 | ef=20, k=10 | 0.9805 | 27ms | 1035 | 20 | 99%/7% | 38%/18% | ||
ef=200, k=100 | 0.9989 | 35ms | 744 | 20 | 88%/7% | 88%/18% | |||
Cohere 768D 1M | 4C16G 查询节点 + 4C32G 数据节点 | ef=20, k=10 | 0.9560 | 18ms | 1413 | 20 | 96%/7% | 48%/18% | 3.13GB |
ef=200, k=100 | 0.9919 | 131ms | 745 | 80 | 68%/7% | 91%/18% | |||
4C16G 查询节点 + 8C64G 数据节点 | ef=20, k=10 | 0.9598 | 26ms | 1601 | 30 | 99%/8% | 29%/8% | ||
ef=200, k=100 | 0.9921 | 25ms | 1527 | 30 | 97%/7% | 93%/8% | |||
Cohere 768D 10M | 8C32G 查询节点 + 8C64G 数据节点 | ef=20, k=10 | 0.9429 | 24ms | 1534 | 30 | 70%/3% | 95%/55% | 33GB |
ef=200, k=100 | 0.9552 | 55ms | 662 | 30 | 40%/5% | 95%/55% |
数据节点内存水位与性能的关系
以下测试使用 Cohere 768D 数据集,搭配 4C16G 查询节点 + 4C32G 云盘型数据节点,索引结构为 HNSW(InnerProduct,ef-construction = 500,M = 100)。通过分步插入数据(每次 1M 条)观察内存水位对 QPS 的影响。
数据量 | 索引内存占用 | 进程内存使用率 | QPS(k=10, ef=20) | QPS(k=100, ef=200) |
2M | 6.3GB | 26.6% | 1368 | 647 |
4M | 12.5GB | 47.8% | 1324 | 378 |
5M | 15.6GB | 59.2% | 1068 | 334 |
6M | 18.8GB | 69% | 1112 | 341 |
7M | 21.8GB | 80% | 几乎不可用 | |
8M | — | — | — | — |
典型配置会将向量索引、PK 索引和倒排索引以 mlock 方式锁定在物理内存中,以获得最低的检索延迟。其他数据(attribute、summary 等)不做 mlock,依赖 OS page cache 按需加载。当内存水位上升,page cache 被压缩,读取 attribute 时频繁触发缺页中断,导致延迟上升:
水位 > 70%:QPS 急剧下降。
水位 > 80%:服务近乎不可用。
IVF_SQ8 Benchmark 数据
以下测试使用 Cohere 768D 10M 数据集,搭配 4C16G 查询节点 + 4C32G 云盘型数据节点。
建图参数:
{
"proxima.qc.builder.quantizer_class": "Int8QuantizerConverter",
"proxima.qc.builder.quantize_by_centroid": true,
"proxima.qc.builder.optimizer_class": "BruteForceBuilder",
"proxima.qc.builder.thread_count": 10,
"proxima.qc.builder.optimizer_params": {
"proxima.linear.builder.column_major_order": true
},
"proxima.qc.builder.store_original_features": false,
"proxima.qc.builder.train_sample_count": 3000000,
"proxima.qc.builder.train_sample_ratio": 0.5
}串行测试:召回率和延迟
Scan ratio | 召回率 | 延迟(P99) | 延迟(P95) |
0.01 | 0.9123 | 39.5ms | 35.7ms |
0.05 | 0.9454 | 84ms | 75ms |
并发性能测试:分步插入
将 10M 条 768 维向量数据分步插入实例,观察不同数据量对应的索引大小和查询 QPS 的变化。
数据量 | 索引内存占用 | 内存使用率 | QPS(scan ratio 0.01, k=100) | QPS(scan ratio 0.05, k=100) |
1M | 2.25GB | 7.4% | 1000 | 558 |
2M | 3.11GB | 10.4% | 766 | 258 |
4M | 4.95GB | 16% | 408 | 122 |
10M | 9.9GB | 32.4% | 131 | 46 |