From 0e5b51bc2a83345a243d9f1e5b9ef99243af1f97 Mon Sep 17 00:00:00 2001 From: Andrew Reusch Date: Wed, 31 Mar 2021 09:31:12 -0700 Subject: [PATCH 01/20] update to zephyr 2.5 --- apps/microtvm/reference-vm/zephyr/base-box/setup.sh | 10 +++++----- apps/microtvm/zephyr/demo_runtime/src/main.c | 8 ++++---- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/microtvm/reference-vm/zephyr/base-box/setup.sh b/apps/microtvm/reference-vm/zephyr/base-box/setup.sh index 7299ceae6ad8..66346ba3d7b0 100644 --- a/apps/microtvm/reference-vm/zephyr/base-box/setup.sh +++ b/apps/microtvm/reference-vm/zephyr/base-box/setup.sh @@ -81,17 +81,17 @@ pip3 install --user -U west echo 'export PATH=$HOME/.local/bin:"$PATH"' >> ~/.profile source ~/.profile echo PATH=$PATH -west init --mr v2.4.0 ~/zephyr +west init --mr v2.5.0 ~/zephyr cd ~/zephyr west update west zephyr-export cd ~ echo "Downloading zephyr SDK..." -wget --no-verbose https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.11.3/zephyr-sdk-0.11.3-setup.run -chmod +x zephyr-sdk-0.11.3-setup.run -./zephyr-sdk-0.11.3-setup.run -- -d ~/zephyr-sdk -y -rm -rf zephyr-sdk-0.11.3-setup.run +wget --no-verbose https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.12.3/zephyr-sdk-0.12.3-x86_64-linux-setup.run +chmod +x zephyr-sdk-0.12.3-x86_64-linux-setup.run +./zephyr-sdk-0.12.3-x86_64-linux-setup.run -- -d ~/zephyr-sdk -y +rm -rf zephyr-sdk-0.12.3-x86_64-linux-setup.run # GDB for Zephyr SDK depends on python3.8 sudo add-apt-repository ppa:deadsnakes/ppa diff --git a/apps/microtvm/zephyr/demo_runtime/src/main.c b/apps/microtvm/zephyr/demo_runtime/src/main.c index e2aa59af7ad9..d3e341d75c69 100644 --- a/apps/microtvm/zephyr/demo_runtime/src/main.c +++ b/apps/microtvm/zephyr/demo_runtime/src/main.c @@ -127,18 +127,18 @@ tvm_crt_error_t TVMPlatformGenerateRandom(uint8_t* buffer, size_t num_bytes) { return kTvmErrorNoError; } -// Memory pool for use by TVMPlatformMemoryAllocate. -K_MEM_POOL_DEFINE(tvm_memory_pool, 64, 1024, 216, 4); +// Heap for use by TVMPlatformMemoryAllocate. +K_HEAP_DEFINE(tvm_heap, 216 * 1024); // Called by TVM to allocate memory. tvm_crt_error_t TVMPlatformMemoryAllocate(size_t num_bytes, DLDevice dev, void** out_ptr) { - *out_ptr = k_mem_pool_malloc(&tvm_memory_pool, num_bytes); + *out_ptr = k_heap_aligned_alloc(&tvm_heap, sizeof(int), num_bytes, K_NO_WAIT); return (*out_ptr == NULL) ? kTvmErrorPlatformNoMemory : kTvmErrorNoError; } // Called by TVM to deallocate memory. tvm_crt_error_t TVMPlatformMemoryFree(void* ptr, DLDevice dev) { - k_free(ptr); + k_heap_free(&tvm_heap, ptr); return kTvmErrorNoError; } From 5204e2d56cdd599998dc037f6806c307f6b046d9 Mon Sep 17 00:00:00 2001 From: Andrew Reusch Date: Wed, 31 Mar 2021 09:32:21 -0700 Subject: [PATCH 02/20] unbreak test_zephyr --- apps/microtvm/reference-vm/zephyr/base-box/test-config.json | 4 ++-- apps/microtvm/reference-vm/zephyr/setup.sh | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/microtvm/reference-vm/zephyr/base-box/test-config.json b/apps/microtvm/reference-vm/zephyr/base-box/test-config.json index 0d266797f04d..1a39d34c7e64 100644 --- a/apps/microtvm/reference-vm/zephyr/base-box/test-config.json +++ b/apps/microtvm/reference-vm/zephyr/base-box/test-config.json @@ -2,11 +2,11 @@ "stm32f746xx": { "vid_hex": "0483", "pid_hex": "374b", - "test_cmd": ["pytest", "tests/micro/qemu/test_zephyr.py", "--microtvm-platforms=stm32f746xx"] + "test_cmd": ["pytest", "tests/micro/zephyr/test_zephyr.py", "--microtvm-platforms=stm32f746xx"] }, "nrf5340dk": { "vid_hex": "1366", "pid_hex": "1055", - "test_cmd": ["pytest", "tests/micro/qemu/test_zephyr.py", "--microtvm-platforms=nrf5340dk"] + "test_cmd": ["pytest", "tests/micro/zephyr/test_zephyr.py", "--microtvm-platforms=nrf5340dk"] } } diff --git a/apps/microtvm/reference-vm/zephyr/setup.sh b/apps/microtvm/reference-vm/zephyr/setup.sh index 053e41e85256..5988fb061571 100644 --- a/apps/microtvm/reference-vm/zephyr/setup.sh +++ b/apps/microtvm/reference-vm/zephyr/setup.sh @@ -36,7 +36,7 @@ echo "on your network connection and the state of PyPI) as dependencies are" echo "downloaded and cached for future use." echo "------------------------------[ TVM Message ]------------------------------" poetry lock -vvv -poetry install +poetry install -E importer-onnx # onnx needed for tests/micro/zephyr/test_zephyr.py poetry run pip3 install -r ~/zephyr/zephyr/scripts/requirements.txt echo "export TVM_LIBRARY_PATH=\"$TVM_HOME\"/build-microtvm" >>~/.profile From 31b9287d7d62e1cf79066538f02871e7896d7a39 Mon Sep 17 00:00:00 2001 From: Andrew Reusch Date: Wed, 31 Mar 2021 19:37:47 -0700 Subject: [PATCH 03/20] fix stack size --- .../microtvm/zephyr/demo_runtime/boards/nucleo_f746zg.conf | 7 ++++--- apps/microtvm/zephyr/demo_runtime/boards/qemu_x86.conf | 1 + apps/microtvm/zephyr/demo_runtime/prj.conf | 1 + 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/apps/microtvm/zephyr/demo_runtime/boards/nucleo_f746zg.conf b/apps/microtvm/zephyr/demo_runtime/boards/nucleo_f746zg.conf index 5931377d55ae..bea60d838504 100644 --- a/apps/microtvm/zephyr/demo_runtime/boards/nucleo_f746zg.conf +++ b/apps/microtvm/zephyr/demo_runtime/boards/nucleo_f746zg.conf @@ -20,11 +20,12 @@ # For intrinsics used by generated optimized operators. CONFIG_CMSIS_DSP=y -# Required for Cortex-M33 devices. -CONFIG_MAIN_STACK_SIZE=50 - # For random number generation. CONFIG_ENTROPY_GENERATOR=y # For debugging. CONFIG_LED=y + +# for fused_nn_contrib_conv2d_NCHWc_add_nn_relu_1, which stack-allocates a +# large float array. +CONFIG_MAIN_STACK_SIZE=1536 diff --git a/apps/microtvm/zephyr/demo_runtime/boards/qemu_x86.conf b/apps/microtvm/zephyr/demo_runtime/boards/qemu_x86.conf index e0e4ae2fb2d3..7ba7b0d2e983 100644 --- a/apps/microtvm/zephyr/demo_runtime/boards/qemu_x86.conf +++ b/apps/microtvm/zephyr/demo_runtime/boards/qemu_x86.conf @@ -21,3 +21,4 @@ CONFIG_TEST_RANDOM_GENERATOR=y CONFIG_TIMER_RANDOM_GENERATOR=y +CONFIG_MAIN_STACK_SIZE=1536 diff --git a/apps/microtvm/zephyr/demo_runtime/prj.conf b/apps/microtvm/zephyr/demo_runtime/prj.conf index bf2b330e35a6..28e7e19c4f9d 100644 --- a/apps/microtvm/zephyr/demo_runtime/prj.conf +++ b/apps/microtvm/zephyr/demo_runtime/prj.conf @@ -34,3 +34,4 @@ CONFIG_FPU=y # For TVMPlatformAbort(). CONFIG_REBOOT=y +CONFIG_DEBUG=y From 09288ca2a0f5760c8ae68848ecd50709f425e49f Mon Sep 17 00:00:00 2001 From: Andrew Reusch Date: Wed, 31 Mar 2021 19:38:01 -0700 Subject: [PATCH 04/20] always create packer.log --- apps/microtvm/reference-vm/base-box-tool.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/apps/microtvm/reference-vm/base-box-tool.py b/apps/microtvm/reference-vm/base-box-tool.py index dbf05f016f67..1eb827d26b76 100644 --- a/apps/microtvm/reference-vm/base-box-tool.py +++ b/apps/microtvm/reference-vm/base-box-tool.py @@ -205,12 +205,11 @@ def build_command(args): os.path.join(THIS_DIR, args.platform, "base-box", "packer.json"), args.provider or ALL_PROVIDERS, ) - env = None + env = copy.copy(os.environ) packer_args = ["packer", "build"] + env["PACKER_LOG"] = "1" + env["PACKER_LOG_PATH"] = "packer.log" if args.debug_packer: - env = copy.copy(os.environ) - env["PACKER_LOG"] = "1" - env["PACKER_LOG_PATH"] = "packer.log" packer_args += ["-debug"] packer_args += ["packer.json"] From 9244303f51fc320c0e7523e9337c6d434e05965a Mon Sep 17 00:00:00 2001 From: Andrew Reusch Date: Wed, 31 Mar 2021 19:38:17 -0700 Subject: [PATCH 05/20] add qemu debugging --- .../demo_runtime/qemu-hack/qemu-system-i386 | 4 ++ python/tvm/micro/contrib/zephyr.py | 58 +++++++++++++++++-- 2 files changed, 58 insertions(+), 4 deletions(-) diff --git a/apps/microtvm/zephyr/demo_runtime/qemu-hack/qemu-system-i386 b/apps/microtvm/zephyr/demo_runtime/qemu-hack/qemu-system-i386 index a0bf0f2c4dee..eb4e12c4f2f8 100755 --- a/apps/microtvm/zephyr/demo_runtime/qemu-hack/qemu-system-i386 +++ b/apps/microtvm/zephyr/demo_runtime/qemu-hack/qemu-system-i386 @@ -30,4 +30,8 @@ while [ "$#" -gt 0 ]; do shift done +if [ "${TVM_QEMU_DEBUG}" != "" ]; then + ARGS=( "${ARGS[@]}" -s -S ) +fi + "${ARGS[@]}" diff --git a/python/tvm/micro/contrib/zephyr.py b/python/tvm/micro/contrib/zephyr.py index 104d955835a1..5bc50dab59a1 100644 --- a/python/tvm/micro/contrib/zephyr.py +++ b/python/tvm/micro/contrib/zephyr.py @@ -18,9 +18,11 @@ """Defines a compiler integration that uses an externally-supplied Zephyr project.""" import collections +import copy import logging import multiprocessing import os +import pathlib import re import tempfile import textwrap @@ -428,12 +430,28 @@ def _get_device_args(self, cmake_entries): f"runner {flash_runner}" ) + def _zephyr_transport(self, micro_binary): + qemu_debugger = None + if self._debug_rpc_session: + qemu_debugger = debugger.RpcDebugger( + self._debug_rpc_session, + debugger.DebuggerFactory( + QemuGdbDebugger, + ( + micro_binary.abspath(micro_binary.debug_files[0]), + ), + {}, + ), + ) + + return ZephyrQemuTransport(micro_binary.base_dir, startup_timeout_sec=30.0, debugger=qemu_debugger) + def flash(self, micro_binary): cmake_entries = read_cmake_cache( micro_binary.abspath(micro_binary.labelled_files["cmake_cache"][0]) ) if "qemu" in cmake_entries["BOARD"]: - return ZephyrQemuTransport(micro_binary.base_dir, startup_timeout_sec=30.0) + return self._zephyr_transport(micro_binary) build_dir = os.path.dirname( micro_binary.abspath(micro_binary.labelled_files["cmake_cache"][0]) @@ -532,6 +550,22 @@ def transport(self, micro_binary): ) +class QemuGdbDebugger(debugger.GdbDebugger): + + def __init__(self, elf_file): + super(QemuGdbDebugger, self).__init__() + self._elf_file = elf_file + + def popen_kwargs(self): + # expect self._elf file to follow the form .../zephyr/zephyr.elf + cmake_cache_path = ( + pathlib.Path(self._elf_file).parent.parent / "CMakeCache.txt") + cmake_cache = read_cmake_cache(cmake_cache_path) + return { + "args": [cmake_cache["CMAKE_GDB"], "-ex", "target remote localhost:1234", "-ex", f"file {self._elf_file}"], + } + + class QemuStartupFailureError(Exception): """Raised when the qemu pipe is not present within startup_timeout_sec.""" @@ -571,19 +605,20 @@ def write(self, data, timeout_sec): class ZephyrQemuTransport(Transport): """The user-facing Zephyr QEMU transport class.""" - def __init__(self, base_dir, startup_timeout_sec=5.0, **kwargs): + def __init__(self, base_dir, startup_timeout_sec=5.0, debugger=None, **kwargs): self.base_dir = base_dir self.startup_timeout_sec = startup_timeout_sec self.kwargs = kwargs self.proc = None self.fd_transport = None self.pipe_dir = None + self.debugger = debugger def timeouts(self): return TransportTimeouts( session_start_retry_timeout_sec=2.0, session_start_timeout_sec=self.startup_timeout_sec, - session_established_timeout_sec=5.0, + session_established_timeout_sec=5.0 if self.debugger is None else 0, ) def open(self): @@ -593,11 +628,23 @@ def open(self): self.read_pipe = os.path.join(self.pipe_dir, "fifo.out") os.mkfifo(self.write_pipe) os.mkfifo(self.read_pipe) + if self.debugger is not None: + if 'env' in self.kwargs: + self.kwargs["env"] = copy.copy(self.kwargs["env"]) + else: + self.kwargs["env"] = copy.copy(os.environ) + + self.kwargs["env"]["TVM_QEMU_DEBUG"] = "1" + self.proc = subprocess.Popen( ["make", "run", f"QEMU_PIPE={self.pipe}"], cwd=self.base_dir, **self.kwargs, ) + + if self.debugger is not None: + self.debugger.start() + # NOTE: although each pipe is unidirectional, open both as RDWR to work around a select # limitation on linux. Without this, non-blocking I/O can't use timeouts because named # FIFO are always considered ready to read when no one has opened them for writing. @@ -612,6 +659,9 @@ def open(self): self.fd_transport.open() def close(self): + if self.debugger is not None: + self.debugger.stop() + if self.fd_transport is not None: self.fd_transport.child_transport.write_monitor_quit() self.proc.wait() @@ -653,7 +703,7 @@ def popen_kwargs(self): args = dict( args=self._west_cmd + [ - "attach", + "debug", "--skip-rebuild", "--build-dir", self._build_dir, From 5d4ab587a761e0e0ada029e9fb44e80404019d3a Mon Sep 17 00:00:00 2001 From: Andrew Reusch Date: Wed, 31 Mar 2021 19:38:31 -0700 Subject: [PATCH 06/20] fix transport with debug false --- python/tvm/micro/transport/file_descriptor.py | 9 +++++++-- python/tvm/micro/transport/serial.py | 5 ++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/python/tvm/micro/transport/file_descriptor.py b/python/tvm/micro/transport/file_descriptor.py index 6df6cd425eff..58c4026f6704 100644 --- a/python/tvm/micro/transport/file_descriptor.py +++ b/python/tvm/micro/transport/file_descriptor.py @@ -86,8 +86,13 @@ def read(self, n, timeout_sec): end_time = None if timeout_sec is None else time.monotonic() + timeout_sec - self._await_ready([self.read_fd], [], end_time=end_time) - to_return = os.read(self.read_fd, n) + while True: + self._await_ready([self.read_fd], [], end_time=end_time) + try: + to_return = os.read(self.read_fd, n) + break + except BlockingIOError: + pass if not to_return: self.close() diff --git a/python/tvm/micro/transport/serial.py b/python/tvm/micro/transport/serial.py index b72dee1397b1..dc107d68abc2 100644 --- a/python/tvm/micro/transport/serial.py +++ b/python/tvm/micro/transport/serial.py @@ -92,7 +92,10 @@ def close(self): def read(self, n, timeout_sec): if timeout_sec is None: self._port.timeout = None - return self._port.read(n) + in_waiting = self._port.in_waiting + if in_waiting > 0: + return self._port.read(min(n, in_waiting)) + return self._port.read(1) end_time = time.monotonic() + timeout_sec to_return = bytearray() From e18f02343dc40d59b25d2a9c346f84b31e5a0c5a Mon Sep 17 00:00:00 2001 From: Andrew Reusch Date: Wed, 31 Mar 2021 19:38:44 -0700 Subject: [PATCH 07/20] size down ring buf, shouldn't need to be so large --- apps/microtvm/zephyr/demo_runtime/src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/microtvm/zephyr/demo_runtime/src/main.c b/apps/microtvm/zephyr/demo_runtime/src/main.c index d3e341d75c69..673ade717307 100644 --- a/apps/microtvm/zephyr/demo_runtime/src/main.c +++ b/apps/microtvm/zephyr/demo_runtime/src/main.c @@ -214,7 +214,7 @@ tvm_crt_error_t TVMPlatformTimerStop(double* elapsed_time_seconds) { } // Ring buffer used to store data read from the UART on rx interrupt. -#define RING_BUF_SIZE_BYTES 4 * 1024 +#define RING_BUF_SIZE_BYTES 1 * 1024 RING_BUF_DECLARE(uart_rx_rbuf, RING_BUF_SIZE_BYTES); // Small buffer used to read data from the UART into the ring buffer. From 9d4977140145d96d2631ddfe52d7fa0099c84305 Mon Sep 17 00:00:00 2001 From: Andrew Reusch Date: Wed, 31 Mar 2021 19:38:56 -0700 Subject: [PATCH 08/20] update to zephyr 2.5 --- docker/install/ubuntu_install_zephyr.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker/install/ubuntu_install_zephyr.sh b/docker/install/ubuntu_install_zephyr.sh index 1654ab9d1c09..3c376a1566d8 100644 --- a/docker/install/ubuntu_install_zephyr.sh +++ b/docker/install/ubuntu_install_zephyr.sh @@ -55,7 +55,7 @@ pip3 install west #EOF #chmod a+x /usr/local/bin/west -west init --mr v2.4.0 /opt/zephyrproject +west init --mr v2.5.0 /opt/zephyrproject cd /opt/zephyrproject west update @@ -72,7 +72,7 @@ west zephyr-export #/opt/west/bin/pip3 install -r /opt/zephyrproject/zephyr/scripts/requirements.txt pip3 install -r /opt/zephyrproject/zephyr/scripts/requirements.txt -SDK_VERSION=0.11.3 +SDK_VERSION=0.12.3 wget --no-verbose \ https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${SDK_VERSION}/zephyr-sdk-${SDK_VERSION}-setup.run chmod +x zephyr-sdk-${SDK_VERSION}-setup.run From f8002d4743e43bd9a19f16a7ab81e7956afb0c14 Mon Sep 17 00:00:00 2001 From: Mehrdad Hessar Date: Thu, 1 Apr 2021 10:04:09 -0700 Subject: [PATCH 09/20] fix buffer size --- apps/microtvm/reference-vm/zephyr/base-box/setup.sh | 11 +++++++---- apps/microtvm/zephyr/demo_runtime/src/main.c | 4 ++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/apps/microtvm/reference-vm/zephyr/base-box/setup.sh b/apps/microtvm/reference-vm/zephyr/base-box/setup.sh index 66346ba3d7b0..719ee7c154e5 100644 --- a/apps/microtvm/reference-vm/zephyr/base-box/setup.sh +++ b/apps/microtvm/reference-vm/zephyr/base-box/setup.sh @@ -88,10 +88,13 @@ west zephyr-export cd ~ echo "Downloading zephyr SDK..." -wget --no-verbose https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v0.12.3/zephyr-sdk-0.12.3-x86_64-linux-setup.run -chmod +x zephyr-sdk-0.12.3-x86_64-linux-setup.run -./zephyr-sdk-0.12.3-x86_64-linux-setup.run -- -d ~/zephyr-sdk -y -rm -rf zephyr-sdk-0.12.3-x86_64-linux-setup.run +ZEPHYR_SDK_VERSION=0.12.3 +ZEPHYR_SDK_FILE=zephyr-sdk-linux-setup.run +wget --no-verbose -O $ZEPHYR_SDK_FILE \ + https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZEPHYR_SDK_VERSION}/zephyr-sdk-${ZEPHYR_SDK_VERSION}-x86_64-linux-setup.run +chmod +x $ZEPHYR_SDK_FILE +"./$ZEPHYR_SDK_FILE" -- -d ~/zephyr-sdk -y +rm -rf ZEPHYR_SDK_FILE # GDB for Zephyr SDK depends on python3.8 sudo add-apt-repository ppa:deadsnakes/ppa diff --git a/apps/microtvm/zephyr/demo_runtime/src/main.c b/apps/microtvm/zephyr/demo_runtime/src/main.c index 673ade717307..90ebded8d990 100644 --- a/apps/microtvm/zephyr/demo_runtime/src/main.c +++ b/apps/microtvm/zephyr/demo_runtime/src/main.c @@ -214,7 +214,11 @@ tvm_crt_error_t TVMPlatformTimerStop(double* elapsed_time_seconds) { } // Ring buffer used to store data read from the UART on rx interrupt. +#if BOARD == qemu_x86 +#define RING_BUF_SIZE_BYTES 4 * 1024 +#else #define RING_BUF_SIZE_BYTES 1 * 1024 +#endif RING_BUF_DECLARE(uart_rx_rbuf, RING_BUF_SIZE_BYTES); // Small buffer used to read data from the UART into the ring buffer. From 92360f6f7a352bf78246dad1f5b3c22a4664917a Mon Sep 17 00:00:00 2001 From: Mehrdad Hessar Date: Thu, 1 Apr 2021 10:07:15 -0700 Subject: [PATCH 10/20] cleanup --- apps/microtvm/reference-vm/base-box-tool.py | 7 ++-- apps/microtvm/reference-vm/zephyr/setup.sh | 1 - .../demo_runtime/boards/nucleo_f746zg.conf | 3 +- apps/microtvm/zephyr/demo_runtime/prj.conf | 2 - .../demo_runtime/qemu-hack/qemu-system-i386 | 4 -- python/tvm/micro/contrib/zephyr.py | 38 +------------------ tests/micro/zephyr/test_zephyr.py | 2 +- 7 files changed, 8 insertions(+), 49 deletions(-) diff --git a/apps/microtvm/reference-vm/base-box-tool.py b/apps/microtvm/reference-vm/base-box-tool.py index 1eb827d26b76..dbf05f016f67 100644 --- a/apps/microtvm/reference-vm/base-box-tool.py +++ b/apps/microtvm/reference-vm/base-box-tool.py @@ -205,11 +205,12 @@ def build_command(args): os.path.join(THIS_DIR, args.platform, "base-box", "packer.json"), args.provider or ALL_PROVIDERS, ) - env = copy.copy(os.environ) + env = None packer_args = ["packer", "build"] - env["PACKER_LOG"] = "1" - env["PACKER_LOG_PATH"] = "packer.log" if args.debug_packer: + env = copy.copy(os.environ) + env["PACKER_LOG"] = "1" + env["PACKER_LOG_PATH"] = "packer.log" packer_args += ["-debug"] packer_args += ["packer.json"] diff --git a/apps/microtvm/reference-vm/zephyr/setup.sh b/apps/microtvm/reference-vm/zephyr/setup.sh index 5988fb061571..7311e5cf260a 100644 --- a/apps/microtvm/reference-vm/zephyr/setup.sh +++ b/apps/microtvm/reference-vm/zephyr/setup.sh @@ -36,7 +36,6 @@ echo "on your network connection and the state of PyPI) as dependencies are" echo "downloaded and cached for future use." echo "------------------------------[ TVM Message ]------------------------------" poetry lock -vvv -poetry install -E importer-onnx # onnx needed for tests/micro/zephyr/test_zephyr.py poetry run pip3 install -r ~/zephyr/zephyr/scripts/requirements.txt echo "export TVM_LIBRARY_PATH=\"$TVM_HOME\"/build-microtvm" >>~/.profile diff --git a/apps/microtvm/zephyr/demo_runtime/boards/nucleo_f746zg.conf b/apps/microtvm/zephyr/demo_runtime/boards/nucleo_f746zg.conf index bea60d838504..678d1d89943d 100644 --- a/apps/microtvm/zephyr/demo_runtime/boards/nucleo_f746zg.conf +++ b/apps/microtvm/zephyr/demo_runtime/boards/nucleo_f746zg.conf @@ -26,6 +26,5 @@ CONFIG_ENTROPY_GENERATOR=y # For debugging. CONFIG_LED=y -# for fused_nn_contrib_conv2d_NCHWc_add_nn_relu_1, which stack-allocates a -# large float array. +# For operations that stack-allocates a large float array. CONFIG_MAIN_STACK_SIZE=1536 diff --git a/apps/microtvm/zephyr/demo_runtime/prj.conf b/apps/microtvm/zephyr/demo_runtime/prj.conf index 28e7e19c4f9d..5f4d7a0689dc 100644 --- a/apps/microtvm/zephyr/demo_runtime/prj.conf +++ b/apps/microtvm/zephyr/demo_runtime/prj.conf @@ -33,5 +33,3 @@ CONFIG_FPU=y # For TVMPlatformAbort(). CONFIG_REBOOT=y - -CONFIG_DEBUG=y diff --git a/apps/microtvm/zephyr/demo_runtime/qemu-hack/qemu-system-i386 b/apps/microtvm/zephyr/demo_runtime/qemu-hack/qemu-system-i386 index eb4e12c4f2f8..a0bf0f2c4dee 100755 --- a/apps/microtvm/zephyr/demo_runtime/qemu-hack/qemu-system-i386 +++ b/apps/microtvm/zephyr/demo_runtime/qemu-hack/qemu-system-i386 @@ -30,8 +30,4 @@ while [ "$#" -gt 0 ]; do shift done -if [ "${TVM_QEMU_DEBUG}" != "" ]; then - ARGS=( "${ARGS[@]}" -s -S ) -fi - "${ARGS[@]}" diff --git a/python/tvm/micro/contrib/zephyr.py b/python/tvm/micro/contrib/zephyr.py index 5bc50dab59a1..4b3d1e9c6e08 100644 --- a/python/tvm/micro/contrib/zephyr.py +++ b/python/tvm/micro/contrib/zephyr.py @@ -18,11 +18,9 @@ """Defines a compiler integration that uses an externally-supplied Zephyr project.""" import collections -import copy import logging import multiprocessing import os -import pathlib import re import tempfile import textwrap @@ -430,28 +428,12 @@ def _get_device_args(self, cmake_entries): f"runner {flash_runner}" ) - def _zephyr_transport(self, micro_binary): - qemu_debugger = None - if self._debug_rpc_session: - qemu_debugger = debugger.RpcDebugger( - self._debug_rpc_session, - debugger.DebuggerFactory( - QemuGdbDebugger, - ( - micro_binary.abspath(micro_binary.debug_files[0]), - ), - {}, - ), - ) - - return ZephyrQemuTransport(micro_binary.base_dir, startup_timeout_sec=30.0, debugger=qemu_debugger) - def flash(self, micro_binary): cmake_entries = read_cmake_cache( micro_binary.abspath(micro_binary.labelled_files["cmake_cache"][0]) ) if "qemu" in cmake_entries["BOARD"]: - return self._zephyr_transport(micro_binary) + return ZephyrQemuTransport(micro_binary.base_dir, startup_timeout_sec=30.0) build_dir = os.path.dirname( micro_binary.abspath(micro_binary.labelled_files["cmake_cache"][0]) @@ -550,22 +532,6 @@ def transport(self, micro_binary): ) -class QemuGdbDebugger(debugger.GdbDebugger): - - def __init__(self, elf_file): - super(QemuGdbDebugger, self).__init__() - self._elf_file = elf_file - - def popen_kwargs(self): - # expect self._elf file to follow the form .../zephyr/zephyr.elf - cmake_cache_path = ( - pathlib.Path(self._elf_file).parent.parent / "CMakeCache.txt") - cmake_cache = read_cmake_cache(cmake_cache_path) - return { - "args": [cmake_cache["CMAKE_GDB"], "-ex", "target remote localhost:1234", "-ex", f"file {self._elf_file}"], - } - - class QemuStartupFailureError(Exception): """Raised when the qemu pipe is not present within startup_timeout_sec.""" @@ -605,7 +571,7 @@ def write(self, data, timeout_sec): class ZephyrQemuTransport(Transport): """The user-facing Zephyr QEMU transport class.""" - def __init__(self, base_dir, startup_timeout_sec=5.0, debugger=None, **kwargs): + def __init__(self, base_dir, startup_timeout_sec=5.0, **kwargs): self.base_dir = base_dir self.startup_timeout_sec = startup_timeout_sec self.kwargs = kwargs diff --git a/tests/micro/zephyr/test_zephyr.py b/tests/micro/zephyr/test_zephyr.py index 1db3d505f490..21ff9acf59e2 100644 --- a/tests/micro/zephyr/test_zephyr.py +++ b/tests/micro/zephyr/test_zephyr.py @@ -62,7 +62,7 @@ def _make_session(model, target, zephyr_board, west_cmd, mod): test_name = f"{os.path.splitext(os.path.abspath(__file__))[0]}-{model}" prev_build = f"{test_name}-last-build.micro-binary" workspace_root = ( - f'{test_name}-workspace/{datetime.datetime.now().strftime("%Y-%m-%dT%H-%M-%S")}' + f'{test_name}_workspace/{datetime.datetime.now().strftime("%Y-%m-%dT%H-%M-%S")}' ) workspace_parent = os.path.dirname(workspace_root) if not os.path.exists(workspace_parent): From 86e98e3a6f6b31378c09c163d48df3f87b8d7700 Mon Sep 17 00:00:00 2001 From: Mehrdad Hessar Date: Thu, 1 Apr 2021 10:47:14 -0700 Subject: [PATCH 11/20] cleanup --- apps/microtvm/zephyr/demo_runtime/boards/nucleo_f746zg.conf | 6 +++--- apps/microtvm/zephyr/demo_runtime/prj.conf | 2 ++ tests/micro/zephyr/test_zephyr.py | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/microtvm/zephyr/demo_runtime/boards/nucleo_f746zg.conf b/apps/microtvm/zephyr/demo_runtime/boards/nucleo_f746zg.conf index 678d1d89943d..253ba43d8b36 100644 --- a/apps/microtvm/zephyr/demo_runtime/boards/nucleo_f746zg.conf +++ b/apps/microtvm/zephyr/demo_runtime/boards/nucleo_f746zg.conf @@ -20,11 +20,11 @@ # For intrinsics used by generated optimized operators. CONFIG_CMSIS_DSP=y +# For operations that stack allocates a large float array. +CONFIG_MAIN_STACK_SIZE=1536 + # For random number generation. CONFIG_ENTROPY_GENERATOR=y # For debugging. CONFIG_LED=y - -# For operations that stack-allocates a large float array. -CONFIG_MAIN_STACK_SIZE=1536 diff --git a/apps/microtvm/zephyr/demo_runtime/prj.conf b/apps/microtvm/zephyr/demo_runtime/prj.conf index 5f4d7a0689dc..28e7e19c4f9d 100644 --- a/apps/microtvm/zephyr/demo_runtime/prj.conf +++ b/apps/microtvm/zephyr/demo_runtime/prj.conf @@ -33,3 +33,5 @@ CONFIG_FPU=y # For TVMPlatformAbort(). CONFIG_REBOOT=y + +CONFIG_DEBUG=y diff --git a/tests/micro/zephyr/test_zephyr.py b/tests/micro/zephyr/test_zephyr.py index 21ff9acf59e2..5c5803c4af1b 100644 --- a/tests/micro/zephyr/test_zephyr.py +++ b/tests/micro/zephyr/test_zephyr.py @@ -59,7 +59,7 @@ def _make_sess_from_op(model, zephyr_board, west_cmd, op_name, sched, arg_bufs): def _make_session(model, target, zephyr_board, west_cmd, mod): - test_name = f"{os.path.splitext(os.path.abspath(__file__))[0]}-{model}" + test_name = f"{os.path.splitext(os.path.abspath(__file__))[0]}_{model}" prev_build = f"{test_name}-last-build.micro-binary" workspace_root = ( f'{test_name}_workspace/{datetime.datetime.now().strftime("%Y-%m-%dT%H-%M-%S")}' From 927ba46b41ee408fa6ba079683098edde5b9210b Mon Sep 17 00:00:00 2001 From: Mehrdad Hessar Date: Thu, 1 Apr 2021 10:54:43 -0700 Subject: [PATCH 12/20] remove debugger --- apps/microtvm/reference-vm/zephyr/setup.sh | 1 + python/tvm/micro/contrib/zephyr.py | 17 +---------------- 2 files changed, 2 insertions(+), 16 deletions(-) diff --git a/apps/microtvm/reference-vm/zephyr/setup.sh b/apps/microtvm/reference-vm/zephyr/setup.sh index 7311e5cf260a..053e41e85256 100644 --- a/apps/microtvm/reference-vm/zephyr/setup.sh +++ b/apps/microtvm/reference-vm/zephyr/setup.sh @@ -36,6 +36,7 @@ echo "on your network connection and the state of PyPI) as dependencies are" echo "downloaded and cached for future use." echo "------------------------------[ TVM Message ]------------------------------" poetry lock -vvv +poetry install poetry run pip3 install -r ~/zephyr/zephyr/scripts/requirements.txt echo "export TVM_LIBRARY_PATH=\"$TVM_HOME\"/build-microtvm" >>~/.profile diff --git a/python/tvm/micro/contrib/zephyr.py b/python/tvm/micro/contrib/zephyr.py index 4b3d1e9c6e08..e1d44dddbb37 100644 --- a/python/tvm/micro/contrib/zephyr.py +++ b/python/tvm/micro/contrib/zephyr.py @@ -578,13 +578,12 @@ def __init__(self, base_dir, startup_timeout_sec=5.0, **kwargs): self.proc = None self.fd_transport = None self.pipe_dir = None - self.debugger = debugger def timeouts(self): return TransportTimeouts( session_start_retry_timeout_sec=2.0, session_start_timeout_sec=self.startup_timeout_sec, - session_established_timeout_sec=5.0 if self.debugger is None else 0, + session_established_timeout_sec=5.0, ) def open(self): @@ -594,23 +593,12 @@ def open(self): self.read_pipe = os.path.join(self.pipe_dir, "fifo.out") os.mkfifo(self.write_pipe) os.mkfifo(self.read_pipe) - if self.debugger is not None: - if 'env' in self.kwargs: - self.kwargs["env"] = copy.copy(self.kwargs["env"]) - else: - self.kwargs["env"] = copy.copy(os.environ) - - self.kwargs["env"]["TVM_QEMU_DEBUG"] = "1" - self.proc = subprocess.Popen( ["make", "run", f"QEMU_PIPE={self.pipe}"], cwd=self.base_dir, **self.kwargs, ) - if self.debugger is not None: - self.debugger.start() - # NOTE: although each pipe is unidirectional, open both as RDWR to work around a select # limitation on linux. Without this, non-blocking I/O can't use timeouts because named # FIFO are always considered ready to read when no one has opened them for writing. @@ -625,9 +613,6 @@ def open(self): self.fd_transport.open() def close(self): - if self.debugger is not None: - self.debugger.stop() - if self.fd_transport is not None: self.fd_transport.child_transport.write_monitor_quit() self.proc.wait() From d55741a99a9da65f3a345e89c62b6dc178e6b5c4 Mon Sep 17 00:00:00 2001 From: Mehrdad Hessar Date: Thu, 1 Apr 2021 11:00:50 -0700 Subject: [PATCH 13/20] nit --- python/tvm/micro/contrib/zephyr.py | 1 - 1 file changed, 1 deletion(-) diff --git a/python/tvm/micro/contrib/zephyr.py b/python/tvm/micro/contrib/zephyr.py index e1d44dddbb37..271ab1ec606c 100644 --- a/python/tvm/micro/contrib/zephyr.py +++ b/python/tvm/micro/contrib/zephyr.py @@ -598,7 +598,6 @@ def open(self): cwd=self.base_dir, **self.kwargs, ) - # NOTE: although each pipe is unidirectional, open both as RDWR to work around a select # limitation on linux. Without this, non-blocking I/O can't use timeouts because named # FIFO are always considered ready to read when no one has opened them for writing. From 6cf1f4614c6d64da0f5e408bca22341f08cea9de Mon Sep 17 00:00:00 2001 From: Mehrdad Hessar Date: Thu, 1 Apr 2021 13:45:12 -0700 Subject: [PATCH 14/20] update ci script --- docker/install/ubuntu_install_zephyr.sh | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docker/install/ubuntu_install_zephyr.sh b/docker/install/ubuntu_install_zephyr.sh index 3c376a1566d8..ff2d842769cb 100644 --- a/docker/install/ubuntu_install_zephyr.sh +++ b/docker/install/ubuntu_install_zephyr.sh @@ -72,8 +72,9 @@ west zephyr-export #/opt/west/bin/pip3 install -r /opt/zephyrproject/zephyr/scripts/requirements.txt pip3 install -r /opt/zephyrproject/zephyr/scripts/requirements.txt -SDK_VERSION=0.12.3 -wget --no-verbose \ - https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${SDK_VERSION}/zephyr-sdk-${SDK_VERSION}-setup.run -chmod +x zephyr-sdk-${SDK_VERSION}-setup.run -./zephyr-sdk-${SDK_VERSION}-setup.run -- -d /opt/zephyr-sdk +ZEPHYR_SDK_VERSION=0.12.3 +ZEPHYR_SDK_FILE=zephyr-sdk-linux-setup.run +wget --no-verbose -O $ZEPHYR_SDK_FILE \ + https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZEPHYR_SDK_VERSION}/zephyr-sdk-${ZEPHYR_SDK_VERSION}-x86_64-linux-setup.run +chmod +x $ZEPHYR_SDK_FILE +"./$ZEPHYR_SDK_FILE" -- -d /opt/zephyr-sdk From ede42f6faaad4d11d6c046951acb2e8916942944 Mon Sep 17 00:00:00 2001 From: Mehrdad Hessar Date: Thu, 1 Apr 2021 16:21:06 -0700 Subject: [PATCH 15/20] remove debug mode --- apps/microtvm/zephyr/demo_runtime/prj.conf | 2 -- 1 file changed, 2 deletions(-) diff --git a/apps/microtvm/zephyr/demo_runtime/prj.conf b/apps/microtvm/zephyr/demo_runtime/prj.conf index 28e7e19c4f9d..5f4d7a0689dc 100644 --- a/apps/microtvm/zephyr/demo_runtime/prj.conf +++ b/apps/microtvm/zephyr/demo_runtime/prj.conf @@ -33,5 +33,3 @@ CONFIG_FPU=y # For TVMPlatformAbort(). CONFIG_REBOOT=y - -CONFIG_DEBUG=y From 9dc379bcf6161828390c4851ddd651b2d3134f34 Mon Sep 17 00:00:00 2001 From: Mehrdad Hessar Date: Thu, 1 Apr 2021 16:21:32 -0700 Subject: [PATCH 16/20] fix packer log --- apps/microtvm/reference-vm/base-box-tool.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) mode change 100644 => 100755 apps/microtvm/reference-vm/base-box-tool.py diff --git a/apps/microtvm/reference-vm/base-box-tool.py b/apps/microtvm/reference-vm/base-box-tool.py old mode 100644 new mode 100755 index dbf05f016f67..1eb827d26b76 --- a/apps/microtvm/reference-vm/base-box-tool.py +++ b/apps/microtvm/reference-vm/base-box-tool.py @@ -205,12 +205,11 @@ def build_command(args): os.path.join(THIS_DIR, args.platform, "base-box", "packer.json"), args.provider or ALL_PROVIDERS, ) - env = None + env = copy.copy(os.environ) packer_args = ["packer", "build"] + env["PACKER_LOG"] = "1" + env["PACKER_LOG_PATH"] = "packer.log" if args.debug_packer: - env = copy.copy(os.environ) - env["PACKER_LOG"] = "1" - env["PACKER_LOG_PATH"] = "packer.log" packer_args += ["-debug"] packer_args += ["packer.json"] From 7241c7b9b3871752ab1a8eaac4d15d6b7f9a3301 Mon Sep 17 00:00:00 2001 From: Mehrdad Hessar Date: Thu, 1 Apr 2021 16:49:56 -0700 Subject: [PATCH 17/20] comment --- apps/microtvm/zephyr/demo_runtime/boards/qemu_x86.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/microtvm/zephyr/demo_runtime/boards/qemu_x86.conf b/apps/microtvm/zephyr/demo_runtime/boards/qemu_x86.conf index 7ba7b0d2e983..f314f59a597a 100644 --- a/apps/microtvm/zephyr/demo_runtime/boards/qemu_x86.conf +++ b/apps/microtvm/zephyr/demo_runtime/boards/qemu_x86.conf @@ -21,4 +21,5 @@ CONFIG_TEST_RANDOM_GENERATOR=y CONFIG_TIMER_RANDOM_GENERATOR=y +# Default stack size is 1k, this is required for debug mode. CONFIG_MAIN_STACK_SIZE=1536 From 9941632e63b50080ee8ed8d62195ef09aa7c103c Mon Sep 17 00:00:00 2001 From: Mehrdad Hessar Date: Thu, 1 Apr 2021 16:58:29 -0700 Subject: [PATCH 18/20] update ci_qemu --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index f7fc6e4e2178..4caf24c5242c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -49,7 +49,7 @@ ci_gpu = "tlcpack/ci-gpu:v0.72" ci_cpu = "tlcpack/ci-cpu:v0.73" ci_wasm = "tlcpack/ci-wasm:v0.70" ci_i386 = "tlcpack/ci-i386:v0.72-t0" -ci_qemu = "tlcpack/ci-qemu:v0.02" +ci_qemu = "tlcpack/ci-qemu:v0.03" ci_arm = "tlcpack/ci-arm:v0.03" // <--- End of regex-scanned config. From 9ffd377970e066a7665aa7f0c558f09fd08a48b4 Mon Sep 17 00:00:00 2001 From: Mehrdad Hessar Date: Fri, 2 Apr 2021 09:20:40 -0700 Subject: [PATCH 19/20] change zephyr version on Vagrant --- apps/microtvm/reference-vm/zephyr/Vagrantfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/microtvm/reference-vm/zephyr/Vagrantfile b/apps/microtvm/reference-vm/zephyr/Vagrantfile index b7f9e4d2363d..376568f68115 100644 --- a/apps/microtvm/reference-vm/zephyr/Vagrantfile +++ b/apps/microtvm/reference-vm/zephyr/Vagrantfile @@ -16,7 +16,7 @@ # under the License. Vagrant.configure("2") do |config| - config.vm.box = "tlcpack/microtvm-zephyr" + config.vm.box = "tlcpack/microtvm-zephyr-2.5" tvm_home = "../../../.." dirs_to_mount = [Pathname.new(Pathname.new(tvm_home).expand_path())] From 273af923cd4db40fed310438d05a4928264a8b84 Mon Sep 17 00:00:00 2001 From: Mehrdad Hessar Date: Fri, 2 Apr 2021 12:31:44 -0700 Subject: [PATCH 20/20] make it compatible to zephyr 2.4 --- apps/microtvm/zephyr/demo_runtime/src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/microtvm/zephyr/demo_runtime/src/main.c b/apps/microtvm/zephyr/demo_runtime/src/main.c index 90ebded8d990..fc94e65d740a 100644 --- a/apps/microtvm/zephyr/demo_runtime/src/main.c +++ b/apps/microtvm/zephyr/demo_runtime/src/main.c @@ -132,7 +132,7 @@ K_HEAP_DEFINE(tvm_heap, 216 * 1024); // Called by TVM to allocate memory. tvm_crt_error_t TVMPlatformMemoryAllocate(size_t num_bytes, DLDevice dev, void** out_ptr) { - *out_ptr = k_heap_aligned_alloc(&tvm_heap, sizeof(int), num_bytes, K_NO_WAIT); + *out_ptr = k_heap_alloc(&tvm_heap, num_bytes, K_NO_WAIT); return (*out_ptr == NULL) ? kTvmErrorPlatformNoMemory : kTvmErrorNoError; }