ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ANN 索引如何生成 truth set 并在内存模式下基准测试 recall?

ANN 索引如何生成 truth set 并在内存模式下基准测试 recall? ANN 索引如何生成 truth set 并在内存模式下基准测试 recall【免费下载链接】the-algorithmSource code for the X Recommendation Algorithm项目地址: https://gitcode.com/GitHub_Trending/th/the-algorithmthe-algorithm仓库中的ann模块提供了一个 loadtest 框架可以在不依赖远端查询服务的情况下直接在内存中构建 HNSW 索引并用真实查询集跑负载测试从而对 recall 做基准测试。前提是手里要有三份数据index_set被索引的数据、query_set查询数据和truth_setquery 到 index 的真实最近邻作为计算 recall 的基准并且要确认自己 embedding 向量的维度。本文按 loadtest README 的流程先讲如何用KnnTruthSetGenerator从一份 embedding 数据生成这三份集合再讲如何用loadtest_typelocal的 Aurora 任务完成内存模式基准测试。用 KnnTruthSetGenerator 生成 index_set / query_set / truth_set生成逻辑由 KnnTruthSetGenerator 实现它读取 query 和 index 两份 embedding按采样比例切分计算每个 query 在 index 中的最近邻最终写出三个 tab 格式的数据集。文档给出的完整命令如下其中role、$USER等值需替换为你自己的 HDFS 路径和 Aurora role$ ./bazel bundle ann/src/main/scala/com/twitter/ann/scalding/offline:ann-offline-deploy $ export QUERY_EMBEDDINGS_PATH/user/cortex-mlx/official_examples/ann/non_pii_random_user_embeddings_tab_format $ export INDEX_EMBEDDINGS_PATH/user/cortex-mlx/official_examples/ann/non_pii_random_user_embeddings_tab_format $ export TRUTH_SET_PATH/user/$USER/truth_set $ export INDEX_SET_PATH/user/$USER/index_set $ export QUERY_SET_PATH/user/$USER/query_set $ export METRICInnerProduct $ export QUERY_ENTITY_KINDuser $ export INDEX_ENTITY_KINDuser $ export NEIGHBOURS10 $ oscar hdfs \ --screen --tee log.txt \ --hadoop-client-memory 6000 \ --hadoop-properties yarn.app.mapreduce.am.resource.mb6000;yarn.app.mapreduce.am.command-opts-Xmx7500m;mapreduce.map.memory.mb7500;mapreduce.reduce.java.opts-Xmx6000m;mapreduce.reduce.memory.mb7500;mapred.task.timeout36000000; \ --bundle ann-offline-deploy \ --min-split-size 284217728 \ --host hadoopnest1.smf1.twitter.com \ --tool com.twitter.ann.scalding.offline.KnnTruthSetGenerator -- \ --neighbors $NEIGHBOURS \ --metric $METRIC \ --query_entity_kind $QUERY_ENTITY_KIND \ --query.embedding_path $QUERY_EMBEDDINGS_PATH \ --query.embedding_format tab \ --query_sample_percent 50.0 \ --index_entity_kind $INDEX_ENTITY_KIND \ --index.embedding_path $INDEX_EMBEDDINGS_PATH \ --index.embedding_format tab \ --index_sample_percent 90.0 \ --query_set_output.embedding_path $QUERY_SET_PATH \ --query_set_output.embedding_format tab \ --index_set_output.embedding_path $INDEX_SET_PATH \ --index_set_output.embedding_format tab \ --truth_set_output_path $TRUTH_SET_PATH \ --reducers 100各参数的用途与文档给出的调整依据--neighbors每个 query 计算多少个最近邻作为 truth对应后续 loadtest 里期望的候选数量。--metric最近邻计算所用的距离度量必须与后面 loadtest 使用的度量保持一致可选 InnerProduct/Cosine/L2。--query_sample_percent/--index_sample_percent从总数据中采样的百分比。示例中用 50.0 和 90.0 是因为示例数据集本身很小文档明确说明真实场景下 query set 应该尽量小所以比例要按自己的数据量调整。--reducers文档建议根据 embeddings 数据集大小来设置。输入/输出格式均为tab。生成完成后HDFS 上会得到三份 tab 格式目录可直接作为下一步 loadtest 的index_set_dir、query_set_dir、truth_set_dir使用。以 local内存模式运行 loadtest 基准测试内存模式下索引在 loadtest 进程内构建不再需要远端查询服务。测试运行的是 packer 中已有的live版本 loadtest binary如果要从源码构建AnnLoadTestMain 顶部注释给出了./bazel bundle ann/src/main/scala/com/twitter/ann/service/loadtest:bin --bundle-jvm-archivezip加packer add_version的方式。文档给出的示例脚本$ aurora job create smf1/role/staging/ann-loadtest ann/src/main/aurora/loadtest/loadtest.aurora \ --bindprofile.nameann-loadtest \ --bindprofile.rolerole \ --bindprofile.duration_sec10 \ --bindprofile.truth_set_dirhdfs:///user/cortex/ann_example/dataset/search/query_knn/true_knn \ --bindprofile.query_set_dirhdfs:///user/cortex/ann_example/dataset/search/query_knn/query_set \ --bindprofile.index_set_dirhdfs:///user/cortex/ann_example/dataset/search/query_knn/index_set \ --bindprofile.number_of_neighbors10 \ --bindprofile.qps200 \ --bindprofile.algohnsw \ --bindprofile.query_id_typestring \ --bindprofile.index_id_typestring \ --bindprofile.metricCosine \ --bindprofile.hnsw_ef_construction15 \ --bindprofile.hnsw_max_m10 \ --bindprofile.hnsw_ef400,600,800 \ --bindprofile.embedding_dimension100 \ --bindprofile.concurrency_level8 \ --bindprofile.loadtest_typelocal替换与核对要点role替换为你的 Aurora role三个*_set_dir指向你上一步生成的 HDFS 目录示例值为文档中的示例数据集。loadtest_typelocal是内存模式的关键loadtest 会从index_set_dir读取 embedding 并在内存中建索引因此index_set_dir必填。algohnsw时hnsw_ef_construction和hnsw_max_m必须为正数源码里有断言它们控制建图参数hnsw_ef传一个列表示例400,600,800loadtest 会对每个 ef 值分别跑查询用于观察查询参数对结果的影响。number_of_neighbors要与生成 truth set 时的--neighbors对应示例都是 10。embedding_dimension必须等于数据中向量的真实维度。query_id_type/index_id_type支持 long/string/int 以及 entity kinduser/tweet/word/url 等要与你数据集中 id 的形态一致。metric要与建索引和 truth set 生成时的度量一致示例这里用 Cosine。duration_sec、qps、concurrency_level分别控制单次测试时长、目标 QPS 和并发度。查看与判断结果loadtest 结束后结果打印到 Aurora 任务的 stdout。按 LoadTestUtils 中printResults的实现输出包含两段Build results表头为indexingTimeSecs toQueryableTimeMs indexSize反映内存建索引的耗时与索引大小Query results针对每个查询参数组合如上例的三个 ef 值 × neighbor 数输出一行统计。拿到 stdout 后对照不同hnsw_ef取值下的查询统计即可评估该索引配置下的 recall 与性能表现。限制与常见问题truth set 文件格式为 TSV每行是id neighbor:distance neighbor:distance ...loadtest 会按:截出 index idtruth set 目录不能为空否则任务直接断言失败。开启with_random_queriesTrue随机 embedding 压测模式时不能同时使用 truth set源码中有显式断言该模式只适用于 remote 压测不能用于 recall 基准。文档中的remote模式带service_destination和仅用query_set的压测是另两种用途不要与 local 模式的 recall 基准混在同一条流程里。本文只覆盖内存中临时建索引并测 recall若要构建并落盘一个可复用的序列化索引属于另一条路径见 index builder 文档。【免费下载链接】the-algorithmSource code for the X Recommendation Algorithm项目地址: https://gitcode.com/GitHub_Trending/th/the-algorithm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进