window下编译MNNConvert

下载MNN仓库

  • clone你需要的MNN版本,我这里需要的是2.9.0

Cmake编译

  • 官方提供的编译流程。我没跑通
  • 参考别人的方案,我自己跑通的流程
  • 直接去cmake gui进行编译。我尝试采用命令行,cmake .. ; cmake --build . --config Release; 没搞定。
     -DMNN_BUILD_CONVERTER=ON(这个选项用于控制是否构建 MNN 的模型转换工具 (Converter)。设置为 ON 表示在构建过程中会包含 Converter 工具)
     -DMNN_BUILD_SHARED_LIBS=OFF
     -DMNN_WIN_RUNTIME_MT=ON
    
  • 然后进入visual studio 2022,我是这个版本。 选择MNNConvert作为启动项,然后点击生成,就可以在build->Release下看到MNNConvert.exe 文件了

执行转换程序

./MNNConvert -f TF/ONNX/TFLITE --modelFile XXX.pb/XXX.onnx/XXX.tflite --MNNModel XXX.XX --bizCode XXX
// 例子
./MNNConvert -f ONNX --modelFile model.onnx  --MNNModel model.mnn --bizCode MNN
./MNNConvert -f ONNX --modelFile model.onnx  --MNNModel model.mnn  --fp16  --bizCode MNN 

构建armv82动态库

  • 这个mnn动态库可以起到提速的作用,提速在20%到30%左右。可能会用到map和unmap,因为推理得到的fp16数据,很可能会出现nan,一般是数据预处理的结果需要map一下
    image
  • 那就开始编译这个库吧。直接在CmakeList.txt修改MNN_ARM82为ON是不可行的,必须在那个脚本文件里面进行增加条目修改,可以参考我的
    #!/bin/bash
    cmake ../../../ \
    -DCMAKE_TOOLCHAIN_FILE=$ANDROID_NDK/build/cmake/android.toolchain.cmake \
    -DCMAKE_BUILD_TYPE=Release \
    -DANDROID_ABI="arm64-v8a" \
    -DANDROID_STL=c++_static \
    -DMNN_USE_LOGCAT=false \
    -DMNN_BUILD_BENCHMARK=ON \
    -DMNN_USE_SSE=OFF \
    -DMNN_BUILD_TEST=ON \
    -DMNN_ARM82=ON \ 
    -DANDROID_NATIVE_API_LEVEL=android-21  \
    -DMNN_BUILD_FOR_ANDROID_COMMAND=true \
    -DNATIVE_LIBRARY_OUTPUT=. -DNATIVE_INCLUDE_OUTPUT=. $*
    
    make -j4
    
  • map和unmap简单实用例子
    auto input = interpreter->getSessionInput(session, NULL);
    void* host = input->map(MNN::Tensor::MAP_TENSOR_WRITE, input->getDimensionType());
    // 数据预处理,处理数据传入到host那块地址
    input->unmap(MNN::Tensor::MAP_TENSOR_WRITE,  input->getDimensionType(), host);
    
    // mnn模型推理
    
    //mnn后处理
    // 对于拿到的output,可以使用copyToHostTensor,可以自动fp16到fp32的转换,也可以使用createHostTensorFromDevice。当然也可以使用map和unmap
    
posted @ 2025-12-15 15:39  九叶草  阅读(14)  评论(0)    收藏  举报