aboutsummaryrefslogtreecommitdiff
path: root/delegate/python
diff options
context:
space:
mode:
authorJan Eilers <jan.eilers@arm.com>2020-12-15 10:42:38 +0000
committerJim Flynn <jim.flynn@arm.com>2021-01-22 11:48:34 +0000
commit2cd184763ff7f8767e751f2fe0c461714350aae6 (patch)
tree048a95b2b571bfa3ad03eceb5dd4ccd4d0a70c06 /delegate/python
parentd672f5d4386dc0545d2e484ce85b76d53edb6bc9 (diff)
downloadarmnn-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')
-rw-r--r--delegate/python/test/conftest.py30
-rw-r--r--delegate/python/test/pytest.ini9
-rw-r--r--delegate/python/test/test_data/mock_model.tflitebin0 -> 37944 bytes
-rw-r--r--delegate/python/test/test_external_delegate.py65
-rw-r--r--delegate/python/test/utils.py24
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
new file mode 100644
index 0000000000..0b8944d3ed
--- /dev/null
+++ b/delegate/python/test/test_data/mock_model.tflite
Binary files differ
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