ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

MNN 跨引擎推理基准测试实战:环境搭建、模型转换与 PC/Android/iOS 压测全流程指南

MNN 跨引擎推理基准测试实战:环境搭建、模型转换与 PC/Android/iOS 压测全流程指南 MNN 跨引擎推理基准测试实战环境搭建、模型转换与 PC/Android/iOS 压测全流程指南【免费下载链接】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/MNNMNN 在benchmark/scripts/下内置了一整套跨引擎基准测试流程用于在同一批模型上对比 MNN、PyTorch Mobiletorch lite与 TensorFlow Lite 的端侧/PC 推理性能。本文完整还原该文档benchmark/scripts/READMD.md中的环境要求、三步核心命令build.sh→convert.sh→bench.sh与全部 FAQ并结合仓库中的 build.sh、convert.sh、convert.py、bench.sh、bench_pc.py 和 benchmark.cpp 源码把每个参数背后的真实构建命令、模型转换链路与压测调用链讲透读完后你可以独立完成一次可复现的三引擎性能对比实验。一、这套基准测试体系在做什么从源码结构看MNN 的 benchmark 目录承担两类职责引擎内基准benchmark.cpp 提供benchmark.out遍历一个目录下的全部.mnn模型按指定 loop/warmup/forward 类型/线程数/精度逐模型跑分并输出 max/min/avg 耗时配套目录 benchmark/models/ 已内置 MobileNetV2、SqueezeNet、InceptionV3、NASNet、ResNetV2-50 等 8 个模型文件。跨引擎对比benchmark/scripts/下的三个脚本把 MNN、PyTorchMobile、TensorFlow Lite 对齐到同一组 ONNX 源模型上分别编译各自的压测工具、转换同一批模型再统一驱动推理并落盘结果。文档给出的三步工作流为Build bench tools./build.sh --pc|--android|--ios --mnn-tag 90719ce2 --torch-tag v1.11.0 --tf-tag v2.7.0Convert Models./convert.sh --mnn-tag 90719ce2 --torch-tag v1.11.0onnx → mnn / pb / tflite / torch / torchliteRun bench./bench.sh --pc|--android|--ios --mnn --torch --tf --sync-models --tooldir dist其中90719ce2、v1.11.0、v2.7.0是文档锁定的一组基线版本MNN commit、PyTorch tag、TensorFlow tag用于保证各引擎可比。二、环境前置条件完整继承原文档2.1 通用前置cmake 3.x2.2 macOS 限制文档明确列出三条 macOS 约束其成因均在 FAQ 中解释操作系统版本 12.3对应 FAQ Q1Bazel 的py_binary在新版系统上会回退到已被移除的/usr/bin/pythoncommand line tool 13.3对应 FAQ Q3PyTorch 在 13.3 下编译报section __TEXT/__const address out of rangeXcode 使用 Legacy Build System对应 FAQ Q4tflite 的 iOS fat framework 不兼容 New Build System2.3 Android 构建前置要求 Android SDK 与 NDK 版本低于 r22且必须设置ANDROID_SDK、ANDROID_NDK环境变量。FAQ Q2 解释了原因NDK r22 移除了旧工具链platforms目录会直接破坏 TFLite 的 bazel 编译。Linux 纯命令行方式原文档给出的安装脚本注意文档中附带的镜像切换说明链接因合规要求不在此贴出下载 NDK 时可自行寻找国内镜像apt install -y android-sdk ANDROID_SDK/usr/lib/android-sdk curl -LO https://dl.google.com/android/repository/android-ndk-r21-linux-x86_64.zip unzip android-ndk-r21-linux-x86_64.zip -d $ANDROID_SDK 1/dev/null echo -e \nexport ANDROID_SDK$ANDROID_SDK\nexport ANDROID_NDK$ANDROID_SDK/android-ndk-r21 ~/.bashrc其他平台安装 Android Studio在 SDK Manager 中下载 NDK 21.x。2.4 iOS 构建前置为避免滥用 root 权限安装 Ruby文档要求通过 rbenv 管理macOS 下brew install rbenv # avoid abuse root permission rbenv install 3.1.2 rbenv global 3.1.2 echo -e \nexport PATH\$HOME/.rbenv/bin:$PATH\\neval \$(rbenv init -)\ | tee -a ~/.bash_profile ~/.zshrcbench.sh在 iOS 分支中会执行gem install bundler xcodeproj因此 Ruby 环境是 iOS 压测的硬依赖。三、第一步用 build.sh 编译三个引擎的压测工具3.1 参数说明结合 build.sh 的usage()完整参数如下参数含义--compile强制重新编译 MNN / PyTorch / TF忽略已存在的 build 目录--pc/--android/--ios选择构建目标平台--mnn-tag TAGMNN 的 git tag/commit用于浅克隆对应版本并编译--torch-tag TAGPyTorch 的 git tag--tf-tag TAGTensorFlow 的 git tag脚本开头会pip install typing-extensions pyyaml numpy在 macOS 上若缺少realpath会自动brew install coreutils。产物统一收敛到benchmark/scripts/dist/下例如dist/android/MNN、dist/android/torch、dist/android/tflite。3.2 MNN 侧的真实构建命令PC 目标build.shcmake -DMNN_SEP_BUILDOFF -DMNN_BUILD_BENCHMARKON -DMNN_AVX512ON -DMNN_CUDAOFF .. make -j benchmark.outMNN_BUILD_BENCHMARKON即开启 benchmark/CMakeLists.txt 中benchmark.out的构建同时会链接tools/cpp/revertMNNModel.cpp以支持量化/稀疏模型回灌。Android 目标分别构建armeabi-v7abuild_32与arm64-v8abuild_64两份关键 CMake 参数为ANDROID_STLc_static、ANDROID_NATIVE_API_LEVELandroid-14、MNN_VULKAN/MNN_OPENCL/MNN_OPENMP/MNN_OPENGLON、MNN_BUILD_BENCHMARKBOOLON、MNN_BUILD_FOR_ANDROID_COMMANDtrue构建后把benchmark.out及全部.so拷入dist/android/MNN/arm32|arm64。3.3 PyTorch 与 TensorFlow 侧PyTorch Mobile浅克隆指定 tag 后用BUILD_PYTORCH_MOBILE1 ANDROID_ABIarmeabi-v7a|arm64-v8a ./scripts/build_android.sh -DBUILD_BINARYON构建取bin/speed_benchmark_torch到dist/android/torch/arm32|arm64。iOS 分支当前被if false显式关闭——build.sh 的注释说明原因iOS TestApp 即使空测试用例也报Unknown custom class type quantized.Conv2dPackedParamsBase。TensorFlow Lite用 bazel 构建tensorflow/lite/tools/benchmark:benchmark_model_plus_flex--configandroid_arm/--configandroid_arm64分别产出 arm32/arm64 二进制./configure时通过TF_NEED_ROCMfalse TF_NEED_CUDAfalse TF_SET_ANDROID_WORKSPACE TF_CONFIGURE_IOS ANDROID_SDK_HOME ANDROID_NDK_HOME完成交叉配置并用--discard_analysis_cache --notrack_incremental_state --nokeep_state_after_build避免 bazel OOM。iOS 目标则调用tensorflow/lite/tools/benchmark/ios/build_benchmark_framework.sh产出 TFLite Benchmark framework。3.4 使用注意脚本内 MNN 仓库地址从源码看当前 build.sh 与 convert.sh 中MNN_REPO均指向内部私有仓库gitlab.alibaba-inc.com的 AliNN 仓库公网用户运行前需要将其替换为公开发布的 alibaba/MNN 仓库地址否则git clone会失败。这是使用这套脚本必须首先处理的一处差异。四、第二步用 convert.sh 把 ONNX 统一转换为五种格式convert.sh --mnn-tag TAG --torch-tag TAG的执行链结合 convert.sh 与 convert.py克隆onnx-pytorch的feature/mobilenetv2_bert_support分支并 pip 安装用于 ONNX → PyTorch 代码生成pip install onnx_tf tensorflow2.7.0 tensorflow-probability0.15.0 onnx按--mnn-tag浅克隆 MNN若MNN/build_converter/MNNConvert不存在则执行cmake -DMNN_BUILD_CONVERTERON .. make -j编译转换器按--torch-tag浅克隆 PyTorchUSE_PYTORCH_METALON USE_VULKANON python setup.py install安装最终执行python convert.py --modeldir models。convert.py 会扫描models/onnx/下全部.onnx文件逐一产出以下目录结构目录格式说明models/mnn/.mnn调用MNNConvert -f ONNX --modelFile in.onnx --MNNModel out.mnn --bizCode MNNmodels/torch/.ptonnx_pytorch 代码生成 →torch.jit.script→optimize_for_mobileCPU 优化models/torch_lite/.ptl/_metal.ptloptimize_for_mobile后用_save_for_lite_interpreter导出另导出一份backendmetal的 iOS 优化版本models/pb/.pbonnx_tfprepare导出 SavedModel动态维度会被替换为 1 以规避 GPU 动态 shape bugmodels/tflite/.tfliteTFLiteConverter.from_saved_model开启Optimize.DEFAULTsupported_ops TFLITE_BUILTINS SELECT_TF_OPS注释指出 BERT 的 Cast/RealDiv 不是 tflite 内置算子需要 flex 算子集models/tflite/fp16/.tflite同一转换器以supported_types[tf.float16]再转一份 fp16 模型此外convert_tflite会把每个模型在 pb 与 tflite 两侧的输入张量名映射写入models/tflite/config.json含inputs/inner_inputs这正是 bench.sh 中tflite_compatible需要按名字对齐输入层的元数据来源——tflite 的图内部命名与原始 ONNX 输入名并不一致必须依赖这份映射才能构造--input_layer/--input_layer_shape参数。五、第三步用 bench.sh 统一驱动压测5.1 文档命令与当前脚本参数的差异文档中给出的运行命令为./bench.sh --pc --mnn --torch --tf --sync-models --tooldir dist # PC ./bench.sh --android --mnn --torch --tf --sync-models --tooldir dist # Android ./bench.sh --ios --mnn --torch --tf --sync-models --tooldir dist # iOS但从当前 bench.sh 的usage()看脚本实际接受的选项是Usage: bench.sh [--sync-adb] [--pc] [--android] [--ios] [--mnn] [--torch] [--tf] --sync-adb 同步测试模型与 benchmark 工具adb push dist 产物到设备即当前版本以--sync-adb承担同步模型与工具的职责文档中的--sync-models --tooldir dist参数在现脚本的getopts分支中会落入usage分支直接退出。实操时建议以脚本usage输出为准将命令写作./bench.sh --android --mnn --torch --tf --sync-adb。5.2 Android 端的执行细节源码印证--sync-adb触发后脚本把产物推送到设备固定目录bench.shdist/android/*→/data/local/tmpmodels/mnn/*.mnn→/data/local/tmp/MNN/modelsmodels/torch_lite/*.ptl→/data/local/tmp/torch/modelsmodels/tflite/*.tflite与fp16/*.tflite→/data/local/tmp/tflite/models[/fp16]随后各引擎的压测调用为引擎/维度实际命令结果文件MNN arm32 CPUbenchmark.out $MNN_HOME/models 10 5 0 1forward0 CPU1 线程result/mnn_android_arm32.txtMNN arm64 CPU同上arm64 目录result/mnn_android_arm64.txtMNN armv8.2 fp16benchmark.out ... 10 5 0 1 2precision2 启用 fp16result/mnn_android_fp16.txtMNN OpenCLbenchmark.out ... 10 5 3 1forward3 OpenCLresult/mnn_android_opencl.txtTorch arm32/arm64speed_benchmark_torch --modelx.ptl --input_dims... --input_type... --input_memory_formatcontiguous_formatresult/torch_android_arm32/64.txtTFLite arm32/arm64benchmark_model_plus_flex --graphx.tflite --input_layer... --input_layer_shape... --warmup_runs1 --num_runs20 --num_threads1result/tflite_android_arm32/64.txtTFLite fp16同上但 graph 指向models/fp16/result/tflite_android_fp16.txtTFLite GPU增加--use_gputrueresult/tflite_android_gpu.txtMNN 命令行中各位置参数的含义可直接对照 benchmark.cpp 的mainUsage: benchmark.out models_folder [loop_count] [warmup] [forwardtype] [numberThread] [precision] [weightSparsity] [testQuantizedModel] [enableKleidiAI]默认值loop10、warmup10、forwardCPU、numberThread4、precision2fp16前提是设备支持且编译开启MNN_ARM82ON见 benchmark.cpp 的提示逻辑。forwardtype的取值映射在 forwardType() 中可见0CPU、Vulkan、OpenCL、Metal。输入张量形状来自models/config.jsonbench_common用jq逐条解析model/input_layers/input_shapes/input_dtypes。注意 torch 分支会把int归一为int64bench.shtflite 分支则通过上文提到的config.json输入名映射对齐 shape 顺序。iOS 分支目前只生成参数文件bench_common tflite_gen_params为每个模型写出models/tflite/model_benchmark_params.jsonnum_threads1、num_runs20、warmup_runs1、run_delay-1供 TFLite Benchmark Xcode 工程加载运行。5.3 结果与历史数据bench.sh开头会rm -rf result mkdir result所有引擎输出按上述 txt 文件落盘。仓库中 benchmark/result/ 保留了 2019–2020 年的历史跑分记录如 2019-6-17.md可参考其表格形式记录自己的对比结果。六、PC 侧的 Python 压测bench_pc.pybench.sh的 PC 分支不走benchmark.outMNN 直接调用MNN/build/benchmark.out而是通过 bench_pc.py 驱动 torch/tf 的 Python APIpython bench_pc.py -f mnn --modeldir models --thread-num 1 --backend cpu python bench_pc.py -f torch --modeldir models --thread-num 1 --backend cpu # 或 cuda python bench_pc.py -f tf --modeldir models --thread-num 1 --backend cpu # 或 cuda参数约束源码 argparse 定义-f必选取mnn|tf|torch--modeldir必选--thread-num取值 1~4默认 1--loop-num默认 10--backend取cpu|cuda。实现上mnn生成input.json后调用MNN/build/ModuleBasic可执行文件Linux 无后缀、macOS 为.out、Windows 为.exe结果追加到result/mnn_pc_{backend}.txttftf.saved_model.load加载models/pb/*.pbserving_default推理统计 max/min/avg 毫秒torchtorch.jit.load加载 Mobile 优化模型并计时。注意 torch 分支在 bench.sh 中会先pip uninstall torch再pip install torch1.11.0避免误装 Metal 定制 wheeltf 分支会pip install tensorflow2.7.0——这与文档锁定的版本基线一致。七、FAQ完整继承原文档四个问题Q1iOS 上构建 tensorflow/tflite 失败env: python: no such file or directory某些 Bazel 版本在处理py_binarymacOS 上的 bundletool时无法正确处理--incompatible_strict_action_env与--action_env会回退使用/usr/bin/python而非 Homebrew 的 python。macOS 12.3 起系统移除了/usr/bin下的 python 2.7bundletool 因此失败。解决办法二选一降级系统到 12.2或修改失败文件的 shebang 行tensorflow/bazel-out/host/bin/external/build_bazel_rules_apple/tools/bundletool/bundletool中把#!/usr/bin/env python改为#!/usr/bin/env python3。Q2报错No such file or directory: {ANDROID_NDK}/platforms旧工具链含platforms目录在 Android NDK r22 中被移除会破坏 tflite 的编译因此 NDK 必须低于 r22推荐 21.x与 2.3 节安装脚本一致。Q3section __TEXT/__const address out of range for architecture x86_64PyTorch 在 Command Line Tools 13.3 下编译失败的已知问题对应 PyTorch 官方 issue #76094 的讨论。解决办法把 CLT 降级到 13.3 之前与 2.2 节的 macOS 约束一致。Q4Building for iOS, but the linked and embedded framework TensorFlowLiteBenchmarkC.framework was built for iOS iOS Simulatortflite 产出的是包含多架构的 iOS fat frameworkXcode 的 New Build System 不支持这种形态需要 XCFramework因此 Xcode 需切换回 Legacy Build System。八、延伸阅读与相关文件benchmark/scripts/READMD.md本文对应的原始指南benchmark/scripts/build.sh / convert.sh / convert.py / bench.sh / bench_pc.py三步流程的完整实现benchmark.cpp 与 benchmark/CMakeLists.txtbenchmark.out的参数解析、warmup 循环、releaseModel与 CPU 亲和性set_cpu_affinity当前未启用等实现细节benchmark/models/内置的 8 个.mnn基准模型benchmark/exprModels/ 与 benchmark/benchmarkExprModels.cpp基于 Expr API 用代码搭建 GoogLeNet/MobileNet/ResNet/ShuffleNet/SqueezeNet 的对比基准benchmarkExprModels.outbenchmark/android/bench_android.sh仅针对 MNN 的 Android 单机压测脚本CPU/Vulkan/OpenCL 三套 forward 类型记录/proc/cpuinfo与构建参数可作为跨引擎流程之外的快速回归手段docs/tools/benchmark.mdMNN 官方 benchmark 工具文档快速核对清单平台约束macOS 12.3、CLT 13.3、Legacy Build SystemNDK r22 且导出ANDROID_SDK/ANDROID_NDKiOS 用 rbenv 装 Ruby 3.1.2build.sh前先把MNN_REPO改为公网仓库地址convert.sh前确认models/onnx/下有源模型models/config.json中已配置每个模型的输入层/shape/dtypebench_common依赖它运行bench.sh时以脚本usage中的--sync-adb等参数为准结果统一落在benchmark/scripts/result/下的分引擎 txt 中按 max/min/avg 三个维度横向对比即可。【免费下载链接】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),仅供参考
返回列表