ONNX Runtime 性能测试工具 onnxruntime_perf_test 实战指南:从命令行参数到底层测量实现
ONNX Runtime 性能测试工具 onnxruntime_perf_test 实战指南从命令行参数到底层测量实现【免费下载链接】onnxruntimeONNX Runtime: cross-platform, high performance ML inferencing and training accelerator项目地址: https://gitcode.com/GitHub_Trending/on/onnxruntimeonnxruntime_perf_test是 ONNX Runtime 自带的推理性能基准工具用于在指定执行设备CPU、CUDA、TensorRT、OpenVINO 等上用真实模型和样例输入数据测量推理延迟与资源占用。读完本文你将掌握它的完整命令行参数、模型与测试数据的目录约定、两种测试模式按时长 / 按次数与并发压测的底层实现以及如何解读输出中的 P50~P999 分位数统计从而在目标设备上获得可靠的推理延迟数据。工具概览与基本调用方式性能测试工具的使用格式为onnxruntime_perf_test [options...] model_path result_file其中model_path是模型文件路径result_file可选用于将结果追加写入 CSV 文件。工具会调用 ONNX Runtime 在当前设备上跑推理并在退出前打印平均耗时、每秒推理次数、平均 CPU 占用和峰值工作集大小等汇总信息见 main.cc 中的RunPerfTest流程。模型路径与输入数据依赖性能测试使用与onnx_test_runner相同的输入结构要求如下目录树--ModelName --test_data_set_0 --input0.pb --test_data_set_2 --input0.pb --model.onnxmodel.onnx的路径作为model_path参数传入。源码中 performance_runner.cc 的Initialize()会读取模型所在目录名作为测试用例名逐个加载test_data_set_*下的输入张量如果没有任何测试数据会直接提示there is no test data for model ...并退出。此外还支持.ort格式模型见 CreateModelInfo并可通过-I选项随机生成输入从而摆脱对测试数据目录的依赖。工具的 README 位于 onnxruntime/test/perftest/README.md。命令行选项详解测试模式与运行时长控制选项说明-m测试模式duration固定时长运行或times固定次数重复默认duration-rtimes模式下的重复次数默认 1000-tduration模式下运行的秒数默认 600-c允许同时发起的最大并发运行数默认 1-v显示详细verbose信息每轮迭代打印提交耗时与总耗时-h打印帮助-m在源码中对应枚举TestMode::kFixDurationMode/KFixRepeatedTimesMode见 test_configuration.h。一个容易忽略的细节从 command_args_parser.cc 看显式传入-r会自动切换到times模式显式传入-t会自动切换到duration模式两者与-m的取值会相互联动。执行设备EP与 EP 专属运行时选项选项说明-e指定执行设备。README 中列出cpu、cuda、mkldnn、tensorrt、openvino、acl、vitisai默认cpu-i指定 EP 专属运行时选项键值对形式-e provider -i key1\|value1 key2\|value2需要注意的是当前源码command_args_parser.cc 中-e的定义与 第 337-379 行 的解析分支支持的 EP 列表比 README 更宽包括cpu、cuda、dnnl、tensorrt、nvtensorrtrtx、openvino、dml、acl、nnapi、coreml、qnn、snpe、migraphx、xnnpack、vitisai、webgpu等。-i选项为不同 EP 提供了大量运行时配置键。源码中的帮助文本command_args_parser.cc按 EP 分组列出了可用键例如TensorRTtrt_fp16_enable、trt_int8_enable、trt_int8_calibration_table_name、trt_max_workspace_size、trt_engine_cache_enable/trt_engine_cache_path、trt_context_memory_sharing_enable等OpenVINOdevice_type、device_id、num_of_threads、cache_dir、reshape_input支持min..max动态维度语法等QNNbackend_type、backend_path、htp_performance_mode、vtcm_mb等DMLperformance_preference、device_filter等NNAPINNAPI_FLAG_USE_FP16、NNAPI_FLAG_CPU_ONLY等这类键无值直接以键名启用CoreMLModelFormat、MLComputeUnits等。README 给出的 TensorRT 示例-e tensorrt -i trt_fp16_enable|true trt_int8_enable|true trt_int8_calibration_table_name|calibration.flatbuffers trt_int8_use_native_calibration_table|false trt_force_sequential_engine_build|false优化与模型保存选项说明-o图优化级别0禁用、1basic、2extended、3layout、99all完整定义见onnxruntime_c_api.h中的枚举GraphOptimizationLevel-u保存优化后模型的路径默认为空即不保存-p指定 profile 文件名启用 profiling 并把 profile 数据转储到该文件注意一个文档与代码的差异README 声称-o默认值为 1而当前源码的默认值是 99ORT_ENABLE_ALL——command_args_parser.cc 的帮助文本写明 Default is 99 (all)test_configuration.h 中optimization_level{ORT_ENABLE_ALL}。以当前仓库源码为准默认启用全部优化。配合-u还有三个补充选项--opt_data权重另存数据文件路径、--opt_weight_min_size写入该文件的最小 initializer 字节数、--opt_save_prepacks连同 prepack 一起保存见 command_args_parser.cc 的解析逻辑。线程与执行器控制选项说明-x节点内intra-op并行线程数0 表示由 ORT 自动选择必须 0-y图级inter-op跨节点并行线程数0 表示自动选择必须 0-P使用并行执行器parallel executor替代顺序执行器-T指定 intra-op 线程亲和性字符串内存行为控制选项说明-A禁用 memory arenaCPU 内存竞技场-M禁用 memory pattern内存模式优化这两个开关在会话创建时的落地位置见 ort_test_session.cc-A对应session_options.DisableCpuMemArena()-M对应DisableMemPattern()且源码中有一个条件限制——内存模式仅在顺序执行模式下才真正启用enable_memory_pattern execution_mode ORT_SEQUENTIAL因此使用-P并行执行器时-M事实上已不生效。默认情况下两者都是开启的test_configuration.h。对 CUDA 用户还有两个配套选项--enable_cuda_mempool pool_release_threshold;bytes_to_keep_on_shrink启用CudaMempoolArena--shrink_arena_between_runs cpu:0;gpu:0在每轮运行间对指定设备调用 arena 收缩对应 run options 配置键kOrtRunOptionsConfigEnableMemoryArenaShrinkagecommand_args_parser.cc。会话与运行配置、统计输出选项说明-C以键值对形式指定会话配置项-C key1\|val1 key2\|val2。合法键值参见onnxruntime_session_options_config_keys.h-s显示 P75、P90 等统计结果不提供 result_file 时默认开启-R通过.so/.dll注册自定义算子库README 给出的-C示例-C session.disable_cpu_ep_fallback|1 ep.context_enable|1解析入口在 command_args_parser.cc 的ParseSessionConfigs解析失败会打印Error parsing session configuration entries并返回错误。源码中已支持、README 尚未列出的选项除 README 中的选项外当前源码还定义了若干实用开关完整列表见 command_args_parser.cc 的 ABSL 标志定义运行onnxruntime_perf_test --help可查看全部选项说明-f按名称覆盖 free dimension 的取值-f dim_name:value可重复指定用于固定动态维度做性能优化测量-F按 denotation 覆盖 free dimension-I生成随机张量输入替代测试数据文件free dimension 按 1 处理可用-f覆盖-S随机数种子默认 -1 不初始化保证可复现的输入数据-dcuDNN 卷积算法0benchmark、1heuristic、2default-n会话创建完成后即退出用于单独测量会话创建初始化优化耗时--hold_ms_after_session_creation与-n配合创建完成后保持进程存活指定毫秒并打印SESSION_READY便于多进程内存测量-l以二进制文件方式在内存中加载模型-qCUDA 下使用独立 stream 做数据拷贝-z将非规格化浮点数denormal置零可显著降低延迟模型含 denormal 时注意精度影响-D/-Z完全禁用 intra-op 线程池 spinning / 禁用运行间的 spinning 以降低 CPU 占用--spin_duration_us、--spin_backoff_max微调 spinning 策略时间窗口、指数退避上限-gTensorRT RTX / TensorRT / CUDA 下启用张量输入输出绑定IO binding--data_shape单会话内多形状压测--data_shape input:[1,3,224,224][1,3,448,448]模型只编译一次各形状组轮询执行并输出每个形状组的独立统计--plugin_ep_libs/--plugin_eps/--plugin_ep_options注册并使用插件执行设备plugin EP--list_ep_devices/--select_ep_devices/--filter_ep_devices枚举、筛选并指定 EP 设备--compile_ep_context/--compile_model_path/--compile_binary_embed/--compile_only先编译 EP context 模型再对其进行性能测试测试模式与并发的底层实现duration与times两种模式的执行循环在 performance_runner.cc 中固定时长RunFixDurationwhile (total_time_cost duration_in_seconds)逐轮迭代即实际跑满累计推理时间而非墙钟时间固定次数RunRepeatedTimes循环repeated_times次。当-c 1时进入并发路径时长模式的RunParallelDurationperformance_runner.cc基于 Eigen 线程池持续投递任务保证任意时刻有-c个推理在途直到累计时长达标次数模式的ForkJoinRepeatperformance_runner.cc创建恰好concurrent_session_runs个线程共享一个repeated_times计数器分抢迭代。每轮迭代通过RunOneIteration采集两段时间submit_timing提交耗时与total_timing端到端总耗时前者在启用 CUDA IO binding 时才有独立意义设备异步执行时两者差异明显代码注释说明若测试非异步运行设备耗时将等于 CPU 耗时performance_runner.h。预热、会话创建耗时与结果统计每次正式压测前工具会先做一轮预热多形状模式下每个形状组各预热一次预热结果不计入统计只用于计算 First inference time costperformance_runner.cc。会话创建耗时也在构造PerformanceRunner时打点压测结束统一输出。正式输出performance_runner.cc形如Session creation time cost: X s First inference time cost: X ms Total inference time cost: 58.8053 s Total inference requests: 1000 Average inference time cost total: 58.8053 ms Total inference run time: 58.8102 s Number of inferences per second: 16 Avg CPU usage: N % Peak working set size: N bytes这与 README 中的示例输出Total time cost / Total iterations / Min/Max/P50/P90/P95/P99/P999 Latency对应后者由-s触发的分位数统计打印。分位数计算见 DumpToFile对每次迭代的总耗时排序后取 P50/P90/P95/P99/P999 索引同时打印到 stdout 与结果文件。关于结果文件README 说明其用途是保存结果源码行为是提供了result_file时按model_name,时间成本,峰值工作集,平均CPU占用,迭代序号的 CSV 格式追加写入并把分位数统计也写入文件未提供result_file时即命令行只有模型路径统计默认开启并打印到 stdoutcommand_args_parser.cc 中positional.size() 2分支自动置f_dump_statistics true。--data_shape模式下还会额外输出每个形状组的迭代数、平均/最小/最大/P50~P99 延迟performance_runner.cc。实用命令组合示例基于上述参数几个典型的测量场景# CPU 上固定 100 次迭代输出 P50~P999 统计 onnxruntime_perf_test -m times -r 100 -s ./ModelName/model.onnx # CUDA 上按 60 秒时长压测启用 TensorRT FP16 子图 onnxruntime_perf_test -e cuda -t 60 ./ModelName/model.onnx # TensorRT EP 会话配置结果写入 CSV onnxruntime_perf_test -e tensorrt \ -i trt_fp16_enable|true \ -C session.disable_cpu_ep_fallback|1 \ -s ./ModelName/model.onnx result.csv # 无测试数据目录时随机生成输入压测固定 batch 维度 onnxruntime_perf_test -I -f batch:8 -m times -r 500 ./ModelName/model.onnx # 仅测量会话创建耗时评估图优化/预打包等初始化开销 onnxruntime_perf_test -n ./ModelName/model.onnx小结onnxruntime_perf_test把选 EP、调线程、开关 arena/内存模式、固定动态维度、并发压测、分位数统计这些性能评估中最常调的旋钮都暴露成了命令行参数并通过-C、-i两个转接口覆盖各 EP 的运行时配置其源码位于 onnxruntime/test/perftest/参数解析、执行循环、统计输出分别集中在 command_args_parser.cc、performance_runner.cc 与会话构建所在的 ort_test_session.cc 中。需要说明的是README 与源码存在少量不同步之处如-e支持的 EP 列表、-o的默认值实际使用以--help输出和当前仓库源码为准。【免费下载链接】onnxruntimeONNX Runtime: cross-platform, high performance ML inferencing and training accelerator项目地址: https://gitcode.com/GitHub_Trending/on/onnxruntime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考