本文为您介绍聚类分片的测试结论及测试过程。

测试结论

Proxima CE在不同的数据集上,针对不同的采样率、聚类中心点个数以及索引分片个数,观察聚类分片方式的召回情况与耗时情况,经测试验证Proxima CE聚类分片的正确性测试符合预期。以下是几条经验准则:
  • 聚类中心点个数与召回呈正相关,中心点越多召回越高。
  • 中心点访问率与召回呈正相关,访问率越高召回越高。
  • 索引分片个数与召回呈负相关,分片越多召回越低。
  • 耗时符合常识:中心点越多、分片越多、中心点访问率越高,耗时越高。
  • 聚类分片对于top1友好,即不同的访问率、中心点个数以及分片个数,top1都比较精确。

测试过程

数据量:2000万, 数据类型:FLOAT,维度:512

采样率50,1000个聚类,建10片索引。
中心点访问率实际访问索引分片数TopK分别为1、50、100、200时对应的召回率
0.17.30
  • 1: 0.999
  • 50: 0.9992400000000005
  • 100: 0.9987400000000008
  • 200: 0.9974424999999909
0.056.35
  • 1: 0.999
  • 50: 0.998660000000001
  • 100: 0.9979400000000015
  • 200: 0.9963449999999905
0.024.72
  • 1 : 0.997
  • 50 : 0.9924600000000039
  • 100 : 0.9912400000000047
  • 200 : 0.9889074999999895
0.013.49
  • 1: 0.992
  • 50: 0.9773200000000073
  • 100: 0.9742900000000084
  • 200: 0.9696999999999908
0.0011
  • 1 : 0.762
  • 50 : 0.7010600000000025
  • 100 : 0.6882600000000016
  • 200 : 0.676167499999999
中心点访问率为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.03114.28
    • 1: 0.9995
    • 50: 0.9992600000000001
    • 100: 0.9993500000000002
    • 200: 0.9991800000000003
    0.0287.05
    • 1: 0.9995
    • 50: 0.9923800000000012
    • 100: 0.9921900000000013
    • 200: 0.9900700000000019
    0.0153.01
    • 1: 0.9995
    • 50: 0.9330400000000014
    • 100: 0.9219700000000022
    • 200: 0.9062475000000048
    0.00531.18
    • 1: 0.9995
    • 50: 0.7870400000000013
    • 100: 0.7560500000000001
    • 200: 0.7274675000000013
    0.0018.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.0361.93
    • 1: 1.0
    • 50: 0.9999199999999999
    • 100: 1.0
    • 200: 1.0
    0.0251.43
    • 1: 1.0
    • 50: 0.99986
    • 100: 1.0
    • 200: 0.999985
    0.0135.59
    • 1: 1.0
    • 50: 0.9960400000000004
    • 100: 0.9961900000000005
    • 200: 0.9942699999999994
    0.00523.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.114.26
    • 1: 1.0
    • 50: 0.9828800000000085
    • 100: 0.9801000000000099
    • 200: 0.9586999999999933
    0.028.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都比较精确。