onnxruntime/tools/python/util/mobile_helpers/test/test_usability_checker.py
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

147 lines
6.3 KiB
Python

# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
from __future__ import annotations
import logging
import pathlib
import unittest
from testfixtures import LogCapture
from ..usability_checker import analyze_model
# example usage from <ort root>/tools/python
# python -m unittest util/mobile_helpers/test/test_usability_checker.py
# NOTE: at least on Windows you must use that as the working directory for all the imports to be happy
script_dir = pathlib.Path(__file__).parent
ort_root = script_dir.parents[4]
skip_optimize = False
def _create_logger():
logger = logging.getLogger("default")
logger.setLevel(logging.DEBUG)
return logger
class TestAnalyzer(unittest.TestCase):
def test_mnist(self):
"""
Test MNIST which should be fully covered by both NNAPI and CoreML as is.
:return:
"""
with LogCapture() as log_capture:
logger = _create_logger()
model_path = ort_root / "onnxruntime" / "test" / "testdata" / "mnist.onnx"
analyze_model(model_path, skip_optimize, logger)
# print(log_capture)
log_capture.check_present(
("default", "INFO", "1 partitions with a total of 8/8 nodes can be handled by the NNAPI EP."),
("default", "INFO", "Model should perform well with NNAPI as is: YES"),
(
"default",
"INFO",
"1 partitions with a total of 8/8 nodes can be handled by the CoreML NeuralNetwork EP.",
),
("default", "INFO", "Model should perform well with CoreML NeuralNetwork as is: YES"),
(
"default",
"INFO",
"1 partitions with a total of 8/8 nodes can be handled by the CoreML MLProgram EP.",
),
("default", "INFO", "Model should perform well with CoreML MLProgram as is: YES"),
)
def test_scan_model(self):
"""
Test a Speech model where all the top level nodes are Scan. We want to make sure nodes in subgraphs are counted.
"""
with LogCapture() as log_capture:
logger = _create_logger()
# mnist - should have perfect coverage
model_path = ort_root / "onnxruntime" / "test" / "testdata" / "scan_1.onnx"
analyze_model(model_path, skip_optimize, logger)
# print(log_capture)
log_capture.check_present(
("default", "INFO", "4 partitions with a total of 72/76 nodes can be handled by the NNAPI EP."),
("default", "INFO", "72 nodes are in 4 subgraphs. Check EP as to whether subgraphs are supported."),
("default", "INFO", "Model should perform well with NNAPI as is: NO"),
(
"default",
"INFO",
"4 partitions with a total of 60/76 nodes can be handled by the CoreML NeuralNetwork EP.",
),
("default", "INFO", "Model should perform well with CoreML NeuralNetwork as is: NO"),
(
"default",
"INFO",
"12 partitions with a total of 24/76 nodes can be handled by the CoreML MLProgram EP.",
),
("default", "INFO", "Model should perform well with CoreML MLProgram as is: NO"),
)
def test_dynamic_shape(self):
"""
Test a model with dynamic input shape and supported op.
If we make the shape fixed it should report it will run well with NNAPI/CoreML.
"""
with LogCapture() as log_capture:
logger = _create_logger()
model_path = ort_root / "onnxruntime" / "test" / "testdata" / "abs_free_dimensions.onnx"
analyze_model(model_path, skip_optimize, logger)
# print(log_capture)
log_capture.check_present(
("default", "INFO", "0 partitions with a total of 0/1 nodes can be handled by the NNAPI EP."),
("default", "INFO", "Model should perform well with NNAPI as is: NO"),
("default", "INFO", "Model should perform well with NNAPI if modified to have fixed input shapes: YES"),
(
"default",
"INFO",
"0 partitions with a total of 0/1 nodes can be handled by the CoreML MLProgram EP.",
),
("default", "INFO", "CoreML MLProgram cannot run any nodes in this model."),
("default", "INFO", "Model should perform well with CoreML MLProgram as is: NO"),
(
"default",
"INFO",
"Model should perform well with CoreML MLProgram if modified to have fixed input shapes: NO",
),
)
def test_multi_partitions(self):
"""
Test a model that breaks into too many partitions to be recommended for use with NNAPI/CoreML
"""
with LogCapture() as log_capture:
logger = _create_logger()
model_path = ort_root / "onnxruntime" / "test" / "testdata" / "gh_issue_9671.onnx"
analyze_model(model_path, skip_optimize, logger)
# print(log_capture)
log_capture.check_present(
("default", "INFO", "3 partitions with a total of 22/50 nodes can be handled by the NNAPI EP."),
("default", "INFO", "\tPartition sizes: [13, 2, 7]"),
(
"default",
"INFO",
"\tUnsupported ops: ai.onnx:ReduceProd,ai.onnx:ReduceSum,ai.onnx:Shape",
),
(
"default",
"INFO",
"NNAPI is not recommended with this model as there are 3 partitions "
"covering 44.0% of the nodes in the model. "
"This will most likely result in worse performance than just using the CPU EP.",
),
(
"default",
"INFO",
"4 partitions with a total of 20/50 nodes can be handled by the CoreML NeuralNetwork EP.",
),
("default", "INFO", "\tPartition sizes: [11, 3, 5, 1]"),
)