本文为您介绍聚类分片的测试结论及测试过程。
测试结论
Proxima CE在不同的数据集上,针对不同的采样率、聚类中心点个数以及索引分片个数,观察聚类分片方式的召回情况与耗时情况,经测试验证Proxima CE聚类分片的正确性测试符合预期。以下是几条经验准则:
- 聚类中心点个数与召回呈正相关,中心点越多召回越高。
- 中心点访问率与召回呈正相关,访问率越高召回越高。
- 索引分片个数与召回呈负相关,分片越多召回越低。
- 耗时符合常识:中心点越多、分片越多、中心点访问率越高,耗时越高。
- 聚类分片对于top1友好,即不同的访问率、中心点个数以及分片个数,top1都比较精确。
测试过程
数据量:2000万, 数据类型:FLOAT,维度:512
采样率50,1000个聚类,建10片索引。
中心点访问率 | 实际访问索引分片数 | TopK分别为1、50、100、200时对应的召回率 |
---|---|---|
0.1 | 7.30 |
|
0.05 | 6.35 |
|
0.02 | 4.72 |
|
0.01 | 3.49 |
|
0.001 | 1 |
|
中心点访问率为0.1时耗时如下:
向量检索 数据类型:4 , 向量维度:512 , 检索方式:hnsw , 计算方法:SquaredEuclidean , 构建模式:build:seek:recall
doc表信息 表名: doc_table_pailitao , 分区:20210707 , doc数量:19990000 , 向量分隔符:
query表信息 表名: query_table_pailitao , 分区:20210707 , query数量:100000 , 向量分隔符:
输出表信息 表名: output_table_pailitao_cluster_2000w , 分区:20210707
行列信息 行数: 10 , 列数:10 , 每列索引doc数量:1999000
是否清除Volume索引:false
各个worker的耗时(单位:秒):
SegmentationWorker: 7
TmpTableWorker: 1
KmeansGraphWorker: 2419
BuildJobWorker: 9927
SeekJobWorker: 1026
TmpResultJoinWorker: 0
RecallWorker: 1675
CleanUpWorker: 4
总耗时(单位:分钟):250
运行命令
jar -resources kmeans_center_resource_cl,proxima_ce_pailitao.jar
-classpath /data/jiliang.ljl/project/proxima2-java/proxima-ce/target/pailitao proxima-ce-0.1-SNAPSHOT-jar-with-dependencies.jar com.alibaba.proxima2.ce.ProximaCERunner
-doc_table doc_table_pailitao
-doc_table_partition 20210707
-query_table query_table_pailitao
-query_table_partition 20210707
-output_table output_table_pailitao_cluster_2000w
-output_table_partition 20210707
-data_type float
-dimension 512
-app_id 201220
-vector_separator blank
-pk_type int64
-row_num 10
-column_num 10
-clean_build_volume false
-job_mode build:seek:recall
-topk 1,50,100,200
-sharding_mode cluster
-kmeans_resource_name kmeans_center_resource_cl
-kmeans_ratio 50
-kmeans_cluster_num 1000;
数据量:1亿,数据类型:BINARY,维度:512
- 采样率30,10000个聚类,建400片索引。
中心点访问率 实际访问索引分片数 召回 0.03 114.28 - 1: 0.9995
- 50: 0.9992600000000001
- 100: 0.9993500000000002
- 200: 0.9991800000000003
0.02 87.05 - 1: 0.9995
- 50: 0.9923800000000012
- 100: 0.9921900000000013
- 200: 0.9900700000000019
0.01 53.01 - 1: 0.9995
- 50: 0.9330400000000014
- 100: 0.9219700000000022
- 200: 0.9062475000000048
0.005 31.18 - 1: 0.9995
- 50: 0.7870400000000013
- 100: 0.7560500000000001
- 200: 0.7274675000000013
0.001 8.23 - 1: 0.9995
- 50: 0.4029200000000014
- 100: 0.3572000000000005
- 200: 0.32333000000000034
中心点访问率为0.001时耗时如下:向量检索 数据类型:1 , 向量维度:512 , 检索方式:hnsw , 计算方法:Hamming , 构建模式:build:seek:recall doc表信息 表名: doc_table_pailitao_binary3 , 分区:20210712 , doc数量:100000000 , 向量分隔符:~ query表信息 表名: query_table_pailitao_binary3 , 分区:20210712 , query数量:1010000 , 向量分隔符:~ 输出表信息 表名: output_table_pailitao_binary_cluster_10000_0_001 , 分区:20210712 行列信息 行数: 20 , 列数:400 , 每列索引doc数量:250000 是否清除Volume索引:false 各个worker的耗时(单位:秒): SegmentationWorker: 10 TmpTableWorker: 1 KmeansGraphWorker: 38636 BuildJobWorker: 1085 SeekJobWorker: 1845 TmpResultJoinWorker: 0 RecallWorker: 939 CleanUpWorker: 4 总耗时(单位:分钟):708 运行命令 jar -resources kmeans_center_resource_cl_binary2,proxima_ce_g2.jar -classpath /data/jiliang.ljl/project/proxima2-java/proxima-ce/target/binary2/proxima-ce-0.1-SNAPSHOT-jar-with-dependencies.jar com.alibaba.proxima2.ce.ProximaCERunner -doc_table doc_table_pailitao_binary3 -doc_table_partition 20210712 -query_table query_table_pailitao_binary3 -query_table_partition 20210712 -output_table output_table_pailitao_binary_cluster_10000_0_001 -output_table_partition 20210712 -data_type binary -dimension 512 -app_id 201220 -pk_type int64 -clean_build_volume false -distance_method Hamming -binary_to_int true -row_num 20 -column_num 400 -sharding_mode cluster -kmeans_resource_name kmeans_center_resource_cl_binary2 -kmeans_ratio 30 -job_mode build:seek:recall -topk 1,50,100,200 -kmeans_cluster_num 10000 -kmeans_seek_ratio 0.001;
结果分析:对于聚类中心点个数与分片个数固定的情况下,中心点访问率越高,实际索引分片被访问的越多,召回率越高,同时耗时也越高。
- 采样率50,10000个聚类,建100片索引。
中心点访问率 实际访问索引分片数 召回 0.03 61.93 - 1: 1.0
- 50: 0.9999199999999999
- 100: 1.0
- 200: 1.0
0.02 51.43 - 1: 1.0
- 50: 0.99986
- 100: 1.0
- 200: 0.999985
0.01 35.59 - 1: 1.0
- 50: 0.9960400000000004
- 100: 0.9961900000000005
- 200: 0.9942699999999994
0.005 23.26 - 1: 1.0
- 50: 0.9493600000000024
- 100: 0.9429200000000031
- 200: 0.9308524999999989
中心点访问率为0.03时耗时如下:向量检索 数据类型:1 , 向量维度:512 , 检索方式:hnsw , 计算方法:Hamming , 构建模式:build:seek:recall doc表信息 表名: doc_table_pailitao_binary3 , 分区:20210712 , doc数量:100000000 , 向量分隔符:~ query表信息 表名: query_table_pailitao_binary3 , 分区:20210712_10w , query数量:100000 , 向量分隔符:~ 输出表信息 表名: output_table_pailitao_binary_cluster_10000_100_0_03 , 分区:20210712 行列信息 行数: 10 , 列数:100 , 每列索引doc数量:1000000 是否清除Volume索引:false 各个worker的耗时(单位:秒): SegmentationWorker: 10 TmpTableWorker: 1 KmeansGraphWorker: 23760 BuildJobWorker: 1510 SeekJobWorker: 556 TmpResultJoinWorker: 0 RecallWorker: 787 CleanUpWorker: 4 总耗时(单位:分钟):443 运行命令 jar -resources kmeans_center_resource_cl_binary,proxima_ce_g.jar -classpath /data/jiliang.ljl/project/proxima2-java/proxima-ce/target/binary/proxima-ce-0.1-SNAPSHOT-jar-with-dependencies.jar com.alibaba.proxima2.ce.ProximaCERunner -doc_table doc_table_pailitao_binary3 -doc_table_partition 20210712 -query_table query_table_pailitao_binary3 -query_table_partition 20210712_10w -output_table output_table_pailitao_binary_cluster_10000_100_0_03 -output_table_partition 20210712 -data_type binary -dimension 512 -app_id 201220 -pk_type int64 -clean_build_volume false -distance_method Hamming -binary_to_int true -row_num 10 -column_num 100 -sharding_mode cluster -kmeans_resource_name kmeans_center_resource_cl_binary -kmeans_ratio 50 -job_mode build:seek:recall -topk 1,50,100,200 -kmeans_cluster_num 10000 -kmeans_seek_ratio 0.03;
- 采样率100,1000个聚类,建20片索引。
中心点访问率 实际访问索引分片数 召回 0.1 14.26 - 1: 1.0
- 50: 0.9828800000000085
- 100: 0.9801000000000099
- 200: 0.9586999999999933
0.02 8.43 - 1: 1.0
- 50: 0.7897500000000025
- 100: 0.7759649999999999
- 200: 0.7622724999999989
中心点访问率为0.02时,耗时如下:向量检索 数据类型:1 , 向量维度:512 , 检索方式:hnsw , 计算方法:Hamming , 构建模式:build:seek:recall doc表信息 表名: doc_table_pailitao_binary2 , 分区:20210712 , doc数量:100000000 , 向量分隔符:~ query表信息 表名: query_table_pailitao_binary2 , 分区:20210712 , query数量:1000000 , 向量分隔符:~ 输出表信息 表名: output_table_pailitao_binary_cluster_1000 , 分区:20210712 行列信息 行数: 10 , 列数:20 , 每列索引doc数量:5000000 是否清除Volume索引:false 各个worker的耗时(单位:秒): SegmentationWorker: 2 TmpTableWorker: 1 KmeansGraphWorker: 4996 BuildJobWorker: 8727 SeekJobWorker: 1425 TmpResultJoinWorker: 0 RecallWorker: 857 CleanUpWorker: 4 总耗时(单位:分钟):266 运行命令 jar -resources kmeans_center_resource_cl_binary,proxima_ce_g.jar -classpath /data/jiliang.ljl/project/proxima2-java/proxima-ce/target/binary/proxima-ce-0.1-SNAPSHOT-jar-with-dependencies.jar com.alibaba.proxima2.ce.ProximaCERunner -doc_table doc_table_pailitao_binary2 -doc_table_partition 20210712 -query_table query_table_pailitao_binary2 -query_table_partition 20210712 -output_table output_table_pailitao_binary_cluster_1000 -output_table_partition 20210712 -data_type binary -dimension 512 -app_id 201220 -pk_type int64 -clean_build_volume false -distance_method Hamming -binary_to_int true -row_num 10 -column_num 20 -sharding_mode cluster -kmeans_resource_name kmeans_center_resource_cl_binary -kmeans_ratio 100 -job_mode build:seek:recall -topk 1,50,100,200 -kmeans_cluster_num 1000 -kmeans_seek_ratio 0.02;
结果分析:经过上述三组对比,我们可以得到如下结论:
- 聚类中心点个数与召回呈正相关,中心点越多召回越高。
- 中心点访问率与召回呈正相关,访问率越高召回越高。
- 索引分片个数与召回呈负相关,分片越多召回越低。
- 耗时符合常识:中心点越多、分片越多、中心点访问率越高,耗时越高。
- 聚类分片对于top1友好,即不同的访问率、中心点个数以及分片个数,top1都比较精确。