测试环境

测试资源 资源规格
AnalyticDB PostgreSQL
  • 引擎版本:6.0向量增强版
  • 节点规格:16C128G
  • 节点数量:4个
  • 存储空间:1000GB
ECS实例
  • 规格:32 核64GB
  • 存储空间:2TB

准备工作

  1. 下载开源数据集ANN_GIST1M或ANN_SIFT1B,下载链接:http://corpus-texmex.irisa.fr/。本文将以GIST数据集为例来介绍向量查询和融合查询的测试步骤。其中向量查询仅针对向量数据集,融合查询则包含结构化条件和向量数据集。
  2. 下载测试工具:测试工具

创建数据表和索引

使用如下SQL语句创建测试所需要的数据表和索引。

CREATE SCHEMA IF NOT EXISTS vec;

CREATE TABLE IF NOT EXISTS "vec"."vector_test_for_gist" (
        "id" bigint NOT NULL,
        "shot_time" timestamp,
        "device_id" bigint,
        "feature_data" "float4"[],
        PRIMARY KEY(id)
) DISTRIBUTED BY (id);

ALTER TABLE vec.vector_test_for_gist ALTER COLUMN shot_time SET STORAGE PLAIN;
ALTER TABLE vec.vector_test_for_gist ALTER COLUMN device_id SET STORAGE PLAIN;
ALTER TABLE vec.vector_test_for_gist ALTER COLUMN feature_data SET STORAGE PLAIN;

CREATE INDEX idx_vector_test_for_gist_device_id ON vec.vector_test_for_gist (device_id);
CREATE INDEX idx_vector_test_for_gist_shot_time ON vec.vector_test_for_gist (shot_time);

CREATE INDEX idx_vector_test_for_gist_feature_data ON vec.vector_test_for_gist USING ann(feature_data) WITH (dim=960,pq_segments=64,hnsw_m=16,external_storage=1);
在创建索引的时候可以参考下面的规则:
数据维度 是否存在删除修改操作 向量索引的参数选择
256 dim=256,pq_segments=16,hnsw_m=16
256 dim=256,pq_segments=16,hnsw_m=16,external_storage=1
512 dim=512,pq_segments=64,hnsw_m=64
512 dim=512,pq_segments=64,hnsw_m=64,external_storage=1
960 dim=960,pq_segments=64,hnsw_m=64
960 dim=960,pq_segments=64,hnsw_m=64,external_storage=1

准备测试数据

切换到测试脚本目录,执行以下命令:
  1. 生成表数据。
    python generateTableData.py -s gist -t fvecs -l 1000000 -i /home/greenplum/data/vector_data/gist/gist_base.fvecs -o /home/greenplum/data/vector_data/gist_data/table_data -n 100
  2. 导入表数据。
    说明 导入数据前需要修改configuration下面的dbconf文件,将数据库和表名修改为测试的数据库和表名称,导入数据时间过长,可以设置为后台运行。
    python insertTableData.py -n 10 -b 10 --file_path /home/greenplum/data/vector_data/gist_data/table_data --file_num 100
  3. 生成向量查询数据集。
    python generateQueryData.py -s gist -t fvecs -l 1000 -i /home/greenplum/data/vector_data/gist/gist_base.fvecs -o /home/greenplum/data/vector_data/gist_data/query_data
  4. 生成向量查询结果集。
    python generateGroundTruth.py --limit 1000 --input_file /home/greenplum/data/vector_data/gist_data/query_data/gist_query_data.txt --output_file /home/greenplum/data/vector_data/gist_data/groundtruth/groundtruth.txt --topk 10 
  5. 生成融合查询数据集。
    python generateQueryData.py -s gist -t fvecs -l 1000 -i /home/greenplum/data/vector_data/gist/gist_query.fvecs -o /home/greenplum/data/vector_data/gist_data/query_data --fusion
  6. 生成融合查询结果集。
    python generateGroundTruth.py --limit 1000 --input_file /home/greenplum/data/vector_data/gist_data/query_data/gist_fusion_query_data.txt --output_file /home/greenplum/data/vector_data/gist_data/groundtruth/fusion_groundtruth.txt --topk 10 --fusion 
    说明 结果集生成之后,需要将结果集文件拷贝到脚本的groundtruth目录中。

向量查询测试

标定召回参数
为了能使查询的召回率达到我们设定的目标(本次实验设置的召回率为95%),我们需要先进行召回测试,来标定向量查询需要设定的参数,再进行性能测试。
说明 参数标定位于配置文件parameterConf中,可以通过三个参数来调节召回率:fastann.hnsw_max_scan_points、fastann.hnsw_ef_search、fastann.pq_amp,以达到我们设定的目标召回率。其中主要调节fastann.hnsw_max_scan_points。
向量查询的召回测试:
python recallTest.py -n 10 --limit 1000 --input_file /home/greenplum/data/vector_data/gist_data/query_data/gist_query_data.txt --topk 10
性能测试
  1. QPS测试可以通过调节并发测试的进程数来压测极限性能。执行以下语句,进行向量查询的QPS测试:
    python qpsTest.py -n 1 --input_file /home/greenplum/data/vector_data/gist_data/query_data/gist_query_data.txt --topk 10
  2. RT测试主要是测试一次请求的往返时间,因此不需要进行并发测试。执行以下语句,进行向量查询的RT测试:
    python rtTest.py -n 1 --limit 1000 --input_file /home/greenplum/data/vector_data/gist_data/groundtruth/groundtruth.txt --topk 10

融合查询测试

标定召回参数
为了使查询的召回率达到我们设定的目标(本次实验设置的召回率为95%),我们需要先进行召回测试,来标定融合查询需要设定的参数,再进行性能测试。
说明
  • 在融合查询做召回测试之前需要先执行 analyze vec.vector_test_for_gist。
  • 参数标定位于配置文件parameterConf中,可以通过三个参数来调节召回率:fastann.hnsw_max_scan_points、fastann.hnsw_ef_search、fastann.pq_amp,以达到我们设定的目标召回率。其中主要调节fastann.hnsw_max_scan_points。
融合查询的召回测试:
python recallTest.py -n 10 --limit 1000 --input_file /home/greenplum/data/vector_data/gist_data/query_data/gist_fusion_query_data.txt --topk 10 --fusion
性能测试
  1. QPS测试可以通过调节并发测试的进程数来压测极限性能。执行以下语句,进行融合查询的QPS测试:
    python qpsTest.py -n 1 --input_file /home/greenplum/data/vector_data/gist_data/query_data/gist_fusion_query_data.txt --topk 10 --fusion
  2. RT测试主要是测试一次请求的往返时间,不需要进行并发测试。执行以下语句,进行融合查询的RT测试:
    python rtTest.py -n 1 --limit 1000 --input_file /home/greenplum/data/vector_data/gist_data/query_data/gist_fusion_query_data.txt --topk 10 --fusion

向量查询的测试报告

  • GIST数据集测试报告
    数据项 数据值
    数据集 960维 100万
    设定的TOPK 10
    设定的召回率 95%
    向量查询参数设置
    • fastann.hnsw_max_scan_points=140
    • fastann.hnsw_ef_search = 400
    • fastann.pq_amp=10
    向量查询平均RT(秒) 0.005
    向量查询QPS(单并发) 190
    向量查询最高QPS(30并发) 3500
  • SIFT数据集测试报告
    数据项 数据值
    数据集 128维 1亿
    设定的TOPK 10
    设定的召回率 95%
    向量查询参数设置
    • fastann.hnsw_max_scan_points=180
    • fastann.hnsw_ef_search = 400
    • fastann.pq_amp=1
    向量查询平均RT(秒) 0.002
    向量查询QPS(单并发) 415
    向量查询最高QPS(30并发) 5015
  • 某图片数据集测试报告
    数据项 数据值
    数据集 512维 1000万
    设定的TOPK 10
    设定的召回率 95%
    向量查询参数设置
    • fastann.hnsw_max_scan_points=30000
    • fastann.hnsw_ef_search=400
    • fastann.pq_amp=10
    向量查询平均RT(秒) 0.015
    向量查询QPS(单并发) 65
    向量查询最高QPS(30并发) 705

第三方数据集测试方法

第三方数据集和本文提供的测试方法相同,也可以使用上面的测试工具,仅需将第三方数据集转换成测试工具所需的格式即可。