This is an automated email from the ASF dual-hosted git repository.
areusch pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push:
new 6f831137c9 [microTVM] Refactor pytest fixtures (#12207)
6f831137c9 is described below
commit 6f831137c96150bc3942852564ded21a949d702b
Author: Mehrdad Hessar <[email protected]>
AuthorDate: Wed Aug 3 10:58:15 2022 -0700
[microTVM] Refactor pytest fixtures (#12207)
* Refactor micro test fixtures
* fix error
* fix scope
* address @guberti comments
* fix help message
* rename tvm_debug and added .gitignore
* fix bug
* fix bug
---
python/tvm/micro/testing/evaluation.py | 5 +-
.../tvm/micro/testing/pytest_plugin.py | 69 ++++++++++++--------
tests/micro/.gitignore | 2 +
tests/micro/arduino/conftest.py | 45 ++-----------
.../micro/arduino/test_arduino_error_detection.py | 9 +--
tests/micro/arduino/test_arduino_rpc_server.py | 29 ++++-----
tests/micro/arduino/test_arduino_workflow.py | 13 ++--
tests/micro/arduino/test_utils.py | 4 +-
tests/micro/common/conftest.py | 31 ++-------
tests/micro/common/test_autotune.py | 2 +-
tests/micro/zephyr/conftest.py | 73 ++--------------------
tests/micro/zephyr/test_zephyr.py | 56 +++++++++--------
tests/micro/zephyr/test_zephyr_aot_exec.py | 16 ++---
.../zephyr/test_zephyr_aot_exec_standalone.py | 20 ++++--
tests/micro/zephyr/test_zephyr_armv7m.py | 16 ++---
tests/scripts/task_python_microtvm.sh | 14 ++---
16 files changed, 152 insertions(+), 252 deletions(-)
diff --git a/python/tvm/micro/testing/evaluation.py
b/python/tvm/micro/testing/evaluation.py
index 5407fcbabf..26d3c34327 100644
--- a/python/tvm/micro/testing/evaluation.py
+++ b/python/tvm/micro/testing/evaluation.py
@@ -28,6 +28,7 @@ from contextlib import ExitStack
import tempfile
import tvm
+from tvm.relay.op.contrib import cmsisnn
def tune_model(
@@ -99,6 +100,8 @@ def create_aot_session(
if use_cmsis_nn:
config["relay.ext.cmsisnn.options"] = {"mcpu": target.mcpu}
stack.enter_context(tvm.transform.PassContext(opt_level=3,
config=config))
+ if use_cmsis_nn:
+ mod = cmsisnn.partition_for_cmsisnn(mod, params, mcpu=target.mcpu)
if tune_logs is not None:
stack.enter_context(tvm.autotvm.apply_history_best(tune_logs))
@@ -153,4 +156,4 @@ def evaluate_model_accuracy(session, aot_executor,
input_data, true_labels, runs
num_correct = sum(u == v for u, v in zip(true_labels, predicted_labels))
average_time = sum(aot_runtimes) / len(aot_runtimes)
accuracy = num_correct / len(predicted_labels)
- return average_time, accuracy
+ return average_time, accuracy, predicted_labels
diff --git a/tests/micro/zephyr/conftest.py
b/python/tvm/micro/testing/pytest_plugin.py
similarity index 53%
copy from tests/micro/zephyr/conftest.py
copy to python/tvm/micro/testing/pytest_plugin.py
index c4de48a0a4..b677588172 100644
--- a/tests/micro/zephyr/conftest.py
+++ b/python/tvm/micro/testing/pytest_plugin.py
@@ -14,58 +14,73 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
-import datetime
-import os
-import pathlib
-import pytest
+# pylint: disable=invalid-name,redefined-outer-name
+""" microTVM testing fixtures used to deduce testing argument
+ values from testing parameters """
-import test_utils
+import pathlib
+import os
+import datetime
+import pytest
from tvm.contrib.utils import tempdir
+from .utils import get_supported_boards
+
def pytest_addoption(parser):
+ """Adds more pytest arguments"""
parser.addoption(
- "--zephyr-board",
+ "--board",
required=True,
- choices=test_utils.ZEPHYR_BOARDS.keys(),
- help="Zephyr board for test.",
+ choices=list(get_supported_boards("zephyr").keys())
+ + list(get_supported_boards("arduino").keys()),
+ help=(
+ "microTVM boards for tests. Board refers to instances"
+ "of microcontrollers/emulators defined in a platform."
+ ),
)
parser.addoption(
- "--west-cmd", default="west", help="Path to `west` command for
flashing device."
+ "--test-build-only",
+ action="store_true",
+ help="Only run tests that don't require physical hardware.",
)
parser.addoption(
- "--tvm-debug",
+ "--microtvm-debug",
action="store_true",
default=False,
- help="If set true, enable a debug session while the test is running.
Before running the test, in a separate shell, you should run: <python -m
tvm.exec.microtvm_debug_shell>",
+ help=(
+ "If set true, it will keep the project directory for debugging."
+ "Also, it will enable debug level logging in project generation."
+ ),
)
-def pytest_generate_tests(metafunc):
- if "board" in metafunc.fixturenames:
- metafunc.parametrize("board",
[metafunc.config.getoption("zephyr_board")])
[email protected](scope="session")
+def board(request):
+ return request.config.getoption("--board")
[email protected]
-def west_cmd(request):
- return request.config.getoption("--west-cmd")
[email protected](scope="session")
+def microtvm_debug(request):
+ return request.config.getoption("--microtvm-debug")
[email protected]
-def tvm_debug(request):
- return request.config.getoption("--tvm-debug")
+def pytest_collection_modifyitems(config, items):
+ if config.getoption("--test-build-only"):
+ skip_hardware_tests = pytest.mark.skip(reason="--test-build-only was
passed")
+ for item in items:
+ if "requires_hardware" in item.keywords:
+ item.add_marker(skip_hardware_tests)
@pytest.fixture
-def temp_dir(board, tvm_debug):
- parent_dir = pathlib.Path(os.path.dirname(__file__))
- filename = os.path.splitext(os.path.basename(__file__))[0]
+def workspace_dir(request, board, microtvm_debug):
+ """Creates workspace directory for each test."""
+ parent_dir = pathlib.Path(os.path.dirname(request.module.__file__))
board_workspace = (
- parent_dir
- / f"workspace_{filename}_{board}"
- / datetime.datetime.now().strftime("%Y-%m-%dT%H-%M-%S")
+ parent_dir / f"workspace_{board}" /
datetime.datetime.now().strftime("%Y-%m-%dT%H-%M-%S")
)
board_workspace_base = str(board_workspace)
number = 1
@@ -76,7 +91,7 @@ def temp_dir(board, tvm_debug):
if not os.path.exists(board_workspace.parent):
os.makedirs(board_workspace.parent)
- keep_for_debug = tvm_debug if tvm_debug else None
+ keep_for_debug = microtvm_debug if microtvm_debug else None
test_temp_dir = tempdir(custom_path=board_workspace,
keep_for_debug=keep_for_debug)
return test_temp_dir
diff --git a/tests/micro/.gitignore b/tests/micro/.gitignore
new file mode 100644
index 0000000000..88d8d834ed
--- /dev/null
+++ b/tests/micro/.gitignore
@@ -0,0 +1,2 @@
+# test workspaces
+*/workspace_*/
diff --git a/tests/micro/arduino/conftest.py b/tests/micro/arduino/conftest.py
index bb4db18f78..a5ce8127c0 100644
--- a/tests/micro/arduino/conftest.py
+++ b/tests/micro/arduino/conftest.py
@@ -15,35 +15,19 @@
# specific language governing permissions and limitations
# under the License.
-import pytest
+pytest_plugins = [
+ "tvm.micro.testing.pytest_plugin",
+]
-from test_utils import ARDUINO_BOARDS
+import pytest
def pytest_addoption(parser):
- parser.addoption(
- "--arduino-board",
- nargs="+",
- required=True,
- choices=ARDUINO_BOARDS.keys(),
- help="Arduino board for tests.",
- )
parser.addoption(
"--arduino-cli-cmd",
default="arduino-cli",
help="Path to `arduino-cli` command for flashing device.",
)
- parser.addoption(
- "--test-build-only",
- action="store_true",
- help="Only run tests that don't require physical hardware.",
- )
- parser.addoption(
- "--tvm-debug",
- action="store_true",
- default=False,
- help="If given, enable a debug session while the test is running.
Before running the test, in a separate shell, you should run: <python -m
tvm.exec.microtvm_debug_shell>",
- )
def pytest_configure(config):
@@ -52,27 +36,6 @@ def pytest_configure(config):
)
-def pytest_collection_modifyitems(config, items):
- if config.getoption("--test-build-only"):
- skip_hardware_tests = pytest.mark.skip(reason="--test-build-only was
passed")
- for item in items:
- if "requires_hardware" in item.keywords:
- item.add_marker(skip_hardware_tests)
-
-
-# We might do project generation differently for different boards in the future
-# (to take advantage of multiple cores / external memory / etc.), so all tests
-# are parameterized by board
-def pytest_generate_tests(metafunc):
- board = metafunc.config.getoption("arduino_board")
- metafunc.parametrize("board", board, scope="session")
-
-
@pytest.fixture(scope="session")
def arduino_cli_cmd(request):
return request.config.getoption("--arduino-cli-cmd")
-
-
[email protected](scope="session")
-def tvm_debug(request):
- return request.config.getoption("--tvm-debug")
diff --git a/tests/micro/arduino/test_arduino_error_detection.py
b/tests/micro/arduino/test_arduino_error_detection.py
index 583f8283ca..de5e5bb56c 100644
--- a/tests/micro/arduino/test_arduino_error_detection.py
+++ b/tests/micro/arduino/test_arduino_error_detection.py
@@ -23,15 +23,10 @@ from tvm.micro.project_api.server import ServerError
import test_utils
import tvm.testing
-# A new project and workspace dir is created for EVERY test
[email protected]
-def workspace_dir(request, board):
- return test_utils.make_workspace_dir("arduino_error_detection", board)
-
@pytest.fixture
-def project(board, arduino_cli_cmd, tvm_debug, workspace_dir):
- return test_utils.make_kws_project(board, arduino_cli_cmd, tvm_debug,
workspace_dir)
+def project(board, arduino_cli_cmd, microtvm_debug, workspace_dir):
+ return test_utils.make_kws_project(board, arduino_cli_cmd, microtvm_debug,
workspace_dir)
def test_blank_project_compiles(workspace_dir, project):
diff --git a/tests/micro/arduino/test_arduino_rpc_server.py
b/tests/micro/arduino/test_arduino_rpc_server.py
index acd4186940..3440fde8f7 100644
--- a/tests/micro/arduino/test_arduino_rpc_server.py
+++ b/tests/micro/arduino/test_arduino_rpc_server.py
@@ -37,11 +37,6 @@ from tvm.relay.backend import Executor, Runtime
import test_utils
-# # A new project and workspace dir is created for EVERY test
[email protected]
-def workspace_dir(board):
- return test_utils.make_workspace_dir("arduino_rpc_server", board)
-
def _make_session(model, arduino_board, arduino_cli_cmd, workspace_dir, mod,
build_config):
project = tvm.micro.generate_project(
@@ -84,11 +79,11 @@ def _make_add_sess(model, arduino_board, arduino_cli_cmd,
workspace_dir, build_c
# The same test code can be executed on both the QEMU simulation and on real
hardware.
@tvm.testing.requires_micro
@pytest.mark.requires_hardware
-def test_compile_runtime(board, arduino_cli_cmd, tvm_debug, workspace_dir):
+def test_compile_runtime(board, arduino_cli_cmd, microtvm_debug,
workspace_dir):
"""Test compiling the on-device runtime."""
model = test_utils.ARDUINO_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
# NOTE: run test in a nested function so cPython will delete arrays before
closing the session.
def test_basic_add(sess):
@@ -109,11 +104,11 @@ def test_compile_runtime(board, arduino_cli_cmd,
tvm_debug, workspace_dir):
@tvm.testing.requires_micro
@pytest.mark.requires_hardware
-def test_platform_timer(board, arduino_cli_cmd, tvm_debug, workspace_dir):
+def test_platform_timer(board, arduino_cli_cmd, microtvm_debug, workspace_dir):
"""Test compiling the on-device runtime."""
model = test_utils.ARDUINO_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
# NOTE: run test in a nested function so cPython will delete arrays before
closing the session.
def test_basic_add(sess):
@@ -139,10 +134,10 @@ def test_platform_timer(board, arduino_cli_cmd,
tvm_debug, workspace_dir):
@tvm.testing.requires_micro
@pytest.mark.requires_hardware
-def test_relay(board, arduino_cli_cmd, tvm_debug, workspace_dir):
+def test_relay(board, arduino_cli_cmd, microtvm_debug, workspace_dir):
"""Testing a simple relay graph"""
model = test_utils.ARDUINO_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
shape = (10,)
dtype = "int8"
@@ -172,10 +167,10 @@ def test_relay(board, arduino_cli_cmd, tvm_debug,
workspace_dir):
@tvm.testing.requires_micro
@pytest.mark.requires_hardware
-def test_onnx(board, arduino_cli_cmd, tvm_debug, workspace_dir):
+def test_onnx(board, arduino_cli_cmd, microtvm_debug, workspace_dir):
"""Testing a simple ONNX model."""
model = test_utils.ARDUINO_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
# Load test images.
this_dir = pathlib.Path(__file__).parent
@@ -263,10 +258,10 @@ def check_result(
@tvm.testing.requires_micro
@pytest.mark.requires_hardware
-def test_byoc_microtvm(board, arduino_cli_cmd, tvm_debug, workspace_dir):
+def test_byoc_microtvm(board, arduino_cli_cmd, microtvm_debug, workspace_dir):
"""This is a simple test case to check BYOC capabilities of microTVM"""
model = test_utils.ARDUINO_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
x = relay.var("x", shape=(10, 10))
w0 = relay.var("w0", shape=(10, 10))
@@ -347,10 +342,10 @@ def _make_add_sess_with_shape(
)
@tvm.testing.requires_micro
@pytest.mark.requires_hardware
-def test_rpc_large_array(board, arduino_cli_cmd, tvm_debug, workspace_dir,
shape):
+def test_rpc_large_array(board, arduino_cli_cmd, microtvm_debug,
workspace_dir, shape):
"""Test large RPC array transfer."""
model = test_utils.ARDUINO_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
# NOTE: run test in a nested function so cPython will delete arrays before
closing the session.
def test_tensors(sess):
diff --git a/tests/micro/arduino/test_arduino_workflow.py
b/tests/micro/arduino/test_arduino_workflow.py
index d4f1518452..35bfa25562 100644
--- a/tests/micro/arduino/test_arduino_workflow.py
+++ b/tests/micro/arduino/test_arduino_workflow.py
@@ -36,23 +36,24 @@ This unit test simulates a simple user workflow, where we:
6. Use serial connection to ensure model behaves correctly
"""
-
# Since these tests are sequential, we'll use the same project/workspace
# directory for all tests in this file
@pytest.fixture(scope="module")
-def workspace_dir(request, board):
+def workflow_workspace_dir(request, board):
return test_utils.make_workspace_dir("arduino_workflow", board)
@pytest.fixture(scope="module")
-def project_dir(workspace_dir):
- return workspace_dir / "project"
+def project_dir(workflow_workspace_dir):
+ return workflow_workspace_dir / "project"
# We MUST pass workspace_dir, not project_dir, or the workspace will be
dereferenced too soon
@pytest.fixture(scope="module")
-def project(board, arduino_cli_cmd, tvm_debug, workspace_dir):
- return test_utils.make_kws_project(board, arduino_cli_cmd, tvm_debug,
workspace_dir)
+def project(board, arduino_cli_cmd, microtvm_debug, workflow_workspace_dir):
+ return test_utils.make_kws_project(
+ board, arduino_cli_cmd, microtvm_debug, workflow_workspace_dir
+ )
def _get_directory_elements(directory):
diff --git a/tests/micro/arduino/test_utils.py
b/tests/micro/arduino/test_utils.py
index 20e7d9e750..42ad7d40f3 100644
--- a/tests/micro/arduino/test_utils.py
+++ b/tests/micro/arduino/test_utils.py
@@ -61,10 +61,10 @@ def make_workspace_dir(test_name, board):
return t
-def make_kws_project(board, arduino_cli_cmd, tvm_debug, workspace_dir):
+def make_kws_project(board, arduino_cli_cmd, microtvm_debug, workspace_dir):
this_dir = pathlib.Path(__file__).parent
model = ARDUINO_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
mod, params = fetch_model_from_url(
url="https://github.com/tensorflow/tflite-micro/raw/main/tensorflow/lite/micro/examples/micro_speech/micro_speech.tflite",
diff --git a/tests/micro/common/conftest.py b/tests/micro/common/conftest.py
index 10dda8774b..0bf70ed061 100644
--- a/tests/micro/common/conftest.py
+++ b/tests/micro/common/conftest.py
@@ -14,10 +14,11 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
-import pytest
+pytest_plugins = [
+ "tvm.micro.testing.pytest_plugin",
+]
-from ..zephyr.test_utils import ZEPHYR_BOARDS
-from ..arduino.test_utils import ARDUINO_BOARDS
+import pytest
def pytest_addoption(parser):
@@ -27,32 +28,8 @@ def pytest_addoption(parser):
choices=["arduino", "zephyr"],
help="Platform to run tests with",
)
- parser.addoption(
- "--board",
- required=True,
- choices=list(ARDUINO_BOARDS.keys()) + list(ZEPHYR_BOARDS.keys()),
- help="microTVM boards for tests",
- )
- parser.addoption(
- "--test-build-only",
- action="store_true",
- help="Only run tests that don't require physical hardware.",
- )
@pytest.fixture
def platform(request):
return request.config.getoption("--platform")
-
-
[email protected]
-def board(request):
- return request.config.getoption("--board")
-
-
-def pytest_collection_modifyitems(config, items):
- if config.getoption("--test-build-only"):
- skip_hardware_tests = pytest.mark.skip(reason="--test-build-only was
passed")
- for item in items:
- if "requires_hardware" in item.keywords:
- item.add_marker(skip_hardware_tests)
diff --git a/tests/micro/common/test_autotune.py
b/tests/micro/common/test_autotune.py
index 1575036bf7..d62c95934a 100644
--- a/tests/micro/common/test_autotune.py
+++ b/tests/micro/common/test_autotune.py
@@ -75,7 +75,7 @@ def test_kws_autotune_workflow(platform, board, tmp_path):
labels = [0, 0, 0]
# Validate perforance across random runs
- time, _ = tvm.micro.testing.evaluate_model_accuracy(
+ time, _, _ = tvm.micro.testing.evaluate_model_accuracy(
session, aot_executor, samples, labels, runs_per_sample=20
)
# `time` is the average time taken to execute model inference on the
diff --git a/tests/micro/zephyr/conftest.py b/tests/micro/zephyr/conftest.py
index c4de48a0a4..9f3b567690 100644
--- a/tests/micro/zephyr/conftest.py
+++ b/tests/micro/zephyr/conftest.py
@@ -14,83 +14,20 @@
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
-import datetime
-import os
-import pathlib
-import pytest
-
-import test_utils
+pytest_plugins = [
+ "tvm.micro.testing.pytest_plugin",
+]
-from tvm.contrib.utils import tempdir
+import pytest
def pytest_addoption(parser):
- parser.addoption(
- "--zephyr-board",
- required=True,
- choices=test_utils.ZEPHYR_BOARDS.keys(),
- help="Zephyr board for test.",
- )
parser.addoption(
"--west-cmd", default="west", help="Path to `west` command for
flashing device."
)
- parser.addoption(
- "--tvm-debug",
- action="store_true",
- default=False,
- help="If set true, enable a debug session while the test is running.
Before running the test, in a separate shell, you should run: <python -m
tvm.exec.microtvm_debug_shell>",
- )
-
-
-def pytest_generate_tests(metafunc):
- if "board" in metafunc.fixturenames:
- metafunc.parametrize("board",
[metafunc.config.getoption("zephyr_board")])
[email protected]
[email protected](scope="session")
def west_cmd(request):
return request.config.getoption("--west-cmd")
-
-
[email protected]
-def tvm_debug(request):
- return request.config.getoption("--tvm-debug")
-
-
[email protected]
-def temp_dir(board, tvm_debug):
- parent_dir = pathlib.Path(os.path.dirname(__file__))
- filename = os.path.splitext(os.path.basename(__file__))[0]
- board_workspace = (
- parent_dir
- / f"workspace_{filename}_{board}"
- / datetime.datetime.now().strftime("%Y-%m-%dT%H-%M-%S")
- )
- board_workspace_base = str(board_workspace)
- number = 1
- while board_workspace.exists():
- board_workspace = pathlib.Path(board_workspace_base + f"-{number}")
- number += 1
-
- if not os.path.exists(board_workspace.parent):
- os.makedirs(board_workspace.parent)
-
- keep_for_debug = tvm_debug if tvm_debug else None
- test_temp_dir = tempdir(custom_path=board_workspace,
keep_for_debug=keep_for_debug)
- return test_temp_dir
-
-
[email protected](autouse=True)
-def skip_by_board(request, board):
- """Skip test if board is in the list."""
- if request.node.get_closest_marker("skip_boards"):
- if board in request.node.get_closest_marker("skip_boards").args[0]:
- pytest.skip("skipped on this board: {}".format(board))
-
-
-def pytest_configure(config):
- config.addinivalue_line(
- "markers",
- "skip_boards(board): skip test for the given board",
- )
diff --git a/tests/micro/zephyr/test_zephyr.py
b/tests/micro/zephyr/test_zephyr.py
index 05c8daa20c..1f53e4baa8 100644
--- a/tests/micro/zephyr/test_zephyr.py
+++ b/tests/micro/zephyr/test_zephyr.py
@@ -89,11 +89,11 @@ def _make_add_sess(temp_dir, model, zephyr_board, west_cmd,
build_config, dtype=
# The same test code can be executed on both the QEMU simulation and on real
hardware.
@tvm.testing.requires_micro
@pytest.mark.skip_boards(["mps2_an521"])
-def test_add_uint(temp_dir, board, west_cmd, tvm_debug):
+def test_add_uint(workspace_dir, board, west_cmd, microtvm_debug):
"""Test compiling the on-device runtime."""
model = test_utils.ZEPHYR_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
# NOTE: run test in a nested function so cPython will delete arrays before
closing the session.
def test_basic_add(sess):
@@ -108,20 +108,20 @@ def test_add_uint(temp_dir, board, west_cmd, tvm_debug):
system_lib.get_function("add")(A_data, B_data, C_data)
assert (C_data.numpy() == np.array([6, 7])).all()
- with _make_add_sess(temp_dir, model, board, west_cmd, build_config) as
sess:
+ with _make_add_sess(workspace_dir, model, board, west_cmd, build_config)
as sess:
test_basic_add(sess)
# The same test code can be executed on both the QEMU simulation and on real
hardware.
@tvm.testing.requires_micro
@pytest.mark.skip_boards(["mps2_an521"])
-def test_add_float(temp_dir, board, west_cmd, tvm_debug):
+def test_add_float(workspace_dir, board, west_cmd, microtvm_debug):
"""Test compiling the on-device runtime."""
model = test_utils.ZEPHYR_BOARDS[board]
if not test_utils.has_fpu(board):
pytest.skip(f"FPU not enabled for {board}")
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
# NOTE: run test in a nested function so cPython will delete arrays before
closing the session.
def test_basic_add(sess):
@@ -136,17 +136,19 @@ def test_add_float(temp_dir, board, west_cmd, tvm_debug):
system_lib.get_function("add")(A_data, B_data, C_data)
assert (C_data.numpy() == np.array([7, 8])).all()
- with _make_add_sess(temp_dir, model, board, west_cmd, build_config,
dtype="float32") as sess:
+ with _make_add_sess(
+ workspace_dir, model, board, west_cmd, build_config, dtype="float32"
+ ) as sess:
test_basic_add(sess)
@tvm.testing.requires_micro
@pytest.mark.skip_boards(["mps2_an521"])
-def test_platform_timer(temp_dir, board, west_cmd, tvm_debug):
+def test_platform_timer(workspace_dir, board, west_cmd, microtvm_debug):
"""Test compiling the on-device runtime."""
model = test_utils.ZEPHYR_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
# NOTE: run test in a nested function so cPython will delete arrays before
closing the session.
def test_basic_add(sess):
@@ -166,16 +168,16 @@ def test_platform_timer(temp_dir, board, west_cmd,
tvm_debug):
assert result.mean > 0
assert len(result.results) == 3
- with _make_add_sess(temp_dir, model, board, west_cmd, build_config) as
sess:
+ with _make_add_sess(workspace_dir, model, board, west_cmd, build_config)
as sess:
test_basic_add(sess)
@tvm.testing.requires_micro
@pytest.mark.skip_boards(["mps2_an521"])
-def test_relay(temp_dir, board, west_cmd, tvm_debug):
+def test_relay(workspace_dir, board, west_cmd, microtvm_debug):
"""Testing a simple relay graph"""
model = test_utils.ZEPHYR_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
shape = (10,)
dtype = "int8"
@@ -191,7 +193,7 @@ def test_relay(temp_dir, board, west_cmd, tvm_debug):
with tvm.transform.PassContext(opt_level=3,
config={"tir.disable_vectorize": True}):
mod = tvm.relay.build(ir_mod, target=target, runtime=runtime)
- with _make_session(temp_dir, board, west_cmd, mod, build_config) as
session:
+ with _make_session(workspace_dir, board, west_cmd, mod, build_config) as
session:
graph_mod = tvm.micro.create_local_graph_executor(
mod.get_graph_json(), session.get_system_lib(), session.device
)
@@ -205,10 +207,10 @@ def test_relay(temp_dir, board, west_cmd, tvm_debug):
@tvm.testing.requires_micro
@pytest.mark.skip_boards(["mps2_an521"])
-def test_onnx(temp_dir, board, west_cmd, tvm_debug):
+def test_onnx(workspace_dir, board, west_cmd, microtvm_debug):
"""Testing a simple ONNX model."""
model = test_utils.ZEPHYR_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
this_dir = pathlib.Path(os.path.dirname(__file__))
mnist_testdata = this_dir.parent / "testdata" / "mnist"
@@ -237,7 +239,7 @@ def test_onnx(temp_dir, board, west_cmd, tvm_debug):
lowered = relay.build(relay_mod, target, params=params,
executor=executor, runtime=runtime)
graph = lowered.get_graph_json()
- with _make_session(temp_dir, board, west_cmd, lowered, build_config) as
session:
+ with _make_session(workspace_dir, board, west_cmd, lowered, build_config)
as session:
graph_mod = tvm.micro.create_local_graph_executor(
graph, session.get_system_lib(), session.device
)
@@ -286,10 +288,10 @@ def check_result(
@tvm.testing.requires_micro
@pytest.mark.skip_boards(["mps2_an521"])
-def test_byoc_microtvm(temp_dir, board, west_cmd, tvm_debug):
+def test_byoc_microtvm(workspace_dir, board, west_cmd, microtvm_debug):
"""This is a simple test case to check BYOC capabilities of microTVM"""
model = test_utils.ZEPHYR_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
x = relay.var("x", shape=(10, 10))
w0 = relay.var("w0", shape=(10, 10))
w1 = relay.var("w1", shape=(10, 10))
@@ -329,7 +331,7 @@ def test_byoc_microtvm(temp_dir, board, west_cmd,
tvm_debug):
map_inputs = {"w{}".format(i): w_data[i] for i in range(8)}
map_inputs["x"] = x_data
check_result(
- temp_dir=temp_dir,
+ temp_dir=workspace_dir,
relay_mod=mod,
map_inputs=map_inputs,
out_shape=(30, 10),
@@ -367,10 +369,10 @@ def _make_add_sess_with_shape(temp_dir, model,
zephyr_board, west_cmd, shape, bu
)
@tvm.testing.requires_micro
@pytest.mark.skip_boards(["mps2_an521"])
-def test_rpc_large_array(temp_dir, board, west_cmd, tvm_debug, shape):
+def test_rpc_large_array(workspace_dir, board, west_cmd, microtvm_debug,
shape):
"""Test large RPC array transfer."""
model = test_utils.ZEPHYR_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
# NOTE: run test in a nested function so cPython will delete arrays before
closing the session.
def test_tensors(sess):
@@ -381,20 +383,22 @@ def test_rpc_large_array(temp_dir, board, west_cmd,
tvm_debug, shape):
C_data = tvm.nd.array(np.zeros(shape, dtype="int8"),
device=sess.device)
assert (C_data.numpy() == np.zeros(shape)).all()
- with _make_add_sess_with_shape(temp_dir, model, board, west_cmd, shape,
build_config) as sess:
+ with _make_add_sess_with_shape(
+ workspace_dir, model, board, west_cmd, shape, build_config
+ ) as sess:
test_tensors(sess)
@pytest.mark.xfail(strict=False, reason="See
https://github.com/apache/tvm/issues/10297")
@tvm.testing.requires_micro
-def test_autotune_conv2d(temp_dir, board, west_cmd, tvm_debug):
+def test_autotune_conv2d(workspace_dir, board, west_cmd, microtvm_debug):
"""Test AutoTune for microTVM Zephyr"""
if board != "qemu_x86":
pytest.xfail(f"Autotune fails on {board}.")
runtime = Runtime("crt", {"system-lib": True})
model = test_utils.ZEPHYR_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
# Create a Relay model
data_shape = (1, 3, 16, 16)
@@ -513,12 +517,12 @@ def test_autotune_conv2d(temp_dir, board, west_cmd,
tvm_debug):
@tvm.testing.requires_micro
-def test_schedule_build_with_cmsis_dependency(temp_dir, board, west_cmd,
tvm_debug):
+def test_schedule_build_with_cmsis_dependency(workspace_dir, board, west_cmd,
microtvm_debug):
"""Test Relay schedule with CMSIS dependency. This test shows if microTVM
Auto tuning
with Zephyr breaks if CMSIS dependency was required for a schedule.
"""
model = test_utils.ZEPHYR_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
target = tvm.target.target.micro(model, options=["-keys=arm_cpu,cpu"])
isa = arm_isa.IsaAnalyzer(target)
@@ -555,7 +559,7 @@ def test_schedule_build_with_cmsis_dependency(temp_dir,
board, west_cmd, tvm_deb
"cmsis_path": os.getenv("CMSIS_PATH"),
}
- project_dir = temp_dir / "project"
+ project_dir = workspace_dir / "project"
project = tvm.micro.generate_project(
str(test_utils.TEMPLATE_PROJECT_DIR),
mod,
diff --git a/tests/micro/zephyr/test_zephyr_aot_exec.py
b/tests/micro/zephyr/test_zephyr_aot_exec.py
index 9bf1a7fc06..054a06aa02 100644
--- a/tests/micro/zephyr/test_zephyr_aot_exec.py
+++ b/tests/micro/zephyr/test_zephyr_aot_exec.py
@@ -38,7 +38,7 @@ from tvm._ffi import get_global_func, register_func
import test_utils
-def _make_session(temp_dir, zephyr_board, west_cmd, mod, build_config):
+def _make_session(workspace_dir, zephyr_board, west_cmd, mod, build_config):
config_main_stack_size = None
if test_utils.qemu_boards(zephyr_board):
# fyi: qemu_riscv64 seems to be the greediest stack user
@@ -59,7 +59,7 @@ def _make_session(temp_dir, zephyr_board, west_cmd, mod,
build_config):
project = tvm.micro.generate_project(
str(test_utils.TEMPLATE_PROJECT_DIR),
mod,
- temp_dir / "project",
+ workspace_dir / "project",
project_options,
)
project.build()
@@ -69,11 +69,11 @@ def _make_session(temp_dir, zephyr_board, west_cmd, mod,
build_config):
@tvm.testing.requires_micro
@pytest.mark.skip_boards(["mps2_an521"])
-def test_relay(temp_dir, board, west_cmd, tvm_debug):
+def test_relay(workspace_dir, board, west_cmd, microtvm_debug):
"""Testing a simple relay graph"""
model = test_utils.ZEPHYR_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
shape = (10,)
dtype = "int8"
@@ -90,7 +90,7 @@ def test_relay(temp_dir, board, west_cmd, tvm_debug):
with tvm.transform.PassContext(opt_level=3,
config={"tir.disable_vectorize": True}):
mod = tvm.relay.build(ir_mod, target=target, runtime=runtime,
executor=executor)
- with _make_session(temp_dir, board, west_cmd, mod, build_config) as
session:
+ with _make_session(workspace_dir, board, west_cmd, mod, build_config) as
session:
aot_executor =
tvm.runtime.executor.aot_executor.AotModule(session.create_aot_executor())
@@ -103,11 +103,11 @@ def test_relay(temp_dir, board, west_cmd, tvm_debug):
@tvm.testing.requires_micro
@pytest.mark.skip_boards(["mps2_an521"])
-def test_aot_executor(temp_dir, board, west_cmd, tvm_debug):
+def test_aot_executor(workspace_dir, board, west_cmd, microtvm_debug):
"""Test use of the AOT executor with microTVM."""
model = test_utils.ZEPHYR_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
shape = (10,)
dtype = "int8"
@@ -154,7 +154,7 @@ def test_aot_executor(temp_dir, board, west_cmd, tvm_debug):
aot_executor.set_input("b", B_np_new)
assert (B_data.numpy() == B_np_new).all()
- with _make_session(temp_dir, board, west_cmd, mod, build_config) as
session:
+ with _make_session(workspace_dir, board, west_cmd, mod, build_config) as
session:
do_test()
diff --git a/tests/micro/zephyr/test_zephyr_aot_exec_standalone.py
b/tests/micro/zephyr/test_zephyr_aot_exec_standalone.py
index 3d509f100d..da9d63216f 100644
--- a/tests/micro/zephyr/test_zephyr_aot_exec_standalone.py
+++ b/tests/micro/zephyr/test_zephyr_aot_exec_standalone.py
@@ -39,12 +39,12 @@ import test_utils
@tvm.testing.requires_micro
@pytest.mark.skip_boards(["mps2_an521"])
-def test_tflite(temp_dir, board, west_cmd, tvm_debug):
+def test_tflite(workspace_dir, board, west_cmd, microtvm_debug):
"""Testing a TFLite model."""
model = test_utils.ZEPHYR_BOARDS[board]
input_shape = (1, 49, 10, 1)
output_shape = (1, 12)
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
model_url =
"https://github.com/tlc-pack/web-data/raw/25fe99fb00329a26bd37d3dca723da94316fd34c/testdata/microTVM/model/keyword_spotting_quant.tflite"
model_path = download_testdata(model_url, "keyword_spotting_quant.tflite",
module="model")
@@ -78,7 +78,7 @@ def test_tflite(temp_dir, board, west_cmd, tvm_debug):
sample = np.load(sample_path)
project, _ = test_utils.generate_project(
- temp_dir,
+ workspace_dir,
board,
west_cmd,
lowered,
@@ -95,13 +95,13 @@ def test_tflite(temp_dir, board, west_cmd, tvm_debug):
@tvm.testing.requires_micro
@pytest.mark.skip_boards(["mps2_an521"])
-def test_qemu_make_fail(temp_dir, board, west_cmd, tvm_debug):
+def test_qemu_make_fail(workspace_dir, board, west_cmd, microtvm_debug):
"""Testing QEMU make fail."""
if board not in ["qemu_x86", "mps2_an521", "mps3_an547"]:
pytest.skip(msg="Only for QEMU targets.")
model = test_utils.ZEPHYR_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
shape = (10,)
dtype = "float32"
@@ -120,7 +120,15 @@ def test_qemu_make_fail(temp_dir, board, west_cmd,
tvm_debug):
sample = np.zeros(shape=shape, dtype=dtype)
project, project_dir = test_utils.generate_project(
- temp_dir, board, west_cmd, lowered, build_config, sample, shape,
dtype, load_cmsis=False
+ workspace_dir,
+ board,
+ west_cmd,
+ lowered,
+ build_config,
+ sample,
+ shape,
+ dtype,
+ load_cmsis=False,
)
file_path = (
diff --git a/tests/micro/zephyr/test_zephyr_armv7m.py
b/tests/micro/zephyr/test_zephyr_armv7m.py
index c629403ced..1f6a1a1bc1 100644
--- a/tests/micro/zephyr/test_zephyr_armv7m.py
+++ b/tests/micro/zephyr/test_zephyr_armv7m.py
@@ -104,7 +104,7 @@ def _apply_desired_layout_no_simd(relay_mod):
@tvm.testing.requires_micro
@pytest.mark.skip_boards(["mps2_an521"])
-def test_armv7m_intrinsic(temp_dir, board, west_cmd, tvm_debug):
+def test_armv7m_intrinsic(workspace_dir, board, west_cmd, microtvm_debug):
"""Testing a ARM v7m SIMD extension."""
if board not in [
@@ -118,7 +118,7 @@ def test_armv7m_intrinsic(temp_dir, board, west_cmd,
tvm_debug):
model = test_utils.ZEPHYR_BOARDS[board]
- build_config = {"debug": tvm_debug}
+ build_config = {"debug": microtvm_debug}
this_dir = pathlib.Path(os.path.dirname(__file__))
testdata_dir = this_dir.parent / "testdata" / "mnist"
@@ -137,11 +137,11 @@ def test_armv7m_intrinsic(temp_dir, board, west_cmd,
tvm_debug):
executor = Executor("aot", {"unpacked-api": True, "interface-api": "c"})
runtime = Runtime("crt")
- temp_dir_simd = temp_dir / "simd"
- temp_dir_no_simd = temp_dir / "nosimd"
+ workspace_dir_simd = workspace_dir / "simd"
+ workspace_dir_no_simd = workspace_dir / "nosimd"
- os.makedirs(temp_dir_simd, exist_ok=True)
- os.makedirs(temp_dir_no_simd, exist_ok=True)
+ os.makedirs(workspace_dir_simd, exist_ok=True)
+ os.makedirs(workspace_dir_no_simd, exist_ok=True)
with tvm.transform.PassContext(opt_level=3,
config={"tir.disable_vectorize": True}):
lowered_simd = relay.build(
@@ -152,7 +152,7 @@ def test_armv7m_intrinsic(temp_dir, board, west_cmd,
tvm_debug):
)
simd_project, _ = test_utils.generate_project(
- temp_dir_simd,
+ workspace_dir_simd,
board,
west_cmd,
lowered_simd,
@@ -165,7 +165,7 @@ def test_armv7m_intrinsic(temp_dir, board, west_cmd,
tvm_debug):
result_simd, time_simd = test_utils.run_model(simd_project)
no_simd_project, _ = test_utils.generate_project(
- temp_dir_no_simd,
+ workspace_dir_no_simd,
board,
west_cmd,
lowered_no_simd,
diff --git a/tests/scripts/task_python_microtvm.sh
b/tests/scripts/task_python_microtvm.sh
index 13a910eb2b..0bac8021b0 100755
--- a/tests/scripts/task_python_microtvm.sh
+++ b/tests/scripts/task_python_microtvm.sh
@@ -24,22 +24,22 @@ source tests/scripts/setup-pytest-env.sh
make cython3
# Zephyr
-run_pytest ctypes python-microtvm-zephyr-qemu_x86 tests/micro/zephyr
--zephyr-board=qemu_x86
-run_pytest ctypes python-microtvm-zephyr-qemu_riscv32 tests/micro/zephyr
--zephyr-board=qemu_riscv32
-run_pytest ctypes python-microtvm-zephyr-qemu_riscv64 tests/micro/zephyr
--zephyr-board=qemu_riscv64
-run_pytest ctypes python-microtvm-zephyr-mps2_an521 tests/micro/zephyr
--zephyr-board=mps2_an521
+run_pytest ctypes python-microtvm-zephyr-qemu_x86 tests/micro/zephyr
--board=qemu_x86
+run_pytest ctypes python-microtvm-zephyr-qemu_riscv32 tests/micro/zephyr
--board=qemu_riscv32
+run_pytest ctypes python-microtvm-zephyr-qemu_riscv64 tests/micro/zephyr
--board=qemu_riscv64
+run_pytest ctypes python-microtvm-zephyr-mps2_an521 tests/micro/zephyr
--board=mps2_an521
# Arduino
run_pytest ctypes python-microtvm-arduino
apps/microtvm/arduino/template_project/tests
-run_pytest ctypes python-microtvm-arduino-nano33ble tests/micro/arduino
--test-build-only --arduino-board=nano33ble
-run_pytest ctypes python-microtvm-arduino-due tests/micro/arduino
--test-build-only --arduino-board=due
+run_pytest ctypes python-microtvm-arduino-nano33ble tests/micro/arduino
--board=nano33ble --test-build-only
+run_pytest ctypes python-microtvm-arduino-due tests/micro/arduino --board=due
--test-build-only
# STM32
run_pytest ctypes python-microtvm-stm32 tests/micro/stm32
# Common Tests
run_pytest ctypes python-microtvm-common-qemu_x86 tests/micro/common
--platform=zephyr --board=qemu_x86
-run_pytest ctypes python-microtvm-common-due tests/micro/common
--platform=arduino --test-build-only --board=due
+run_pytest ctypes python-microtvm-common-due tests/micro/common
--platform=arduino --board=due --test-build-only
# Tutorials
python3 gallery/how_to/work_with_microtvm/micro_tflite.py