
ANN 查询服务如何用 loadtest 工具跑随机 embedding 的固定 QPS 在线压测【免费下载链接】the-algorithmSource code for the X Recommendation Algorithm项目地址: https://gitcode.com/GitHub_Trending/th/the-algorithm在 the-algorithm 仓库的ann模块中有一个专门的 loadtest 工具可以对部署好的 ANN 查询服务做在线压测。本文的场景是你不想先准备一份真实的 query embedding 数据集而是让 loadtest 工具自动生成随机 embedding 作为查询然后以固定的目标 QPS 持续打向一个远端 ANN 查询服务loadtest_typeremote测量它在指定时长内各运行时参数下的延迟和吞吐表现。完整示例来自 ann loadtest README压测入口实现在 AnnLoadTestMain随机查询生成逻辑在 LoadTestUtils。前提条件有一个已在运行的远端 ANN 查询服务并且知道它的 wily 地址README 中service_destination绑定项对应的就是 wily address of remote query service。压测通过aurora job create提交到集群smf1使用的是 README 给出的ann/src/main/aurora/loadtest/loadtest.aurora配置示例命令中的smf1集群名与 aurora 配置文件路径按 README 原文保留。压测二进制使用 packer 中已有的live版本 loadtest binary无需自己构建AnnLoadTestMain 源码注释中给出了自行构建上传的方式./bazel bundle ann/src/main/scala/com/twitter/ann/service/loadtest:bin --bundle-jvm-archivezip后packer add_version仅在你需要改动 loadtest 代码时参考。随机查询模式下不需要 HDFS 上的query_set目录也不需要 truth set查询全部由工具在启动时生成。创建 aurora 压测任务按 README 的随机 embedding 示例用如下命令创建压测 job。命令中role是占位符需要替换为你自己的 role 名service_destination的示例值指向 README 作者的测试服务必须替换成你自己 ANN 查询服务的 wily 地址其余绑定值可按需调整$ aurora job create smf1/role/staging/ann-loadtest-service ann/src/main/aurora/loadtest/loadtest.aurora \ --bindprofile.nameann-loadtest-service \ --bindprofile.rolerole \ --bindprofile.duration_sec10 \ --bindprofile.number_of_neighbors10 \ --bindprofile.qps200 \ --bindprofile.algohnsw \ --bindprofile.metricCosine \ --bindprofile.index_id_typeint \ --bindprofile.hnsw_ef400,600,800 \ --bindprofile.embedding_dimension3 \ --bindprofile.concurrency_level8 \ --bindprofile.loadtest_typeremote \ --bindprofile.service_destination/srv#/staging/local/apoorvs/ann-server-test \ --bindprofile.with_random_queriesTrue \ --bindprofile.random_queries_count50000 \ --bindprofile.random_embedding_min_value-10.0 \ --bindprofile.random_embedding_max_value10.0关键参数说明这些绑定项最终都会映射到 AnnLoadTestMain 中定义的 flag按下表对照修改绑定项示例值说明qps200目标 QPS即压测每秒向服务发出的查询数duration_sec10每一组运行时参数压测持续的时间秒number_of_neighbors10每次查询取回的邻居数必填未设置会断言失败algohnsw被测索引算法代码中支持annoy、hnsw、faisshnsw_ef400,600,800HNSW 查询参数 ef传列表会对每组值各跑一轮压测即网格搜索选hnsw时必传metricCosine距离度量支持Cosine/L2/InnerProductindex_id_typeint索引 id 类型支持string/int/long及实体类型user/tweet/word/url等见 README FAQ 对 EntityKind 的说明embedding_dimension3embedding 维度必须与被测服务索引的维度一致且大于 0concurrency_level8同一时刻对服务的最大并发请求数默认 8loadtest_typeremoteremote表示打压远端服务local是在内存中构建索引做基准测试不在本文场景内service_destination/srv#/staging/local/apoorvs/ann-server-test远端 ANN 查询服务的 wily 地址remote模式下必填with_random_queriesTrue开启随机 embedding 查询random_queries_count50000生成的随机查询总数默认 50000random_embedding_min_value/random_embedding_max_value-10.0/10.0每个随机 embedding 分量的取值上下界不传时默认-1.0和1.0工具会在启动时按embedding_dimension和random_queries_count生成查询每个分量的值均匀落在 min/max 之间上下界相等的配置会被断言拒绝。这些查询在压测期间被循环复用worker 按index % queries.size轮转取查询见 AnnLoadTestWorker 的runWithQps。如何定 qps 与 concurrency_levelQPS 和并发是两个相互制约的旋钮源码注释明确指出了这一点如果concurrency_level设得不够高可能达不到qps设定的目标 QPS反过来如果qps设得不够高也可能达不到concurrency_level设定的并发数。也就是说两者要按被测服务的预期延迟配套设置单调其中一个参数不保证另一个指标生效。qps是压测的上限速率worker 通过AsyncMeter.perSecond(qps, concurrencyLevel)限流发压。查看压测结果README 说明Load test results will be printed to stdout of an aurora job。任务结束后AnnLoadTestMain 会向 stdout 依次打印三行运行参数汇总Target QPS: qps、Duration per test: duration_sec、Concurrency Level: concurrency_levelBuild results段表头为indexingTimeSecs toQueryableTimeMs indexSizeQuery results段表头为params numNeighbors recall1 recall10 recall avgLatencyMicros p50LatencyMicros p90LatencyMicros p99LatencyMicros avgRPS每一行对应一组运行时参数例如示例中hnsw_ef的400,600,800会各产出一行便于横向比较不同 ef 下的延迟与 RPS。注意边界随机查询模式下工具断言truth_set_dir必须为空即随机查询和 truth set 不能同时使用——随机 embedding 没有真实最近邻因此 recall 相关列在本文场景中不用于评估召回质量要看 recall 需要走 query_set truth_set 的基准测试路径那是 README 中另外两个独立场景不在本文范围内。可选分支对 faiss 参数做网格搜索如果远端服务用 faiss 算法README 给出了一组额外的参数绑定示例在随机查询命令的基础上替换algo相关项--bindprofile.algofaiss \ --bindprofile.faiss_nprobe1,3,9,27,81,128,256,512 \ --bindprofile.faiss_quantizerKfactorRF1,2 \ --bindprofile.faiss_quantizerNprobe128 \这些列表型参数同样会各跑一轮用于网格搜索。README 列出的 faiss 可绑定参数全集为faiss_nprobe、faiss_quantizerEf、faiss_quantizerKfactorRF、faiss_quantizerNprobe、faiss_ht默认值见 README 代码块。限制与排查按 AnnLoadTestMain 中的断言逻辑以下配置会直接让任务启动失败可在报错信息中对照检查number_of_neighbors未设置或为空number_of_neighbors not definedembedding_dimension小于等于 0Invalid dimensionalgohnsw但未传hnsw_efMust specify efalgoannoy但未传annoy_num_of_nodes_to_exploreMust specify the num_of_nodes_to_exploreloadtest_typeremote但未传service_destinationService destination not definedwith_random_queriesTrue时同时给了 truth set 目录Cannot use truth set when query with random embeddings enabled。压测过程中单条查询失败会记录为Failed query for $query: 异常的 error 日志汇总结果仍会打印到 stdout。【免费下载链接】the-algorithmSource code for the X Recommendation Algorithm项目地址: https://gitcode.com/GitHub_Trending/th/the-algorithm创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考