Skip to content

Commit

Permalink
Merge branch 'main' into aluo/onnx/sceloss
Browse files Browse the repository at this point in the history
* main: (102 commits)
  Implementation of relay_to_tir target hook (apache#8423)
  [Onnx] Fix NLL Loss tests (apache#8971)
  [Bugfix] Fix other div zero errors also in rewrite_simplify (apache#8983)
  [ONNX] enable the onnx tests after PR apache#8274 merged (apache#9019)
  [Hexagon] Disable `thread_local` on Hexagon (apache#9025)
  [Hexagon] Allow undefined symbols in libtvm_runtime.so on Hexagon (apache#9024)
  [Onnx] Add momentum (apache#9000)
  fix (apache#9021)
  [Community] @AndrewZhaoLuo -> Reviewer (apache#9020)
  [Hexagon] Implement model launcher (apache#8986)
  [Relay][Pass] Add ExtractOperators pass (apache#8996)
  [BYOC][TensorRT] Add TensorRT own int8 calibration support to TensorRT BYOC integration (apache#8808)
  [ONNX] Add Einsum converter (apache#8985)
  Add standalone_crt/ to be part of the wheel package, when available. (apache#9005)
  [Relay] Remove memory planing from LowerTEPass  (apache#8974)
  [Hexagon] Treat floats as float32 when passing args to offloaded kernels (apache#9010)
  [Runtime] Pipeline Executor Initial patch. (apache#8702)
  [Hexagon] `llvm-options` attribute is an array of strings (apache#9011)
  disable cuda int8 schedule for non-cuda gpu target (apache#9014)
  [Torch] Add an option to make imported models compatible with the Relay text parser (apache#9015)
  ...
  • Loading branch information
AndrewZhaoLuo committed Sep 16, 2021
2 parents d677eb8 + be37923 commit 6d3aeb8
Show file tree
Hide file tree
Showing 356 changed files with 22,224 additions and 4,501 deletions.
24 changes: 12 additions & 12 deletions .github/CODEOWNERS
Validating CODEOWNERS rules …
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,9 @@ tests/** @comaniac @junrushao1994 @tqchen @jroesch @areusch @yzhliu @merrymercy
##############################

# automation related
src/auto_scheduler/** @merrymercy @jcf94 @comaniac @junrushao1994 @vinx13
include/tvm/auto_scheduler/** @merrymercy @jcf94 @comaniac @junrushao1994 @vinx13
python/tvm/auto_scheduler/** @merrymercy @jcf94 @comaniac @junrushao1994 @vinx13
src/auto_scheduler/** @merrymercy @jcf94 @comaniac @junrushao1994 @vinx13 @Hzfengsy
include/tvm/auto_scheduler/** @merrymercy @jcf94 @comaniac @junrushao1994 @vinx13 @Hzfengsy
python/tvm/auto_scheduler/** @merrymercy @jcf94 @comaniac @junrushao1994 @vinx13 @Hzfengsy

python/tvm/autotvm/** @merrymercy @jcf94 @comaniac @junrushao1994 @vinx13

Expand All @@ -94,9 +94,9 @@ include/tvm/ir/** @junrushao1994 @vinx13 @tqchen @jroesch @comaniac
python/tvm/ir/** @junrushao1994 @vinx13 @tqchen @jroesch @comaniac

# tir
src/tir/** @junrushao1994 @vinx13 @tqchen @kparzysz-quic @ZihengJiang @masahi @were
include/tvm/tir/** @junrushao1994 @vinx13 @tqchen @kparzysz-quic @ZihengJiang @masahi @were
python/tvm/tir/** @junrushao1994 @vinx13 @tqchen @kparzysz-quic @ZihengJiang @masahi @were
src/tir/** @junrushao1994 @vinx13 @tqchen @kparzysz-quic @ZihengJiang @masahi @were @Hzfengsy
include/tvm/tir/** @junrushao1994 @vinx13 @tqchen @kparzysz-quic @ZihengJiang @masahi @were @Hzfengsy
python/tvm/tir/** @junrushao1994 @vinx13 @tqchen @kparzysz-quic @ZihengJiang @masahi @were @Hzfengsy

# te
src/te/** @junrushao1994 @vinx13 @tqchen @kparzysz-quic @ZihengJiang @masahi @were
Expand All @@ -122,11 +122,11 @@ include/tvm/runtime/** @vinx13 @tqchen @FronzenGene @liangfu @areusch @tmoreau8
python/tvm/runtime/** @vinx13 @tqchen @FronzenGene @liangfu @areusch @tmoreau89 @ajtulloch @masahi @kazum @ZihengJiang @junrushao1994

# runtime/micro
src/runtime/micro/** @areusch @liangfu @tmoreau89
src/runtime/crt/** @areusch @liangfu @tmoreau89
include/tvm/runtime/crt/** @areusch @liangfu @tmoreau89
include/tvm/runtime/micro/** @areusch @liangfu @tmoreau89
python/tvm/micro/** @areusch @liangfu @tmoreau89
src/runtime/micro/** @areusch @liangfu @tmoreau89 @manupa-arm
src/runtime/crt/** @areusch @liangfu @tmoreau89 @manupa-arm
include/tvm/runtime/crt/** @areusch @liangfu @tmoreau89 @manupa-arm
include/tvm/runtime/micro/** @areusch @liangfu @tmoreau89 @manupa-arm
python/tvm/micro/** @areusch @liangfu @tmoreau89 @manupa-arm

# relay
src/relay/** @jroesch @slyubomirsky @icemelon9 @MarisaKirisame @ZihengJiang @yzhliu @vinx13 @mbrookhart @jwfromm @zhiics @anijain2305 @wweic @eqy @junrushao1994
Expand All @@ -140,7 +140,7 @@ inlcude/tvm/relay/qnn/** @jwfromm @anijain2305 @ZihengJiang
python/tvm/relay/qnn/** @jwfromm @anijain2305 @ZihengJiang

# relay/backend/contrib: BYOC
src/relay/backend/contrib/** @zhiics @trevor-m @comaniac @mbaret
src/relay/backend/contrib/** @zhiics @trevor-m @comaniac @mbaret @manupa-arm

# relay/frontends
python/tvm/relay/frontend/** @jwfromm @mbrookhart @srkreddy1238 @siju-samuel @Huyuwei @hlu1 @kazum @PariksheetPinjari909
Expand Down
22 changes: 22 additions & 0 deletions .github/ISSUE_TEMPLATE/documentation.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
name: "\U0001F4C4 Documentation"
about: Use this template to suggest additions and changes to the documentation.
title: "[Docs] "
labels: "type: doc"

---

Thanks for participating in the TVM community! We use https://discuss.tvm.ai for any general usage questions and discussions. The issue tracker is used for actionable items such as feature proposals discussion, roadmaps, and bug tracking. You are always welcomed to post on the forum first :smile_cat:

Issues that are inactive for a period of time may get closed. We adopt this policy so that we won't lose track of actionable issues that may fall at the bottom of the pile. Feel free to reopen a new one if you feel there is an additional problem that needs attention when an old one gets closed.

### Documentation Title & Type

Include the title of the document (e.g. "Getting Started with TVM"), and the type of documentation (e.g. user docs, developer docs, tutorials)

### Additions/Changes Requested

If an RFC/discuss post exists, link it here.

Otherwise, specify what actions should be taken to provide additional clarity/readability/reproducibility to the document. Include code snippets from the previous documentation if applicable.

2 changes: 1 addition & 1 deletion 3rdparty/vta-hw
15 changes: 14 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ tvm_option(HIDE_PRIVATE_SYMBOLS "Compile with -fvisibility=hidden." OFF)
tvm_option(USE_TF_TVMDSOOP "Build with TensorFlow TVMDSOOp" OFF)
tvm_option(USE_FALLBACK_STL_MAP "Use TVM's POD compatible Map" OFF)
tvm_option(USE_ETHOSN "Build with Arm Ethos-N" OFF)
tvm_option(USE_CMSISNN "Build with Arm CMSIS-NN" OFF)
tvm_option(INDEX_DEFAULT_I64 "Defaults the index datatype to int64" ON)
tvm_option(USE_LIBBACKTRACE "Build libbacktrace to supply linenumbers on stack traces" AUTO)
tvm_option(BUILD_STATIC_RUNTIME "Build static version of libtvm_runtime" OFF)
Expand Down Expand Up @@ -304,9 +305,12 @@ if(BUILD_FOR_HEXAGON)
# static one.
if(NOT BUILD_STATIC_RUNTIME)
list(APPEND RUNTIME_SRCS src/runtime/hexagon/hexagon_posix.cc)
# Allow undefined symbols (there will be some from libc).
set(TVM_NO_UNDEFINED_SYMBOLS "")
endif()

add_definitions(-D_MACH_I32=int)
add_definitions(-DDMLC_CXX11_THREAD_LOCAL=0)
endif()

# Package runtime rules
Expand Down Expand Up @@ -357,7 +361,7 @@ endif(USE_GRAPH_EXECUTOR)

# convert old options for profiler
if(USE_GRAPH_EXECUTOR_DEBUG)
message(WARNING "USE_GRAPH_EXECUTOR renamed to USE_PROFILER. Please update your config.cmake")
message(WARNING "USE_GRAPH_EXECUTOR_DEBUG renamed to USE_PROFILER. Please update your config.cmake")
unset(USE_GRAPH_EXECUTOR_DEBUG CACHE)
set(USE_PROFILER ON)
endif()
Expand Down Expand Up @@ -388,6 +392,12 @@ if(GTEST_INCLUDE_DIR AND GTEST_LIB)
include(GoogleTest)
endif()

if(USE_PIPELINE_EXECUTOR)
message(STATUS "Build with Pipeline Executor support...")
file(GLOB RUNTIME_PIPELINE_SRCS src/runtime/pipeline/*.cc)
list(APPEND RUNTIME_SRCS ${RUNTIME_PIPELINE_SRCS})
endif(USE_PIPELINE_EXECUTOR)

# Module rules
include(cmake/modules/VTA.cmake)
include(cmake/modules/StandaloneCrt.cmake)
Expand All @@ -401,9 +411,12 @@ include(cmake/modules/ROCM.cmake)
include(cmake/modules/LLVM.cmake)
include(cmake/modules/Micro.cmake)
include(cmake/modules/contrib/EthosN.cmake)
include(cmake/modules/contrib/CMSISNN.cmake)
include(cmake/modules/contrib/EthosU.cmake)
include(cmake/modules/contrib/BLAS.cmake)
include(cmake/modules/contrib/CODEGENC.cmake)
include(cmake/modules/contrib/DNNL.cmake)
include(cmake/modules/contrib/ExampleTargetHooks.cmake)
include(cmake/modules/contrib/Random.cmake)
include(cmake/modules/contrib/Posit.cmake)
include(cmake/modules/contrib/MicroStandaloneRuntime.cmake)
Expand Down
2 changes: 2 additions & 0 deletions CONTRIBUTORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ We do encourage everyone to work anything they are interested in.
- [Krzysztof Parzyszek](https://github.com/kparzysz-quic): @kparzysz-quic - hexagon, llvm
- [Andrew Reusch](https://github.com/areusch): @areusch - runtime, microTVM
- [Jared Roesch](https://github.com/jroesch) (PMC): @jroesch - relay
- [Giuseppe Rossini](https://github.com/giuseros): @giuseros - aot, arm
- [Siju Samuel](https://github.com/siju-samuel): @siju-samuel - frontends
- [Junru Shao](https://github.com/junrushao1994) (PMC): @junrushao1994 - relay, compiler
- [Haichen Shen](https://github.com/icemelon9) (PMC): @icemelon9 - relay, topi
Expand Down Expand Up @@ -107,6 +108,7 @@ We do encourage everyone to work anything they are interested in.
- [Yizhi Liu](https://github.com/yzhliu) : @yzhliu
- [Hao Lu](https://github.com/hlu1): @hlu1
- [Eric Lunderberg](https://github.com/Lunderberg): @Lunderberg
- [Andrew Z. Luo](https://github.com/AndrewZhaoLuo): @AndrewZhaoLuo
- [Steven Lyubomirsky](https://github.com/slyubomirsky): @slyubomirsky
- [Masahiro Masuda](https://github.com/masahi): @masahi
- [Sergey Mironov](https://github.com/grwlf): @grwlf
Expand Down
2 changes: 1 addition & 1 deletion apps/bundle_deploy/crt_config/crt_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@
#define TVM_CRT_MAX_REGISTERED_MODULES 2

/*! Size of the global function registry, in bytes. */
#define TVM_CRT_GLOBAL_FUNC_REGISTRY_SIZE_BYTES 200
#define TVM_CRT_GLOBAL_FUNC_REGISTRY_SIZE_BYTES 512

/*! Maximum packet size, in bytes, including the length header. */
#define TVM_CRT_MAX_PACKET_SIZE_BYTES 512
Expand Down
1 change: 1 addition & 0 deletions apps/ios_rpc/tvmrpc/TVMRuntime.mm
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include "TVMRuntime.h"
// Runtime API
#include "../../../src/runtime/c_runtime_api.cc"
#include "../../../src/runtime/contrib/random/random.cc"
#include "../../../src/runtime/cpu_device_api.cc"
#include "../../../src/runtime/dso_library.cc"
#include "../../../src/runtime/file_utils.cc"
Expand Down
2 changes: 1 addition & 1 deletion apps/microtvm/arduino/example_project/src/model.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions apps/microtvm/arduino/host_driven/src/model_support.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
22 changes: 19 additions & 3 deletions apps/microtvm/arduino/template_project/microtvm_api_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,34 +57,40 @@ class BoardAutodetectFailed(Exception):
"package": "arduino",
"architecture": "sam",
"board": "arduino_due_x_dbg",
"model": "sam3x8e",
},
# Due to the way the Feather S2 bootloader works, compilation
# behaves fine but uploads cannot be done automatically
"feathers2": {
"package": "esp32",
"architecture": "esp32",
"board": "feathers2",
"model": "esp32",
},
"metrom4": {
"package": "adafruit",
"architecture": "samd",
"board": "adafruit_metro_m4",
"model": "atsamd51",
},
# Spresense only works as of its v2.3.0 sdk
"spresense": {
"package": "SPRESENSE",
"architecture": "spresense",
"board": "spresense",
"model": "cxd5602gg",
},
"nano33ble": {
"package": "arduino",
"architecture": "mbed_nano",
"board": "nano33ble",
"model": "nrf52840",
},
"pybadge": {
"package": "adafruit",
"architecture": "samd",
"board": "adafruit_pybadge_m4",
"model": "atsamd51",
},
# The Teensy boards are listed here for completeness, but they
# won't work until https://github.com/arduino/arduino-cli/issues/700
Expand All @@ -93,16 +99,19 @@ class BoardAutodetectFailed(Exception):
"package": "teensy",
"architecture": "avr",
"board": "teensy40",
"model": "imxrt1060",
},
"teensy41": {
"package": "teensy",
"architecture": "avr",
"board": "teensy41",
"model": "imxrt1060",
},
"wioterminal": {
"package": "Seeeduino",
"architecture": "samd",
"board": "seeed_wio_terminal",
"model": "atsamd51",
},
}

Expand All @@ -114,6 +123,11 @@ class BoardAutodetectFailed(Exception):
choices=list(BOARD_PROPERTIES),
help="Name of the Arduino board to build for",
),
server.ProjectOption(
"arduino_model",
choices=[board["model"] for _, board in BOARD_PROPERTIES.items()],
help="Name of the model for each Arduino board.",
),
server.ProjectOption("arduino_cli_cmd", help="Path to the arduino-cli tool."),
server.ProjectOption("port", help="Port to use for connecting to hardware"),
server.ProjectOption(
Expand Down Expand Up @@ -370,7 +384,7 @@ def build(self, options):
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")

Expand Down Expand Up @@ -407,7 +421,9 @@ def _parse_boards_tabular_str(self, tabular_str):

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):
Expand Down Expand Up @@ -444,7 +460,7 @@ def flash(self, options):
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
Expand Down
1 change: 1 addition & 0 deletions apps/microtvm/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ tensorflow-estimator = {version = "^2.1", optional = true}
# TFLite frontend
tflite = {version = "2.1.0", optional = true}
wheel = "*"
cloudpickle = "^1.6.0"


[tool.poetry.extras]
Expand Down
6 changes: 3 additions & 3 deletions apps/microtvm/reference-vm/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,14 +78,14 @@ $ ./base-box-tool.py --provider virtualbox build zephyr

B. Run tests:
```bash
$ ./base-box-tool.py [--provider=PROVIDER] test --microtvm-platform=MICROTVM_PLATFORM [--test-device-serial=SERIAL] PLATFORM
$ ./base-box-tool.py [--provider=PROVIDER] test --microtvm-board=MICROTVM_BOARD [--test-device-serial=SERIAL] PLATFORM
```
where MICROTVM_PLATFORM is one of the options listed in the
where MICROTVM_BOARD is one of the options listed in the
PLATFORM/base-box/test-config.json file.

For example:
```base
$ ./base-box-tool.py --provider virtualbox test --microtvm-platform=stm32f746xx_disco zephyr
$ ./base-box-tool.py --provider virtualbox test --microtvm-board=stm32f746g_disco zephyr
```

This command does the following for the specified provider:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,9 @@ cd ~

sudo apt-get install -y ca-certificates

# Install Arduino-CLI (latest version)
# Install Arduino-CLI (specific version)
export PATH="/home/vagrant/bin:$PATH"
wget -O - https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh -s
wget -O - https://raw.githubusercontent.com/arduino/arduino-cli/master/install.sh | sh -s 0.18.3

# Arduino (the CLI and GUI) require the dialout permission for uploading
sudo usermod -a -G dialout $USER
Expand All @@ -45,10 +45,11 @@ ADAFRUIT_BOARDS_URL="https://adafruit.github.io/arduino-board-index/package_adaf
ESP32_BOARDS_URL="https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json"
SPARKFUN_BOARDS_URL="https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json"
SEEED_BOARDS_URL="https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json"
SPRESENSE_BOARDS_URL="https://github.com/sonydevworld/spresense-arduino-compatible/releases/download/generic/package_spresense_index.json"
SPRESENSE_BOARDS_URL="https://github.com/sonydevworld/spresense-arduino-compatible/releases/download/v2.2.1/package_spresense_index.json"
arduino-cli core update-index --additional-urls $ADAFRUIT_BOARDS_URL,$ESP32_BOARDS_URL,$SPARKFUN_BOARDS_URL,$SEEED_BOARDS_URL,$SPRESENSE_BOARDS_URL

# Install supported cores from those URLS
arduino-cli version
arduino-cli core install arduino:mbed_nano
arduino-cli core install arduino:sam
arduino-cli core install adafruit:samd --additional-urls $ADAFRUIT_BOARDS_URL
Expand Down
14 changes: 7 additions & 7 deletions apps/microtvm/reference-vm/arduino/base-box/base_box_test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,25 @@
# specific language governing permissions and limitations
# under the License.
#
# Usage: base_box_test.sh <MICROTVM_PLATFORM>
# Usage: base_box_test.sh <ARDUINO_BOARD>
# Execute microTVM Arduino tests.
#

set -e
set -x

if [ "$#" -lt 1 ]; then
echo "Usage: base_box_test.sh <MICROTVM_PLATFORM>"
echo "Usage: base_box_test.sh <ARDUINO_BOARD>"
exit -1
fi

microtvm_platform=$1
board=$1

pytest tests/micro/arduino/test_arduino_workflow.py --microtvm-platforms=${microtvm_platform}
pytest tests/micro/arduino/test_arduino_workflow.py --arduino-board=${board}

if [ $microtvm_platform == "nano33ble" ]; then
if [ $board == "nano33ble" ]; then
# https://github.com/apache/tvm/issues/8730
echo "NOTE: skipped test_arduino_rpc_server.py on $microtvm_platform -- known failure"
echo "NOTE: skipped test_arduino_rpc_server.py on $board -- known failure"
else
pytest tests/micro/arduino/test_arduino_rpc_server.py --microtvm-platforms=${microtvm_platform}
pytest tests/micro/arduino/test_arduino_rpc_server.py --arduino-board=${board}
fi
5 changes: 3 additions & 2 deletions apps/microtvm/reference-vm/arduino/provision_setup.sh
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ set -ex
# NOTE: TVM is presumed to be mounted already by Vagrantfile.
cd "${TVM_HOME}"

apps/microtvm/reference-vm/rebuild-tvm.sh
platform="arduino"
apps/microtvm/reference-vm/rebuild-tvm.sh ${platform}

# Build poetry
cd apps/microtvm/reference-vm/arduino
Expand All @@ -43,6 +44,6 @@ echo "------------------------------[ TVM Message ]-----------------------------
poetry lock -vvv
poetry install

echo "export TVM_LIBRARY_PATH=\"$TVM_HOME\"/build-microtvm" >>~/.profile
echo "export TVM_LIBRARY_PATH=\"$TVM_HOME\"/build-microtvm-${platform}" >>~/.profile
echo "VENV_PATH=\$((cd \"$TVM_HOME\"/apps/microtvm/reference-vm/arduino && poetry env list --full-path) | sed -E 's/^(.*)[[:space:]]\(Activated\)\$/\1/g')" >>~/.profile
echo "source \$VENV_PATH/bin/activate" >>~/.profile
Loading

0 comments on commit 6d3aeb8

Please sign in to comment.