恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
MNN 基准测试实战:从 2019 年 Android 真机数据看 benchmark.out 工具链与 CPU/Vulkan 后端对比方法
首页
资讯中心
/
MNN 基准测试实战:从 2019 年 Android 真机数据看 benchmark.out 工具链与 CPU/Vulkan 后端对比方法
MNN 基准测试实战:从 2019 年 Android 真机数据看 benchmark.out 工具链与 CPU/Vulkan 后端对比方法
发布时间:2026/9/14 9:03:28
MNN 基准测试实战从 2019 年 Android 真机数据看 benchmark.out 工具链与 CPU/Vulkan 后端对比方法【免费下载链接】MNNMNN: A blazing-fast, lightweight inference engine battle-tested by Alibaba, powering high-performance on-device LLMs and Edge AI.项目地址: https://gitcode.com/GitHub_Trending/mn/MNN本文以 MNN 仓库benchmark/result/目录中 2019-02-18 的两份真机基准测试记录华为 P10 与小米 Max3为主体完整还原当年 MNN benchmark 工具的测试方法构建标志含义、benchmark.out命令行参数、warmup/loop 机制、CPU 与 Vulkan 后端的实测耗时数据及其分析。读完后你将掌握一套可在任意 Android 设备上复现 MNN 推理性能评测的完整流程并能正确解读max/min/avg三类耗时指标。一、这份基准结果记录了什么仓库中 benchmark/result/2019-2-18.md 是一份 2019 年 2 月 18 日在两款 Android 旗舰机上运行 MNN 基准测试的原始输出存档覆盖华为 P10HUAWEI P10CPU 后端与 Vulkan 后端两组数据小米 Max3MI Max3Qualcomm SDM636CPU 后端与 Vulkan 后端两组数据。每组数据均在相同构建配置下测得构建标志为Build Flags: ABIarm64-v8a OpenMPON VulkanON OpenCLON测试模型共 6 个经典 CNN全部以.mnn格式存放在 benchmark/models 目录中vgg16.mnn、SqueezeNetV1.0.mnn、MobileNetV2_224.mnn、inception-v3.mnn、resnet-v2-50.mnn、mobilenet-v1-1.0.mnn。每组运行loop 10次取耗时统计。该记录是 MNN 早期同一模型、同一构建CPU vs GPUVulkan对比评测方法的代表样本后续仓库中的 benchmark/result/2019-5-7.md、benchmark/result/2019-6-17.md、benchmark/result/2020-3-22.md 沿用了同一套方法并逐步扩展设备与后端。二、benchmark.out 工具数据来源与工作原理这份记录由仓库的benchmark.out可执行程序产生其源码位于 benchmark/benchmark.cpp由 benchmark/CMakeLists.txt 中的add_executable(benchmark.out ...)目标构建。要编译出该工具需要打开顶层 CMakeLists.txt 中的开关默认关闭option(MNN_BUILD_BENCHMARK Build benchmark or not OFF)工具的核心流程对应doBench()函数见 benchmark/benchmark.cpp用findModelFiles()扫描模型目录下所有.mnn文件非 Windows 平台直接opendir遍历通过Interpreter::createFromBuffer加载模型并按ScheduleConfig创建 Session其中numThread默认 4 线程、precision默认 2、power固定为Power_High调用net-releaseModel()释放模型权重内存使计时只反映运行时开销先执行 warmup 轮源码默认 10 轮让 GPU/CPU 时钟爬升、shader 编译完成再执行 loop 轮正式计时每轮用MNN::Timer包住runSession并同步 map/unmap 输出张量以等待结果落地对 loop 轮耗时求max/min/avg由displayStats()打印为记录中的标准格式[ - ] vgg16.mnn max 499.545ms min 410.570ms avg 445.868ms命令行接口非 iOS 平台main见 benchmark/benchmark.cppUsage: benchmark.out models_folder [loop_count] [warmup] [forwardtype] [numberThread] [precision] [weightSparsity] [testQuantizedModel] [enableKleidiAI]参数说明参数默认值含义models_folder必填.mnn模型所在目录loop_count10正式计时轮数warmup10预热轮数forwardtype0后端类型枚举值numberThread4CPU 线程数precision2精度模式precision2 时在 ARM82 设备上启用 fp16 推理weightSparsity0.0权重量化稀疏度testQuantizedModel0是否为量化模型测试开启时自动 sparsity0enableKleidiAI0是否启用 KleidiAI其中forwardtype取值来自 include/MNN/MNNForwardType.h0CPU、1Metal、2CUDA、3OpenCL、6OpenGL、7Vulkan。2019-02-18 这份记录中CPU 组用的是默认值 0Vulkan 组传的是 7。注意2019 年的输出行只有Forward type: CPU/Vulkan与loop 10当前仓库版本的输出还会附带thread... precision... sparsity... enableKleidiAI...等信息且新增了稀疏度、量化模型、KleidiAI 参数。若在新设备上复测输出格式会略有差异但max/min/avg统计口径不变。三、在 Android 设备上复现这份测试仓库提供了两条现成的自动化路径。3.1 benchmark/android/bench_android.sh本文记录所用方式benchmark/android/bench_android.sh 正是产出这份 2019-02-18 记录的脚本其工作流用 NDK 工具链交叉编译关键 CMake 参数cmake ../../../ \ -DCMAKE_TOOLCHAIN_FILE$ANDROID_NDK/build/cmake/android.toolchain.cmake \ -DCMAKE_BUILD_TYPERelease \ -DANDROID_ABIarm64-v8a \ -DANDROID_STLc_static \ -DANDROID_NATIVE_API_LEVELandroid-21 \ -DMNN_USE_LOGCAT:BOOLOFF \ -DMNN_VULKAN:BOOLON \ -DMNN_OPENCL:BOOLON \ -DMNN_OPENMP:BOOLON \ -DMNN_OPENGL:BOOLOFF \ -DMNN_ARM82:BOOLON \ -DMNN_BUILD_BENCHMARK:BOOLON \ -DMNN_BUILD_FOR_ANDROID_COMMANDtrue \ -DNATIVE_LIBRARY_OUTPUT. make -j8 benchmark.out timeProfile.outadb push推送.so库、benchmark.out与模型目录到设备/data/local/tmp依次运行三组测试并把/proc/cpuinfo、Build Flags一并写入设备端benchmark.txt# CPUforwardtype0默认值可省略 benchmark.out /data/local/tmp/benchmark_models 10 5 0 # Vulkanforwardtype7 benchmark.out /data/local/tmp/benchmark_models 10 5 7 # OpenCLforwardtype3 benchmark.out /data/local/tmp/benchmark_models 100 20 3adb pull benchmark.txt取回结果。脚本支持三个选项-32改编 armeabi-v7a、-c清理 build 目录、-p推送本地../models模型目录。脚本内默认RUN_LOOP10、FORWARD_TYPE0与记录中loop 10一致。3.2 benchmark/scripts/bench.sh多框架对比框架benchmark/scripts/bench.sh 是更通用的评测脚本除 MNN 外还支持 PyTorch Mobile 与 TFLite 同机横评--mnn --torch --tf并提供--sync-adb把工具与模型推送到设备、--pc在本机跑./MNN/build/benchmark.out models/mnn 10 5 0 1等组合。其 MNN Android 部分同样按benchmark.out models loop10 warmup5 forwardtype thread1的口径调用其中forwardtype3对应 OpenCL 组、追加precision2参数对应 fp16armv8.2组。四、2019-02-18 实测数据全量整理以下数据完整摘自 benchmark/result/2019-2-18.md单位为 msloop10 的 avg。4.1 华为 P10HUAWEI P10构建标志ABIarm64-v8a OpenMPON VulkanON OpenCLON模型CPU maxCPU minCPU avgVulkan maxVulkan minVulkan avgVulkan 相对 CPU avgvgg16.mnn499.545410.570445.868293.156227.952240.050约 1.86 倍加速SqueezeNetV1.0.mnn49.43738.75943.90147.75231.19137.727约 1.16 倍加速MobileNetV2_224.mnn26.13920.40024.48961.35235.87446.321变慢约 0.53 倍inception-v3.mnn413.265262.142306.542396.939180.353349.952变慢约 0.88 倍resnet-v2-50.mnn240.009152.649176.075214.694100.377169.003约 1.04 倍加速mobilenet-v1-1.0.mnn89.46129.90341.54745.94623.25733.217约 1.25 倍加速4.2 小米 Max3MI Max3Qualcomm SDM636构建标志同上ABIarm64-v8a OpenMPON VulkanON OpenCLON模型CPU maxCPU minCPU avgVulkan maxVulkan minVulkan avgVulkan 相对 CPU avgvgg16.mnn1311.6611248.5311255.455783.093730.928736.894约 1.70 倍加速SqueezeNetV1.0.mnn151.95595.348101.98696.43561.80965.574约 1.56 倍加速MobileNetV2_224.mnn94.33650.98758.29971.10743.91246.925约 1.24 倍加速inception-v3.mnn763.095690.005698.674436.363386.338391.818约 1.78 倍加速resnet-v2-50.mnn453.710389.649396.409303.728262.706267.613约 1.48 倍加速mobilenet-v1-1.0.mnn128.78177.02383.13489.11956.21659.725约 1.39 倍加速五、数据解读这份记录说明了什么1. 大模型上 GPU 后端收益明显。在两台设备上vgg16 用 Vulkan 均比 CPU 快约 1.71.9 倍小米 Max3 上全部 6 个模型 Vulkan 均快于 CPU加速比 1.241.78 倍。计算量越大的模型GPU 后端相对多线程 CPU 的优势越明显。2. 轻模型上 GPU 后端未必占优。华为 P10 上MobileNetV2 这类小模型走 Vulkan 反而比 CPU 慢avg 46.3ms vs 24.5msinception-v3 也略有回退。这说明该时期 Vulkan 路径存在固定的 kernel 启动/同步开销对推理时长本身就很短的轻量网络会拉低平均收益。这类现象提示轻量模型选型时应以真机实测为准而非默认GPU 一定更快。3. 同档 SoC 的绝对性能差距可观。同为旗舰定位小米 Max3SDM636的 vgg16 CPU avg1255ms约为华为 P10446ms的 2.8 倍说明单核/多核 CPU 微架构差异对 CPU 推理影响巨大而两者 Vulkan avg 分别为 737ms 与 240msGPU 差距约 3 倍。跨设备性能不可直接类比评测必须绑定具体硬件。4. 波动幅度反映调度稳定性。max/min 比值可视为抖动指标P10 CPU 下 vgg16 的 max/min 约 1.22小米 Max3 下约 1.05说明前者测试期间存在更明显的降频或系统调度干扰。这也是 benchmark 工具同时打印 max/min/avg 的原因——只看 avg 会掩盖长尾延迟。5. 该测试未统计输入输出拷贝与预处理。从源码看计时窗口覆盖runSession及输出的 map/unmap 同步但未包含ImageProcess预处理、模型加载releaseModel后权重仍在内存中等开销因此数据只适用于横向比较纯推理性能不能直接换算为端到端帧率。六、适用前提与复测建议本文数据基于 2019-02-18 的构建配置arm64-v8a、OpenMP/Vulkan/OpenCL 均开启、MNN_ARM82ON与当时的 benchmark 工具版本模型文件即当前 benchmark/models 目录中的对应.mnn文件复测时注意当前工具默认warmup10而bench_android.sh脚本显式传入warmup5两者输出一致脚本以 5 为准OpenCL 组脚本使用loop100 warmup20以获得更稳的统计若在同一设备上比较新旧版本 MNN 或新旧后端应保持同一构建、同一模型目录、同一 loop/warmup 参数否则Build Flags行差异会使数据不可比。这套构建 → 推送 → 分后端跑 loop → 记录 Build Flags 与 cpuinfo → 汇总 max/min/avg的方法是 MNN 后续所有真机性能记录见 benchmark/result 目录的通用范式也是评估任意移动设备 NPU/GPU/CPU 推理能力的可复制实践。【免费下载链接】MNNMNN: A blazing-fast, lightweight inference engine battle-tested by Alibaba, powering high-performance on-device LLMs and Edge AI.项目地址: https://gitcode.com/GitHub_Trending/mn/MNN创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考