onnxruntime/csharp/tools/MauiModelTester
Ashrit Shetty 4b5b5f7101
Update win-ort-main to tip main 250123 (#23473)
### Description
This PR is to update the win-ort-main branch to the tip main branch as
of 2025-01-23.

### PR List
ddf0d377a7 [QNN EP] Add LoggingManager::HasDefaultLogger() to provider
bridge API (#23467)
05fbbdf91f [QNN EP] Make QNN EP a shared library (#23120)
1336566d7f Add custom vcpkg ports (#23456)
2e1173c411 Update the compile flags for vcpkg packages (#23455)
1f628a9858 [Mobile] Add BrowserStack Android MAUI Test (#23383)
009cae0ec8 [js/webgpu] Optimize ConvTranspose (Continue) (#23429)
04a4a694cb Use onnx_protobuf.h to suppress some GCC warnings (#23453)
2e3b62b4b0 Suppress some strict-aliasing related warnings in WebGPU EP
(#23454)
b708f9b1dc Bump ruff from 0.9.1 to 0.9.2 (#23427)
c0afc66b2a [WebNN] Remove workarounds for TFLite backend (#23406)
8a821ff7f9 Bump vite from 6.0.7 to 6.0.11 in
/js/web/test/e2e/exports/testcases/vite-default (#23446)
220c1a203e Make ORT and Dawn use the same protobuf/abseil source code
(#23447)
b7b5792147 Change MacOS-13 to ubuntu on for
android-java-api-aar-test.yml. (#23444)
19d0d2a30f WIP: Dp4MatMulNBits accuracy level 4 matmul for WebGPU EP
(#23365)
95b8effbc4 [QNN EP]: Clean up QNN logging resources if an error occurs
during initialization (#23435)
626134c5b5 Bump clang-format from 19.1.6 to 19.1.7 (#23428)
0cf975301f Fix eigen external deps (#23439)
f9440aedce Moving RN_CI Android Testing to Linux (#23422)
1aa5902ff4 [QNN EP] workaround for QNN validation bug for Tanh with
uint16 quantized output (#23432)
7f5582a0e2 Seperate RN andriod and IOS into 2 separated Stages. (#23400)
73deac2e7f Implement some missing element wise Add/Sub/Mul/Div/Neg
operations for CPU and CUDA EPs (#23090)
949fe42af4 Upgrade Java version from react-native/android to Java 17
(#23066)
0892c23463 Update Qnn SDK default version to 2.30 (#23411)
94c099bcec Fix type cast build error (#23423)
d633e571d1 [WebNN EP] Fix AddInitializersToSkip issues (#23354)
e988ef00e2 [QNN EP] Fix regression for MatMul with two quantized/dynamic
uint16 inputs (#23419)
7538795f6b Update onnxruntime binary size checks ci pipeline's docker
image (#23405)
6c5ea41cad Revert "[QNN EP] Clean up correctly from a partial setup
(#23320)" (#23420)
e866804bbe Enable comprehension simplification in ruff rules (#23414)
0a5f1f392c bugfix: string_view of invalid memory (#23417)
4cc38e0277 fix crash when first input of BatchNormalization is 1-D
(#23387)
033441487f Target py310 and modernize codebase with ruff (#23401)
87341ac010 [QNN EP] Fix segfault when unregistering HTP shared memory
handles (#23402)

### Motivation and Context
This update includes the change to make QNN-EP a shared library.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Adrian Lizarraga <adlizarraga@microsoft.com>
Co-authored-by: Justin Chu <justinchuby@users.noreply.github.com>
Co-authored-by: Yulong Wang <7679871+fs-eire@users.noreply.github.com>
Co-authored-by: Edward Chen <18449977+edgchen1@users.noreply.github.com>
Co-authored-by: Changming Sun <chasun@microsoft.com>
Co-authored-by: Peishen Yan <peishen.yan@intel.com>
Co-authored-by: Tianlei Wu <tlwu@microsoft.com>
Co-authored-by: Hector Li <hecli@microsoft.com>
Co-authored-by: Jian Chen <cjian@microsoft.com>
Co-authored-by: Alexis Tsogias <1114095+Zyrin@users.noreply.github.com>
Co-authored-by: junchao-zhao <68935141+junchao-loongson@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: sushraja-msft <44513542+sushraja-msft@users.noreply.github.com>
Co-authored-by: Wanming Lin <wanming.lin@intel.com>
Co-authored-by: Jiajia Qin <jiajiaqin@microsoft.com>
Co-authored-by: Caroline Zhu <wolfivyaura@gmail.com>
2025-01-23 09:12:03 -08:00
..
Platforms [C# MauiModelTester] Fix icon name in Info.plist (#21666) 2024-11-05 16:55:38 -08:00
Properties
Resources
App.xaml
App.xaml.cs
AppShell.xaml
AppShell.xaml.cs
create_test_data.py Update win-ort-main to tip main 250123 (#23473) 2025-01-23 09:12:03 -08:00
MainPage.xaml
MainPage.xaml.cs Various test infra updates from testing Azure ops with MAUI test app (#17262) 2023-08-27 09:35:00 +10:00
MauiModelTester.csproj Update MAUI model tester tool to .net8 (#19907) 2024-03-14 15:19:19 +10:00
MauiModelTester.sln
MauiProgram.cs Various test infra updates from testing Azure ops with MAUI test app (#17262) 2023-08-27 09:35:00 +10:00
NuGet.config
OrtInferenceSession.cs
PerfStats.cs
ReadMe.md
Utils.cs Various test infra updates from testing Azure ops with MAUI test app (#17262) 2023-08-27 09:35:00 +10:00

MAUI Model Tester

Usage

Run create_test_data.py to specify

  • path to the model you wish to use
  • symbolic dimension values to use if needed
  • any specific input if the randomly generated input will not be good enough
    • you can create specific input with /tools/python/onnx_test_data_utils.py
    • see the comments in create_test_data.py for more details
  • expected output if saving the output from running the model locally is not good enough
    • the model will be executed when creating the test data to validate the input

This will copy the model to Resources\Raw\test_data\model.onnx and the test data files to Resources\Raw\test_data\test_data_set_0

The MAUI application will read the model and test data from those locations and should need no other changes to be able to execute the model.

The project uses builds from the nightly feed by default to keep things simple.

If it was part of the main ONNX Runtime C# solution we'd have to

  • add the ORT nightly feed to the top level nuget.config
    • this potentially adds confusion about where nuget packages come from in unit tests
  • keep updating the referenced nightly packages so they remain valid so the complete solution builds in the CI

You will need to manually add the ORT-Nightly feed to the packageSources section of the nuget.config in this directory.

  • <add key="ORT-Nightly" value="https://aiinfra.pkgs.visualstudio.com/PublicPackages/_packaging/ORT-Nightly/nuget/v3/index.json" />
  • This feed isn't allowed in the checked in nuget.config

If you need to update the ORT packages used by the app to the latest nightly:

  • In Visual Studio, Tools -> Nuget Package Manager -> Manage NuGet Packages for Solution...
  • Make sure 'Include prerelease' is checked
  • Set Package Source to ORT-Nightly
  • Update Microsoft.ML.OnnxRuntime, Microsoft.ML.OnnxRuntime.Managed and Microsoft.ML.OnnxRuntime.Extensions to the latest build.

Testing C# or native code changes

If you have new code to test the easiest way is to run the nuget packaging pipeline on https://aiinfra.visualstudio.com/Lotus/_build against your branch. Download the native and managed nuget packages from the CI artifacts and update the nuget.config to point to the directory they are in. This can be used to test both native and C# code changes.

If you wish to test local changes to the C# code, you can create a local nuget package and add the directory it's in to nuget.config. With the current setup you'd first need to build ORT with the --build_csharp param to update the C# Directory.build.props and create the native library for the current platform, as the current packaging infrastructure creates the native and managed packages at the same time and requires a native library to exist.

Alternatively, you can open /csharp/OnnxRuntime.CSharp.sln and temporarily add /csharp/tools/MauiModelTester/MauiModelTester.csproj to it. The csproj should automatically adjust to use a project reference to /csharp/src/Microsoft.ML.OnnxRuntime/Microsoft.ML.OnnxRuntime.csproj instead of a package reference to the Microsoft.ML.OnnxRuntime.Managed nuget package. Note that you must still run build.bat/build.sh with --build_csharp to generate /csharp/Directory.Build.props, but can run with the --update parameter so no native build is done. Most likely you should grab the latest nightly native package from the packaging pipeline so the native code is compatible.

Local build setup

The following commands should install the necessary workloads to create the managed package including mobile targets, build the managed library and create the native (local build only) and managed packages. The packages will be in the ORT build output directory (e.g. build/Windows/Debug/Debug). The native package will only contain the runtime for the current platform (e.g. Windows 64-bit if you're building on Windows) so can't be used for testing other platforms. Use the native package from the nightly feed or a packaging CI.

dotnet workload install ios android macos
dotnet workload restore .\src\Microsoft.ML.OnnxRuntime\Microsoft.ML.OnnxRuntime.csproj -p:SelectedTargets=All
msbuild -t:restore .\src\Microsoft.ML.OnnxRuntime\Microsoft.ML.OnnxRuntime.csproj -p:SelectedTargets=All
msbuild -t:build .\src\Microsoft.ML.OnnxRuntime\Microsoft.ML.OnnxRuntime.csproj -p:SelectedTargets=All
msbuild .\OnnxRuntime.CSharp.proj -t:CreatePackage -p:OrtPackageId=Microsoft.ML.OnnxRuntime -p:Configuration=Debug -p:Platform="Any CPU"

Example test data creation

Example commands to create test data

PyTorch mobilenet V3 with a symbolic dimension called 'batch' that we set to 1.

https://pytorch.org/vision/main/models/mobilenetv3.html exported with torch.onnx.export with the batch dimension being dynamic. We provide a value of 1 for the batch size to use in our testing.

create_test_data.py -s batch=1 -m pytorch_mobilenet_v3.onnx

SuperResolution with pre-processing in the model.

As the model has pre-processing in it from onnxruntime-extensions, we want to provide the raw bytes from a jpeg or png.

Convert image to protobuf file with name of 'image' to match the model input. The output filename doesn't matter. python ..\..\..\tools\python\onnx_test_data_utils.py --action image_to_pb --raw --input lion.png --output superres_input.pb --name image

Create test data using this input. create_test_data.py --input_data superres_input.pb --model_path RealESRGAN_with_pre_post_processing.onnx