diff options
author | Jan Eilers <jan.eilers@arm.com> | 2020-12-15 10:42:38 +0000 |
---|---|---|
committer | Jim Flynn <jim.flynn@arm.com> | 2021-01-22 11:48:34 +0000 |
commit | 2cd184763ff7f8767e751f2fe0c461714350aae6 (patch) | |
tree | 048a95b2b571bfa3ad03eceb5dd4ccd4d0a70c06 /delegate/python/test | |
parent | d672f5d4386dc0545d2e484ce85b76d53edb6bc9 (diff) | |
download | armnn-2cd184763ff7f8767e751f2fe0c461714350aae6.tar.gz |
IVGCVSW-5571 Expose the TfLite Delegate to the TfLite python API
* Implemented external delegate adaptor interface for TfLite
* Activated armnn logging for delegate
* Added logging info to indicate if gpu tuning is turned on
* Added pytests to ensure functionality of the external delegate adaptor
* Included the delegate directory into doxygen
* Added documentation on how to use the external delegate in python
Signed-off-by: Finn Williams <Finn.Williams@arm.com>
Signed-off-by: Jan Eilers <jan.eilers@arm.com>
Change-Id: Id3b4588fb0b9ac7e3f47ba2c19feead7beb58e18
Diffstat (limited to 'delegate/python/test')
-rw-r--r-- | delegate/python/test/conftest.py | 30 | ||||
-rw-r--r-- | delegate/python/test/pytest.ini | 9 | ||||
-rw-r--r-- | delegate/python/test/test_data/mock_model.tflite | bin | 0 -> 37944 bytes | |||
-rw-r--r-- | delegate/python/test/test_external_delegate.py | 65 | ||||
-rw-r--r-- | delegate/python/test/utils.py | 24 |
5 files changed, 128 insertions, 0 deletions
diff --git a/delegate/python/test/conftest.py b/delegate/python/test/conftest.py new file mode 100644 index 0000000000..780a0492e1 --- /dev/null +++ b/delegate/python/test/conftest.py @@ -0,0 +1,30 @@ +# Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +# SPDX-License-Identifier: MIT +import pytest +import os + + +@pytest.fixture(scope="module") +def test_data_folder(request): + """ + This fixture returns path to the folder with the shared test resources + """ + return str(os.path.join(request.fspath.dirname, "test_data")) + + +def pytest_addoption(parser): + """ + Adds the program option 'delegate-dir' to pytest + """ + parser.addoption("--delegate-dir", + action="append", + help="Directory of the armnn tflite delegate library", + required=True) + + +def pytest_generate_tests(metafunc): + """ + Makes the program option 'delegate-dir' available to all tests as a function fixture + """ + if "delegate_dir" in metafunc.fixturenames: + metafunc.parametrize("delegate_dir", metafunc.config.getoption("delegate_dir"))
\ No newline at end of file diff --git a/delegate/python/test/pytest.ini b/delegate/python/test/pytest.ini new file mode 100644 index 0000000000..719af3ce05 --- /dev/null +++ b/delegate/python/test/pytest.ini @@ -0,0 +1,9 @@ +# Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +# SPDX-License-Identifier: MIT + +[pytest] +addopts = --strict-markers +markers = + CpuRefTest: marks tests that require the CpuRef backend + CpuAccTest: marks tests that require the CpuAcc backend + GpuAccTest: marks tests that require the GpuAcc backend
\ No newline at end of file diff --git a/delegate/python/test/test_data/mock_model.tflite b/delegate/python/test/test_data/mock_model.tflite Binary files differnew file mode 100644 index 0000000000..0b8944d3ed --- /dev/null +++ b/delegate/python/test/test_data/mock_model.tflite diff --git a/delegate/python/test/test_external_delegate.py b/delegate/python/test/test_external_delegate.py new file mode 100644 index 0000000000..995de8cd70 --- /dev/null +++ b/delegate/python/test/test_external_delegate.py @@ -0,0 +1,65 @@ +# Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +# SPDX-License-Identifier: MIT + +import pytest +import tflite_runtime.interpreter as tflite +import os +from utils import run_mock_model + + +def test_external_delegate_unknown_options(delegate_dir): + print(delegate_dir) + with pytest.raises(ValueError): + tflite.load_delegate( + delegate_dir, + options={"wrong": "wrong"}) + + +def test_external_delegate_options_multiple_backends(delegate_dir): + tflite.load_delegate( + delegate_dir, + options={"backends": "GpuAcc,CpuAcc,CpuRef,Unknown"}) + + +@pytest.mark.GpuAccTest +def test_external_delegate_options_gpu_tuning(delegate_dir, test_data_folder, tmp_path): + + tuning_file = os.path.join(str(tmp_path), "test_gpu.tuning") + # cleanup previous test run if necessary + if os.path.exists(tuning_file): + os.remove(tuning_file) + + # with tuning level 2 a tuning file should be created + armnn_delegate = tflite.load_delegate( + delegate_dir, + options={ + "backends": "GpuAcc", + "gpu-tuning-level": "2", + "gpu-tuning-file": tuning_file, + "logging-severity": "info"}) + + run_mock_model(armnn_delegate, test_data_folder) + + # destroy delegate, otherwise tuning file won't be written to file + armnn_delegate.__del__() + assert (os.path.exists(tuning_file)) + + # if no tuning level is provided it defaults to 0 which means it will use the tuning parameters from a tuning + # file if one is provided + armnn_delegate2 = tflite.load_delegate( + delegate_dir, + options={ + "backends": "GpuAcc", + "gpu-tuning-file": tuning_file, + "logging-severity": "info"}) + + run_mock_model(armnn_delegate2, test_data_folder) + + # cleanup + os.remove(tuning_file) + +def test_external_delegate_options_wrong_logging_level(delegate_dir): + with pytest.raises(ValueError): + tflite.load_delegate( + delegate_dir, + options={"logging-severity": "wrong"}) diff --git a/delegate/python/test/utils.py b/delegate/python/test/utils.py new file mode 100644 index 0000000000..3adc24fe35 --- /dev/null +++ b/delegate/python/test/utils.py @@ -0,0 +1,24 @@ +# Copyright © 2020 Arm Ltd and Contributors. All rights reserved. +# SPDX-License-Identifier: MIT + +import tflite_runtime.interpreter as tflite +import numpy as np +import os + + +def run_mock_model(delegate, test_data_folder): + model_path = os.path.join(test_data_folder, 'mock_model.tflite') + interpreter = tflite.Interpreter(model_path=model_path, + experimental_delegates=[delegate]) + interpreter.allocate_tensors() + + # Get input and output tensors. + input_details = interpreter.get_input_details() + output_details = interpreter.get_output_details() + + # Test model on random input data. + input_shape = input_details[0]['shape'] + input_data = np.array(np.random.random_sample(input_shape), dtype=np.uint8) + interpreter.set_tensor(input_details[0]['index'], input_data) + + interpreter.invoke()
\ No newline at end of file |