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 9f52e7e [microTVM] Remove Arduino aot code (#8869)
9f52e7e is described below
commit 9f52e7e3fcb3e607e51b584437857a118fb74609
Author: Gavin Uberti <[email protected]>
AuthorDate: Sat Sep 4 13:48:15 2021 -0400
[microTVM] Remove Arduino aot code (#8869)
* Fix Arduino DLDevice includes
* microtvm_api_server fails if commands fail
* Add regression test for microtvm_api_server not failing
* Address PR comments
Break error detection tests into separate file
Address comments from Mousius
Re-add necessary fixture
---
apps/microtvm/arduino/example_project/src/model.c | 2 +-
.../arduino/host_driven/src/model_support.c | 2 +
.../template_project/microtvm_api_server.py | 8 ++--
tests/micro/arduino/conftest.py | 40 +++++++++++++++++
.../micro/arduino/test_arduino_error_detection.py | 52 ++++++++++++++++++++++
tests/micro/arduino/test_arduino_rpc_server.py | 4 +-
tests/micro/arduino/test_arduino_workflow.py | 46 ++-----------------
7 files changed, 105 insertions(+), 49 deletions(-)
diff --git a/apps/microtvm/arduino/example_project/src/model.c
b/apps/microtvm/arduino/example_project/src/model.c
index 9e7c47f..5536651 100644
--- a/apps/microtvm/arduino/example_project/src/model.c
+++ b/apps/microtvm/arduino/example_project/src/model.c
@@ -20,11 +20,11 @@
#include "model.h"
#include "Arduino.h"
+#include "standalone_crt/include/dlpack/dlpack.h"
#include "standalone_crt/include/tvm/runtime/crt/stack_allocator.h"
// AOT memory array
static uint8_t g_aot_memory[WORKSPACE_SIZE];
-extern tvm_model_t tvmgen_default_network;
tvm_workspace_t app_workspace;
// Blink code for debugging purposes
diff --git a/apps/microtvm/arduino/host_driven/src/model_support.c
b/apps/microtvm/arduino/host_driven/src/model_support.c
index dfcb031..bcc9a10 100644
--- a/apps/microtvm/arduino/host_driven/src/model_support.c
+++ b/apps/microtvm/arduino/host_driven/src/model_support.c
@@ -17,6 +17,8 @@
* under the License.
*/
+#include "standalone_crt/include/dlpack/dlpack.h"
+#include "standalone_crt/include/tvm/runtime/crt/error_codes.h"
#include "stdarg.h"
// Blink code for debugging purposes
diff --git a/apps/microtvm/arduino/template_project/microtvm_api_server.py
b/apps/microtvm/arduino/template_project/microtvm_api_server.py
index 5717717..38fc73c 100644
--- a/apps/microtvm/arduino/template_project/microtvm_api_server.py
+++ b/apps/microtvm/arduino/template_project/microtvm_api_server.py
@@ -370,7 +370,7 @@ class Handler(server.ProjectAPIHandler):
compile_cmd.append("--verbose")
# Specify project to compile
- subprocess.run(compile_cmd)
+ subprocess.run(compile_cmd, check=True)
BOARD_LIST_HEADERS = ("Port", "Type", "Board Name", "FQBN", "Core")
@@ -407,7 +407,9 @@ class Handler(server.ProjectAPIHandler):
def _auto_detect_port(self, options):
list_cmd = [options["arduino_cli_cmd"], "board", "list"]
- list_cmd_output = subprocess.run(list_cmd,
stdout=subprocess.PIPE).stdout.decode("utf-8")
+ list_cmd_output = subprocess.run(
+ list_cmd, check=True, stdout=subprocess.PIPE
+ ).stdout.decode("utf-8")
desired_fqbn = self._get_fqbn(options)
for line in self._parse_boards_tabular_str(list_cmd_output):
@@ -444,7 +446,7 @@ class Handler(server.ProjectAPIHandler):
if options.get("verbose"):
upload_cmd.append("--verbose")
- subprocess.run(upload_cmd)
+ subprocess.run(upload_cmd, check=True)
def open_transport(self, options):
# Zephyr example doesn't throw an error in this case
diff --git a/tests/micro/arduino/conftest.py b/tests/micro/arduino/conftest.py
index aea1381..38870b6 100644
--- a/tests/micro/arduino/conftest.py
+++ b/tests/micro/arduino/conftest.py
@@ -20,6 +20,7 @@ import pathlib
import pytest
import tvm.target.target
+from tvm import micro, relay
# The models that should pass this configuration. Maps a short, identifying
platform string to
# (model, zephyr_board).
@@ -122,3 +123,42 @@ def make_workspace_dir(test_name, platform):
t = tvm.contrib.utils.tempdir(board_workspace)
# time.sleep(200)
return t
+
+
+def make_kws_project(platform, arduino_cli_cmd, tvm_debug, workspace_dir):
+ this_dir = pathlib.Path(__file__).parent
+ model, arduino_board = PLATFORMS[platform]
+ build_config = {"debug": tvm_debug}
+
+ with open(this_dir.parent / "testdata" / "kws" / "yes_no.tflite", "rb") as
f:
+ tflite_model_buf = f.read()
+
+ # TFLite.Model.Model has changed to TFLite.Model from 1.14 to 2.1
+ try:
+ import tflite.Model
+
+ tflite_model = tflite.Model.Model.GetRootAsModel(tflite_model_buf, 0)
+ except AttributeError:
+ import tflite
+
+ tflite_model = tflite.Model.GetRootAsModel(tflite_model_buf, 0)
+
+ mod, params = relay.frontend.from_tflite(tflite_model)
+ target = tvm.target.target.micro(
+ model, options=["--link-params=1", "--unpacked-api=1",
"--executor=aot"]
+ )
+
+ with tvm.transform.PassContext(opt_level=3,
config={"tir.disable_vectorize": True}):
+ mod = relay.build(mod, target, params=params)
+
+ return tvm.micro.generate_project(
+ str(TEMPLATE_PROJECT_DIR),
+ mod,
+ workspace_dir / "project",
+ {
+ "arduino_board": arduino_board,
+ "arduino_cli_cmd": arduino_cli_cmd,
+ "project_type": "example_project",
+ "verbose": bool(build_config.get("debug")),
+ },
+ )
diff --git a/tests/micro/arduino/test_arduino_error_detection.py
b/tests/micro/arduino/test_arduino_error_detection.py
new file mode 100644
index 0000000..1789fff
--- /dev/null
+++ b/tests/micro/arduino/test_arduino_error_detection.py
@@ -0,0 +1,52 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+import pathlib
+import re
+import sys
+
+import pytest
+
+import conftest
+from tvm.micro.project_api.server import ServerError
+
+
+# A new project and workspace dir is created for EVERY test
[email protected]
+def workspace_dir(request, platform):
+ return conftest.make_workspace_dir("arduino_error_detection", platform)
+
+
[email protected]
+def project(platform, arduino_cli_cmd, tvm_debug, workspace_dir):
+ return conftest.make_kws_project(platform, arduino_cli_cmd, tvm_debug,
workspace_dir)
+
+
+def test_blank_project_compiles(workspace_dir, project):
+ project.build()
+
+
+# Add a bug (an extra curly brace) and make sure the project doesn't compile
+def test_bugged_project_compile_fails(workspace_dir, project):
+ with open(workspace_dir / "project" / "project.ino", "a") as main_file:
+ main_file.write("}\n")
+ with pytest.raises(ServerError):
+ project.build()
+
+
+if __name__ == "__main__":
+ sys.exit(pytest.main([__file__] + sys.argv[1:]))
diff --git a/tests/micro/arduino/test_arduino_rpc_server.py
b/tests/micro/arduino/test_arduino_rpc_server.py
index 1b165a0..57ebbc6 100644
--- a/tests/micro/arduino/test_arduino_rpc_server.py
+++ b/tests/micro/arduino/test_arduino_rpc_server.py
@@ -37,8 +37,8 @@ from tvm.relay.testing import byoc
import conftest
-# We'll make a new workspace for each test
[email protected](scope="function")
+# # A new project and workspace dir is created for EVERY test
[email protected]
def workspace_dir(platform):
return conftest.make_workspace_dir("arduino_rpc_server", platform)
diff --git a/tests/micro/arduino/test_arduino_workflow.py
b/tests/micro/arduino/test_arduino_workflow.py
index 101d36f..8980ef3 100644
--- a/tests/micro/arduino/test_arduino_workflow.py
+++ b/tests/micro/arduino/test_arduino_workflow.py
@@ -21,8 +21,6 @@ import shutil
import sys
import pytest
-import tvm
-from tvm import micro, relay
import conftest
@@ -38,7 +36,8 @@ This unit test simulates a simple user workflow, where we:
"""
-# Since these tests are sequential, we'll use the same project for all tests
+# 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, platform):
return conftest.make_workspace_dir("arduino_workflow", platform)
@@ -49,49 +48,10 @@ def project_dir(workspace_dir):
return workspace_dir / "project"
-def _generate_project(arduino_board, arduino_cli_cmd, workspace_dir, mod,
build_config):
- return tvm.micro.generate_project(
- str(conftest.TEMPLATE_PROJECT_DIR),
- mod,
- workspace_dir / "project",
- {
- "arduino_board": arduino_board,
- "arduino_cli_cmd": arduino_cli_cmd,
- "project_type": "example_project",
- "verbose": bool(build_config.get("debug")),
- },
- )
-
-
# We MUST pass workspace_dir, not project_dir, or the workspace will be
dereferenced too soon
@pytest.fixture(scope="module")
def project(platform, arduino_cli_cmd, tvm_debug, workspace_dir):
- this_dir = pathlib.Path(__file__).parent
- model, arduino_board = conftest.PLATFORMS[platform]
- build_config = {"debug": tvm_debug}
-
- with open(this_dir.parent / "testdata" / "kws" / "yes_no.tflite", "rb") as
f:
- tflite_model_buf = f.read()
-
- # TFLite.Model.Model has changed to TFLite.Model from 1.14 to 2.1
- try:
- import tflite.Model
-
- tflite_model = tflite.Model.Model.GetRootAsModel(tflite_model_buf, 0)
- except AttributeError:
- import tflite
-
- tflite_model = tflite.Model.GetRootAsModel(tflite_model_buf, 0)
-
- mod, params = relay.frontend.from_tflite(tflite_model)
- target = tvm.target.target.micro(
- model, options=["--link-params=1", "--unpacked-api=1",
"--executor=aot"]
- )
-
- with tvm.transform.PassContext(opt_level=3,
config={"tir.disable_vectorize": True}):
- mod = relay.build(mod, target, params=params)
-
- return _generate_project(arduino_board, arduino_cli_cmd, workspace_dir,
mod, build_config)
+ return conftest.make_kws_project(platform, arduino_cli_cmd, tvm_debug,
workspace_dir)
def _get_directory_elements(directory):