From f4cdc23c701b57a38b662716634febc93f849254 Mon Sep 17 00:00:00 2001 From: anleeos <2937160075@qq.com> Date: Thu, 7 Dec 2023 17:02:19 +0800 Subject: [PATCH 01/26] update index and add files --- docs/how_to/microtvm/08-micro_pytorch.md | 0 docs/how_to/microtvm/09-micro_mlperftiny.md | 0 docs/how_to/microtvm/10-micro_custom_ide.md | 0 docs/how_to/microtvm/index.md | 12 +++++++----- 4 files changed, 7 insertions(+), 5 deletions(-) create mode 100644 docs/how_to/microtvm/08-micro_pytorch.md create mode 100644 docs/how_to/microtvm/09-micro_mlperftiny.md create mode 100644 docs/how_to/microtvm/10-micro_custom_ide.md diff --git a/docs/how_to/microtvm/08-micro_pytorch.md b/docs/how_to/microtvm/08-micro_pytorch.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/how_to/microtvm/09-micro_mlperftiny.md b/docs/how_to/microtvm/09-micro_mlperftiny.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/how_to/microtvm/10-micro_custom_ide.md b/docs/how_to/microtvm/10-micro_custom_ide.md new file mode 100644 index 00000000..e69de29b diff --git a/docs/how_to/microtvm/index.md b/docs/how_to/microtvm/index.md index 534129a2..922cc79a 100644 --- a/docs/how_to/microtvm/index.md +++ b/docs/how_to/microtvm/index.md @@ -4,10 +4,12 @@ title: 使用 microTVM microTVM 支持在裸机平台(例如,那些没有像 Linux、OS X 或 Windows 这样的传统操作系统的平台)上进行推理。以下演示了如何用 microTVM 调优和部署模型。 -* [microTVM 主机驱动的 AoT](aot) +* [TVMC MicroTVM CLI 工具](tvmc_micro) +* [microTVM TFLite 指南](microtvm_tflite) +* [microTVM AoT 编译](aot) +* [microTVM PyTorch 指南](https://tvm.apache.org/docs/v0.13.0/how_to/work_with_microtvm/micro_aot.html#sphx-glr-how-to-work-with-microtvm-micro-aot-py) +* [在 Arduino 上训练 microTVM 的视觉模型](microtvm_arduino) * [使用 microTVM 自动调优](autotune_microtvm) * [在带有 CMSIS-NN 的 Arm(R) Cortex(R)-M55 CPU 和 Ethos(TM)-U55 NPU 裸机上运行 TVM](tvm_arm) -* [microTVM 虚拟机参考手册](microtvm_vm) -* [带有 TFLite 模型的 microTVM](microtvm_tflite) -* [在 Arduino 上训练 microTVM 的视觉模型](microtvm_arduino) -* [使用 TVMC Micro 执行微型模型](tvmc_micro) \ No newline at end of file +* [使用 microTVM 创建你的 MLPerfTiny 提交](https://tvm.apache.org/docs/v0.13.0/how_to/work_with_microtvm/micro_ethosu.html#sphx-glr-how-to-work-with-microtvm-micro-ethosu-py) +* [开发环境中加入 microTVM](https://tvm.apache.org/docs/v0.13.0/how_to/work_with_microtvm/micro_custom_ide.html#sphx-glr-how-to-work-with-microtvm-micro-custom-ide-py) \ No newline at end of file From 1ef437de490178700fe84daa80b35b1974aea61d Mon Sep 17 00:00:00 2001 From: anleeos <2937160075@qq.com> Date: Thu, 7 Dec 2023 17:03:12 +0800 Subject: [PATCH 02/26] delete microtevm_vm --- docs/how_to/microtvm/04-microtvm_vm.md | 102 ------------------------- 1 file changed, 102 deletions(-) delete mode 100644 docs/how_to/microtvm/04-microtvm_vm.md diff --git a/docs/how_to/microtvm/04-microtvm_vm.md b/docs/how_to/microtvm/04-microtvm_vm.md deleted file mode 100644 index 36473959..00000000 --- a/docs/how_to/microtvm/04-microtvm_vm.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -title: microTVM 虚拟机参考手册 ---- - -# microTVM 虚拟机参考手册 - -:::note -单击 [此处](https://tvm.apache.org/docs/how_to/work_with_microtvm/micro_reference_vm.html#sphx-glr-download-how-to-work-with-microtvm-micro-reference-vm-py) 下载完整的示例代码 -::: - -**作者**:[Andrew Reusch](mailto:areusch%40octoml.ai) - -本教程介绍如何参考虚拟机启动 microTVM,可以使用虚拟机在真实的物理硬件上进行开发,而无需单独安装 microTVM 依赖项,这种方法在使用 microTVM 重现行为时(如提交错误报告)也特别有用。 - -microTVM 使得 TVM 可以在裸机微控制器上构建和执行模型。 它旨在与各种 SoC 和 runtime 环境(即裸机、RTOS 等)兼容,microTVM 虚拟机参考手册可提供稳定环境来允许开发者共享和重现错误及结果。 - -## 工作原理 - -虚拟机没有存储到 TVM 仓库中——然而,`apps/microtvm/reference-vm` 中的文件描述了如何将虚拟机构建到 [Vagrant](https://vagrantup.com/) 虚拟机构建器工具。 - -VMs 参考手册分为两个部分: - -1. Vagrant Base Box 包含该平台的所有稳定依赖,构建脚本存储在 `apps/microtvm/reference-vm//base-box` 中,当平台的“稳定”依赖发生变化时,TVM committers 会运行这些,并且生成的基本 boxes 存储在 [Vagrant Cloud](https://app.vagrantup.com/tlcpack) 中。 -2. 通常用 Base Box 作为起点构建每个工作空间的虚拟机。构建脚本存储在 `apps/microtvm/reference-vm/` (除了 `base-box` 之外的所有内容)。 - -## 设置虚拟机 - -### 安装必要软件 - -确保最少安装以下软件: - -1. [Vagrant](https://vagrantup.com/) -2. 虚拟机监控器(**VirtualBox**、**Parallels** 或 **VMWare Fusion/Workstation**)。推荐使用 [VirtualBox](https://www.virtualbox.org/),它是一个免费的虚拟机监控器,注意,USB 转发需要安装 [VirtualBox 扩展包](https://www.virtualbox.org/wiki/Downloads#VirtualBox6.1.16OracleVMVirtualBoxExtensionPack) 。若使用 VirtualBox,还要安装 [vbguest](https://github.com/dotless-de/vagrant-vbguest) 插件。 -3. 若虚拟机监控器需要,可下载 [Vagrant 提供的插件](https://github.com/hashicorp/vagrant/wiki/Available-Vagrant-Plugins#providers)(或查看 [这里](https://www.vagrantup.com/vmware) 获取 VMWare 相关信息)。 - -### 首次启动 - -首次使用虚拟机参考手册时,要在本地创建 box,并对其进行配置。 - -``` bash -# 如果不使用 Zephyr,将 zephyr 替换为不同平台的名称。 -~/.../tvm $ cd apps/microtvm/reference-vm/zephyr -# 将 替换为要用的管理程序的名称(即 virtualbox、parallels、vmware_desktop)。 -~/.../tvm/apps/microtvm/reference-vm/zephyr $ vagrant up --provider= -``` - -此命令需要几分钟运行,并且需要4到5GB的存储空间,它执行的内容如下: - -1. 下载 [microTVM base box](https://app.vagrantup.com/tlcpack/boxes/microtvm) 并克隆它,形成特定于该 TVM 目录的新虚拟机。 -2. 把 TVM 目录(若使用 `git-subtree`,原始 `.git` 仓库)挂载到虚拟机中。 -3. 构建 TVM 并安装一个 Python virtualenv,其包含的依赖与 TVM 构建相对应。 - -### 将硬件连接到虚拟机 - -接下来配置 USB,将物理开发单板连接到虚拟机(而非直接连接到笔记本电脑的操作系统)。 - -推荐设置一个设备过滤器,而非一次性转发,因为编程时设备可能会重启,此时需要再次启用转发。这样做的好处是最终用户不会明显有感觉。参考教程: - -* [VirtualBox](https://www.virtualbox.org/manual/ch03.html#usb-support) -* [Parallels](https://kb.parallels.com/122993) -* [VMWare Workstation](https://docs.vmware.com/en/VMware-Workstation-Pro/15.0/com.vmware.ws.using.doc/GUID-E003456F-EB94-4B53-9082-293D9617CB5A.html) - -### 在虚拟机参考手册中重建 TVM - -首次启动后,确保在修改 C++ runtime 或 checkout 不同版本时,在 `$TVM_HOME/build-microtvm-zephyr` 中保持构建是最新的。可以重新配置机器(在运行 `vagrant up` 之前在同一目录中运行 `vagrant provision`)或自己手动重建 TVM。 - -注意:在虚拟机中构建的 TVM `.so` 可能与在主机上使用的不同,这就是它被构建在特殊目录 `build-microtvm-zephyr` 中的原因。 - -### 登录虚拟机 - -虚拟机应该仅对主机名为 `microtvm` 的主机可用,通过 SSH 连接到虚拟机: - -``` bash -$ vagrant ssh -``` - -然后 `cd` 到主机上用于 TVM 的相同路径,例如,在 Mac 上: - -``` bash -$ cd /Users/yourusername/path/to/tvm -``` - -## 运行测试 - -配置虚拟机后,可用 `poetry` 执行测试: - -``` bash -$ cd apps/microtvm/reference-vm/zephyr -$ poetry run python3 ../../../../tests/micro/zephyr/test_zephyr.py --zephyr-board=stm32f746g_disco -``` - -若没有连接物理硬件,但要用本地 QEMU 模拟器(在虚拟机中运行)运行测试,使用以下命令: - -``` bash -$ cd /Users/yourusername/path/to/tvm -$ cd apps/microtvm/reference-vm/zephyr/ -$ poetry run pytest ../../../../tests/micro/zephyr/test_zephyr.py --zephyr-board=qemu_x86 -``` - -[下载 Python 源代码:micro_reference_vm.py](https://tvm.apache.org/docs/_downloads/79027b28c061178b7ea56e3f047eeef1/micro_reference_vm.py) - -[下载 Jupyter notebook:micro_reference_vm.ipynb](https://tvm.apache.org/docs/_downloads/7ef06253b3d2676eb50e20a5f81ef8f9/micro_reference_vm.ipynb) \ No newline at end of file From 985a8d98bf757c38a025f180995f6c08117f1ec1 Mon Sep 17 00:00:00 2001 From: anleeos <2937160075@qq.com> Date: Thu, 7 Dec 2023 17:28:44 +0800 Subject: [PATCH 03/26] translate MLPerfTiny --- docs/how_to/microtvm/09-micro_mlperftiny.md | 294 ++++++++++++++++++++ 1 file changed, 294 insertions(+) diff --git a/docs/how_to/microtvm/09-micro_mlperftiny.md b/docs/how_to/microtvm/09-micro_mlperftiny.md index e69de29b..9de37f86 100644 --- a/docs/how_to/microtvm/09-micro_mlperftiny.md +++ b/docs/how_to/microtvm/09-micro_mlperftiny.md @@ -0,0 +1,294 @@ +--- +title: 创建使用 microTVM 的 MLPerfTiny 提交 +--- + +:::note +单击 [此处](https://tvm.apache.org/docs/v0.13.0/how_to/work_with_microtvm/micro_mlperftiny.html#:~:text=on%20your%20board.-,Download,Python%20source%20code%3A%20micro_mlperftiny.py,-Download) 下载完整的示例代码 +::: + + +# 8.创建使用 microTVM 的 MLPerfTiny 提交 + +**作者:**[Mehrdad Hessar](https://github.com/mehrdadh) + +本教程展示了如何使用 microTVM 构建 MLPerfTiny 提交。该教程演示了从 MLPerfTiny 基准模型中导入一个 TFLite 模型,使用 TVM 进行编译,并生成一个可以刷写到支持 Zephyr 的板上的 Zephyr 项目,以使用 EEMBC runner 对模型进行基准测试的步骤。 + +## 安装 microTVM Python 依赖项 +TVM 不包含用于 Python 串行通信的软件包,因此在使用 microTVM 之前,我们必须安装它。我们还需要 TFLite 来加载模型。 + +```bash +pip install pyserial==3.5 tflite==2.1 +``` + +```python +import os +import pathlib +import tarfile +import tempfile +import shutil +``` + +## 安装 Zephyr +```bash +# 安装 west 和 ninja +python3 -m pip install west +apt-get install -y ninja-build + +# 安装 ZephyrProject +ZEPHYR_PROJECT_PATH="/content/zephyrproject" +export ZEPHYR_BASE=${ZEPHYR_PROJECT_PATH}/zephyr +west init ${ZEPHYR_PROJECT_PATH} +cd ${ZEPHYR_BASE} +git checkout v3.2-branch +cd .. +west update +west zephyr-export +chmod -R o+w ${ZEPHYR_PROJECT_PATH} + +# 安装 Zephyr SDK +cd /content +ZEPHYR_SDK_VERSION="0.15.2" +wget "https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZEPHYR_SDK_VERSION}/zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.gz" +tar xvf "zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.gz" +mv "zephyr-sdk-${ZEPHYR_SDK_VERSION}" zephyr-sdk +rm "zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.gz" + +# 安装 Python 依赖项 +python3 -m pip install -r "${ZEPHYR_BASE}/scripts/requirements.txt" + +``` + +**注意**:仅在您有意使用 CMSIS-NN 代码生成器生成此提交时安装 CMSIS-NN。 + +## 安装 Install CMSIS-NN +```bash +CMSIS_SHA="51263182d16c92649a48144ba56c0945f9fce60e" +CMSIS_URL="http://github.com/ARM-software/CMSIS_5/archive/${CMSIS_SHA}.tar.gz" +export CMSIS_PATH=/content/cmsis +DOWNLOAD_PATH="/content/${CMSIS_SHA}.tar.gz" +mkdir ${CMSIS_PATH} +wget ${CMSIS_URL} -O "${DOWNLOAD_PATH}" +tar -xf "${DOWNLOAD_PATH}" -C ${CMSIS_PATH} --strip-components=1 +rm ${DOWNLOAD_PATH} + +CMSIS_NN_TAG="v4.0.0" +CMSIS_NN_URL="https://github.com/ARM-software/CMSIS-NN.git" +git clone ${CMSIS_NN_URL} --branch ${CMSIS_NN_TAG} --single-branch ${CMSIS_PATH}/CMSIS-NN + +``` + +## 导入 Python 依赖 +```python +import tensorflow as tf +import numpy as np + +import tvm +from tvm import relay +from tvm.relay.backend import Executor, Runtime +from tvm.contrib.download import download_testdata +from tvm.micro import export_model_library_format +import tvm.micro.testing +from tvm.micro.testing.utils import ( + create_header_file, + mlf_extract_workspace_size_bytes, +) + +``` + +## 导入 Visual Wake Word Model +首先,从 MLPerfTiny 下载并导入 Visual Wake Word (VWW) TFLite 模型。该模型最初来自 [MLPerf Tiny 仓库](https://github.com/mlcommons/tiny)。我们还捕获了来自 TFLite 模型的元数据信息,如输入/输出名称、量化参数等,这些信息将在接下来的步骤中使用。 + +我们使用索引来构建各种模型的提交。索引定义如下:要构建另一个模型,您需要更新模型 URL、简短名称和索引号。 + +关键词识别(KWS)1 + +视觉唤醒词(VWW)2 + +异常检测(AD)3 + +图像分类(IC)4 + +如果您想要使用 CMSIS-NN 构建提交,请修改 USE_CMSIS 环境变量。 + +```bash +export USE_CMSIS=1 +``` + +```python +MODEL_URL = "https://github.com/mlcommons/tiny/raw/bceb91c5ad2e2deb295547d81505721d3a87d578/benchmark/training/visual_wake_words/trained_models/vww_96_int8.tflite" +MODEL_PATH = download_testdata(MODEL_URL, "vww_96_int8.tflite", module="model") + +MODEL_SHORT_NAME = "VWW" +MODEL_INDEX = 2 + +USE_CMSIS = os.environ.get("TVM_USE_CMSIS", False) + +tflite_model_buf = open(MODEL_PATH, "rb").read() +try: + import tflite + + tflite_model = tflite.Model.GetRootAsModel(tflite_model_buf, 0) +except AttributeError: + import tflite.Model + + tflite_model = tflite.Model.Model.GetRootAsModel(tflite_model_buf, 0) + +interpreter = tf.lite.Interpreter(model_path=str(MODEL_PATH)) +interpreter.allocate_tensors() +input_details = interpreter.get_input_details() +output_details = interpreter.get_output_details() + +input_name = input_details[0]["name"] +input_shape = tuple(input_details[0]["shape"]) +input_dtype = np.dtype(input_details[0]["dtype"]).name +output_name = output_details[0]["name"] +output_shape = tuple(output_details[0]["shape"]) +output_dtype = np.dtype(output_details[0]["dtype"]).name + +# 从 TFLite 模型中提取量化信息。 +# 除了异常检测模型外,所有其他模型都需要这样做, +# 因为对于其他模型,我们从主机发送量化数据到解释器, +# 然而,对于异常检测模型,我们发送浮点数据,量化信息 +# 在微控制器上进行。 +if MODEL_SHORT_NAME != "AD": + quant_output_scale = output_details[0]["quantization_parameters"]["scales"][0] + quant_output_zero_point = output_details[0]["quantization_parameters"]["zero_points"][0] + +relay_mod, params = relay.frontend.from_tflite( + tflite_model, shape_dict={input_name: input_shape}, dtype_dict={input_name: input_dtype} +) + +``` + +# 定义目标、运行时和执行器 +现在我们需要定义目标、运行时和执行器来编译这个模型。在本教程中,我们使用预先编译(Ahead-of-Time,AoT)进行编译,并构建一个独立的项目。这与使用主机驱动模式的 AoT 不同,其中目标会使用主机驱动的 AoT 执行器与主机通信以运行推理。 + +```python +# 使用 C 运行时 (crt) +RUNTIME = Runtime("crt") + +# 使用带有 `unpacked-api=True` 和 `interface-api=c` 的 AoT 执行器。`interface-api=c` 强制 +# 编译器生成 C 类型的函数 API,而 `unpacked-api=True` 强制编译器生成最小的未打包格式输入, +# 这减少了调用模型推理层时的堆栈内存使用。 +EXECUTOR = Executor( + "aot", + {"unpacked-api": True, "interface-api": "c", "workspace-byte-alignment": 8}, +) + +# 选择一个 Zephyr 板 +BOARD = os.getenv("TVM_MICRO_BOARD", default="nucleo_l4r5zi") + +# 使用 BOARD 获取完整的目标描述 +TARGET = tvm.micro.testing.get_target("zephyr", BOARD) + +``` + + +# 编译模型并导出模型库格式 +现在,我们为目标编译模型。然后,我们为编译后的模型生成模型库格式。我们还需要计算编译后的模型所需的工作空间大小。 +```python +config = {"tir.disable_vectorize": True} +if USE_CMSIS: + from tvm.relay.op.contrib import cmsisnn + + config["relay.ext.cmsisnn.options"] = {"mcpu": TARGET.mcpu} + relay_mod = cmsisnn.partition_for_cmsisnn(relay_mod, params, mcpu=TARGET.mcpu) + +with tvm.transform.PassContext(opt_level=3, config=config): + module = tvm.relay.build( + relay_mod, target=TARGET, params=params, runtime=RUNTIME, executor=EXECUTOR + ) + +temp_dir = tvm.contrib.utils.tempdir() +model_tar_path = temp_dir / "model.tar" +export_model_library_format(module, model_tar_path) +workspace_size = mlf_extract_workspace_size_bytes(model_tar_path) + +``` +# 生成输入/输出头文件 +为了使用 AoT 创建 microTVM 独立项目,我们需要生成输入和输出头文件。这些头文件用于将生成的代码中的输入和输出 API 与独立项目的其余部分连接起来。对于此特定提交,我们只需要生成输出头文件,因为输入 API 调用是以不同的方式处理的。 + +```python +extra_tar_dir = tvm.contrib.utils.tempdir() +extra_tar_file = extra_tar_dir / "extra.tar" + +with tarfile.open(extra_tar_file, "w:gz") as tf: + create_header_file( + "output_data", + np.zeros( + shape=output_shape, + dtype=output_dtype, + ), + "include/tvm", + tf, + ) + +``` + +# 创建项目、构建并准备项目 tar 文件 +现在我们有了编译后的模型作为模型库格式,可以使用 Zephyr 模板项目生成完整的项目。首先,我们准备项目选项,然后构建项目。最后,我们清理临时文件并将提交项目移动到当前工作目录,可以在开发套件上下载并使用。 + +```python +input_total_size = 1 +for i in range(len(input_shape)): + input_total_size *= input_shape[i] + +template_project_path = pathlib.Path(tvm.micro.get_microtvm_template_projects("zephyr")) +project_options = { + "extra_files_tar": str(extra_tar_file), + "project_type": "mlperftiny", + "board": BOARD, + "compile_definitions": [ + f"-DWORKSPACE_SIZE={workspace_size + 512}", # Memory workspace size, 512 is a temporary offset + # since the memory calculation is not accurate. + f"-DTARGET_MODEL={MODEL_INDEX}", # Sets the model index for project compilation. + f"-DTH_MODEL_VERSION=EE_MODEL_VERSION_{MODEL_SHORT_NAME}01", # Sets model version. This is required by MLPerfTiny API. + f"-DMAX_DB_INPUT_SIZE={input_total_size}", # Max size of the input data array. + ], +} + +if MODEL_SHORT_NAME != "AD": + project_options["compile_definitions"].append(f"-DOUT_QUANT_SCALE={quant_output_scale}") + project_options["compile_definitions"].append(f"-DOUT_QUANT_ZERO={quant_output_zero_point}") + +if USE_CMSIS: + project_options["compile_definitions"].append(f"-DCOMPILE_WITH_CMSISNN=1") + +# 注意:根据您使用的板子可能需要调整这个值。 +project_options["config_main_stack_size"] = 4000 + +if USE_CMSIS: + project_options["cmsis_path"] = os.environ.get("CMSIS_PATH", "/content/cmsis") + +generated_project_dir = temp_dir / "project" + +project = tvm.micro.project.generate_project_from_mlf( + template_project_path, generated_project_dir, model_tar_path, project_options +) +project.build() + +# 清理构建目录和额外的工件 +shutil.rmtree(generated_project_dir / "build") +(generated_project_dir / "model.tar").unlink() + +project_tar_path = pathlib.Path(os.getcwd()) / "project.tar" +with tarfile.open(project_tar_path, "w:tar") as tar: + tar.add(generated_project_dir, arcname=os.path.basename("project")) + +print(f"The generated project is located here: {project_tar_path}") +``` + +# 使用此项目与您的板子 +既然我们有了生成的项目,您可以在本地使用该项目将板子刷写并准备好运行 EEMBC runner 软件。要执行此操作,请按照以下步骤操作: + +```bash +tar -xf project.tar +cd project +mkdir build +cmake .. +make -j2 +west flash + +``` + +现在,您可以按照这些说明将您的板子连接到 EEMBC runner 并在您的板子上对此模型进行基准测试。 \ No newline at end of file From 3cfea9821e51da45cf5fb9911484e74cd1e6a84b Mon Sep 17 00:00:00 2001 From: anleeos <2937160075@qq.com> Date: Thu, 7 Dec 2023 22:12:42 +0800 Subject: [PATCH 04/26] translate custom_ide --- docs/how_to/microtvm/10-micro_custom_ide.md | 313 ++++++++++++++++++++ 1 file changed, 313 insertions(+) diff --git a/docs/how_to/microtvm/10-micro_custom_ide.md b/docs/how_to/microtvm/10-micro_custom_ide.md index e69de29b..49b69b0f 100644 --- a/docs/how_to/microtvm/10-micro_custom_ide.md +++ b/docs/how_to/microtvm/10-micro_custom_ide.md @@ -0,0 +1,313 @@ +--- +title: 开发环境中加入 microTVM +--- + +:::note +单击 [此处](https://tvm.apache.org/docs/v0.13.0/how_to/work_with_microtvm/micro_custom_ide.html#sphx-glr-download-how-to-work-with-microtvm-micro-custom-ide-py) 下载完整的示例代码 +::: + +# 9. 开发环境中加入 microTVM +作者:[Mohamad Katanbaf](https://github.com/mkatanbaf) + +本教程描述了将使用 microTVM 编译的模型集成到自定义开发环境所需的步骤。在本教程中,我们使用 [STM32CubeIDE](https://www.st.com/en/development-tools/stm32cubeide.html) 作为目标集成开发环境(IDE),但我们不依赖于此 IDE 的任何特定功能,将 microTVM 集成到其他 IDE 中的步骤类似。在这里,我们还使用了 MLPerf Tiny 的 Visual Wake Word(VWW)模型和 nucleo_l4r5zi 开发板,但相同的步骤也适用于任何其他模型或目标微控制器单元(MCU)。如果您希望在 vww 模型上使用另一个目标 MCU,我们建议选择具有约 512 KB 和约 256 KB 闪存和 RAM 的 Cortex-M4 或 Cortex-M7 设备。 + +以下是本教程中要执行的步骤的简要概述。 + +1. 首先,我们导入模型,使用 TVM 进行编译,并生成包含模型生成代码以及所有所需 TVM 依赖项的 [Model Library Format](https://tvm.apache.org/docs/arch/model_library_format.html)(MLF)tar 文件。 + +2. 我们还将两个二进制格式的样本图像(一个人和一个非人样本)添加到 .tar 文件中,以用于评估模型。 + +3. 接下来,我们使用 stmCubeMX 生成在 stmCube IDE 中项目的初始化代码。 + +4. 然后,我们将我们的 MLF 文件和所需的 CMSIS 库包含到项目中并进行构建。 + +5. 最后,我们烧写设备并在我们的样本图像上评估模型性能。 + +让我们开始吧。 + + +# 安装 microTVM Python 依赖项 +TVM 不包含用于 Python 串行通信的包,因此在使用 microTVM 之前,我们必须安装一个。我们还需要 TFLite 以加载模型,以及 Pillow 以准备样本图像。 +```bash +pip install pyserial==3.5 tflite==2.1 Pillow==9.0 typing_extensions +``` + +# 导入 Python 依赖项 +如果要在本地运行此脚本,请查看 [TVM 在线文档](https://tvm.apache.org/docs/install/index.html),了解安装 TVM 的说明。 + +```python +import os +import numpy as np +import pathlib +import json +from PIL import Image +import tarfile + +import tvm +from tvm import relay +from tvm.relay.backend import Executor, Runtime +from tvm.contrib.download import download_testdata +from tvm.micro import export_model_library_format +from tvm.relay.op.contrib import cmsisnn +from tvm.micro.testing.utils import create_header_file +``` + +# 导入 TFLite 模型 +首先,下载并导入 Visual Wake Word TFLite 模型。该模型接受一个 96x96x3 的 RGB 图像,并确定图像中是否存在人物。此模型最初来自[ MLPerf Tiny 仓库](https://github.com/mlcommons/tiny)。为了测试该模型,我们使用 [COCO 2014 Train images](https://cocodataset.org/) 中的两个样本。 + +```python +MODEL_URL = "https://github.com/mlcommons/tiny/raw/bceb91c5ad2e2deb295547d81505721d3a87d578/benchmark/training/visual_wake_words/trained_models/vww_96_int8.tflite" +MODEL_NAME = "vww_96_int8.tflite" +MODEL_PATH = download_testdata(MODEL_URL, MODEL_NAME, module="model") + +tflite_model_buf = open(MODEL_PATH, "rb").read() +try: + import tflite + + tflite_model = tflite.Model.GetRootAsModel(tflite_model_buf, 0) +except AttributeError: + import tflite.Model + + tflite_model = tflite.Model.Model.GetRootAsModel(tflite_model_buf, 0) + +input_shape = (1, 96, 96, 3) +INPUT_NAME = "input_1_int8" +relay_mod, params = relay.frontend.from_tflite( + tflite_model, shape_dict={INPUT_NAME: input_shape}, dtype_dict={INPUT_NAME: "int8"} +) +``` + +# 生成模型库格式文件 +首先,我们定义目标、运行时和执行器。然后,我们为目标设备编译模型,最后导出生成的代码和所有必需的依赖项到单个文件中。 + +```python +# 我们可以使用 TVM 的本地调度或依赖于 CMSIS-NN 内核,使用 TVM 的 Bring-Your-Own-Code (BYOC) 能力。 +USE_CMSIS_NN = True + +# USMP (Unified Static Memory Planning) 对所有张量进行综合内存规划,以实现最佳内存利用。 +DISABLE_USMP = False + +# 使用 C 运行时(crt) +RUNTIME = Runtime("crt") + +# 我们通过将板名称传递给 `tvm.target.target.micro` 来定义目标。 +# 如果您的板型未包含在支持的模型中,您可以定义目标,如下所示: +# TARGET = tvm.target.Target("c -keys=arm_cpu,cpu -mcpu=cortex-m4") +TARGET = tvm.target.target.micro("stm32l4r5zi") + +# 使用 AOT 执行器而不是图形或虚拟机执行器。使用未打包的 API 和 C 调用风格。 +EXECUTOR = tvm.relay.backend.Executor( + "aot", {"unpacked-api": True, "interface-api": "c", "workspace-byte-alignment": 8} +) + +# 现在,我们设置编译配置并为目标编译模型: +config = {"tir.disable_vectorize": True} +if USE_CMSIS_NN: + config["relay.ext.cmsisnn.options"] = {"mcpu": TARGET.mcpu} +if DISABLE_USMP: + config["tir.usmp.enable"] = False + +with tvm.transform.PassContext(opt_level=3, config=config): + if USE_CMSIS_NN: + # 当我们使用 CMSIS-NN 时,TVM 在 relay 图中搜索可以转移到 CMSIS-NN 内核的模式。 + relay_mod = cmsisnn.partition_for_cmsisnn(relay_mod, params, mcpu=TARGET.mcpu) + lowered = tvm.relay.build( + relay_mod, target=TARGET, params=params, runtime=RUNTIME, executor=EXECUTOR + ) +parameter_size = len(tvm.runtime.save_param_dict(lowered.get_params())) +print(f"Model parameter size: {parameter_size}") + +# 我们需要选择一个目录来保存我们的文件。 +# 如果在 Google Colab 上运行,我们将保存所有内容在 ``/root/tutorial`` 中(也就是 ``~/tutorial``), +# 但是如果在本地运行,您可能希望将其存储在其他位置。 + +BUILD_DIR = pathlib.Path("/root/tutorial") + +BUILD_DIR.mkdir(exist_ok=True) + +# 现在,我们将模型导出为一个 tar 文件: +TAR_PATH = pathlib.Path(BUILD_DIR) / "model.tar" +export_model_library_format(lowered, TAR_PATH) +``` + +输出: +``` +Model parameter size: 32 + +PosixPath('/workspace/gallery/how_to/work_with_microtvm/tutorial/model.tar') +``` + + +## 将样本图像添加到 MLF 文件中 +最后,我们下载两个样本图像(一个人图像和一个非人图像),将它们转换为二进制格式,并存储在两个头文件中。 + +```python +with tarfile.open(TAR_PATH, mode="a") as tar_file: + SAMPLES_DIR = "samples" + SAMPLE_PERSON_URL = ( + "https://github.com/tlc-pack/web-data/raw/main/testdata/microTVM/data/vww_sample_person.jpg" + ) + SAMPLE_NOT_PERSON_URL = "https://github.com/tlc-pack/web-data/raw/main/testdata/microTVM/data/vww_sample_not_person.jpg" + + SAMPLE_PERSON_PATH = download_testdata(SAMPLE_PERSON_URL, "person.jpg", module=SAMPLES_DIR) + img = Image.open(SAMPLE_PERSON_PATH) + create_header_file("sample_person", np.asarray(img), SAMPLES_DIR, tar_file) + + SAMPLE_NOT_PERSON_PATH = download_testdata( + SAMPLE_NOT_PERSON_URL, "not_person.jpg", module=SAMPLES_DIR + ) + img = Image.open(SAMPLE_NOT_PERSON_PATH) + create_header_file("sample_not_person", np.asarray(img), SAMPLES_DIR, tar_file) +``` + +在这一点上,您已经具备将编译后的模型导入到您的 IDE 并进行评估所需的一切。在 MLF 文件(model.tar)中,您应该找到以下文件层次结构: + +``` +/root +├── codegen +├── parameters +├── runtime +├── samples +├── src +├── templates +├── metadata.json +``` + +* codegen 文件夹:包含了由 TVM 为您的模型生成的 C 代码。 +* runtime 文件夹:包含了目标需要编译生成的 C 代码所需的所有 TVM 依赖项。 +* samples 文件夹:包含了用于评估模型的两个生成的样本文件。 +* src 文件夹:包含了描述模型的 relay 模块。 +* templates 文件夹:包含了两个模板文件,根据您的平台可能需要进行编辑。 +* metadata.json 文件:包含有关模型、其层次和内存需求的信息。 + +## 生成在您的 IDE 中的项目 +下一步是为目标设备创建一个项目。我们使用 STM32CubeIDE,您可以在[此处](https://www.st.com/en/development-tools/stm32cubeide.html)下载。在本教程中,我们使用的是版本 1.11.0。安装 STM32CubeIDE 后,请按照以下步骤创建项目: + +1. 选择 File -> New -> STM32Project。目标选择窗口将出现。 +2. 转到 “Board Selector” 选项卡,在 “Commercial Part Number” 文本框中键入板名称 “nucleo-l4r5zi”。从右侧显示的板列表中选择板,并单击 “Next”。 +3. 输入项目名称(例如 microtvm_vww_demo)。我们使用默认选项(目标语言:C,二进制类型:可执行文件,项目类型:STM32Cube)。单击 “Finish”。 +4. 一个文本框将出现,询问是否要 “以默认模式初始化所有外设?”。点击 “Yes”。这将生成项目并打开设备配置工具,您可以使用 GUI 设置外设。默认情况下启用了 USB、USART3 和 LPUART1,以及一些 GPIO。 +5. 我们将使用 LPUART1 将数据发送到主机 PC。从连接部分中选择 LPUART1,并将 “Baud Rate” 设置为 115200,将 “Word Length” 设置为 8。保存更改并点击 “Yes” 以重新生成初始化代码。这应该会重新生成代码并打开您的 main.c 文件。您还可以从左侧的 Project Explorer 面板中找到 main.c,在 microtvm_vww_demo -> Core -> Src 下。 +6. 为了进行健全性检查,请复制下面的代码并将其粘贴到主函数的无线循环(即 While(1) )部分。 + * 注意:确保您的代码写在由 USER CODE BEGIN <...> 和 USER CODE END <...> 包围的部分内。如果重新生成初始化代码,被包围之外的代码将被擦除。 + + + ``` +HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin); +HAL_UART_Transmit(&hlpuart1, "Hello World.\r\n", 14, 100); +HAL_Delay(1000); + ``` + +7. 从菜单栏中选择 Project -> Build(或右键单击项目名称并选择 Build)。这将构建项目并生成 .elf 文件。选择 Run -> Run 以将二进制文件下载到您的 MCU。如果打开了“Edit Configuration”窗口,请直接点击 “OK”。 + +8. 在主机机器上打开终端控制台。在 Mac 上,您可以简单地使用 “screen 115200” 命令,例如 “screen tty.usbmodemXXXX 115200” 。板上的 LED 应该会闪烁,终端控制台上每秒应该会打印出字符串 “Hello World.”。按 “Control-a k” 退出 screen。 + +## 将模型导入生成的项目 +要将编译后的模型集成到生成的项目中,请按照以下步骤操作: + +1. 解压 tar 文件并将其包含在项目中 + * 打开项目属性(右键单击项目名称并选择 “Properties” 或从菜单栏选择 Project -> Properties)。 + * 选择 C/C++ General -> Paths and Symbols。选择 Source Location 选项卡。 + * 如果您将模型解压缩在项目文件夹内,请点击 “Add Folder” 并选择 “model” 文件夹(在它出现之前,您可能需要右键单击项目名称并选择 “Refresh”)。 + * 如果您在其他地方解压缩了模型文件,请点击 “Link Folder” 按钮,在出现的窗口中选中 “Link to folder in the file system” 复选框,点击 “Browse” 并选择模型文件夹。 + + +2. 如果在编译模型时使用了 CMSIS-NN,您还需要在项目中包含 CMSIS-NN 源文件。 + * 从 [CMSIS-NN 存储库](https://github.com/ARM-software/CMSIS_5)下载或克隆文件,并按照上述步骤将 CMSIS-NN 文件夹包含在项目中。 + + +3. 打开项目属性。在 C/C++ Build -> Settings 中:通过点击 “+” 按钮,选择 “Workspace” ,并导航到以下各个文件夹。将以下文件夹添加到 MCU GCC Compiler 的 Include Paths 列表中(如果是 C++ 项目还需添加到 MCU G++ Compiler 中): + + - model/runtime/include + - model/codegen/host/include + - model/samples + - CMSIS-NN/Include + +4. 从 model/templates 复制 crt_config.h.template 到 Core/Inc 文件夹,并将其重命名为 crt_config.h。 +5. 从 model/templates 复制 platform.c.template 到 Core/Src 文件夹,并将其重命名为 platform.c。 + - 此文件包含您可能需要根据平台编辑的内存管理函数。 + - 在 platform.c 中定义 “TVM_WORKSPACE_SIZE_BYTES” 的值。如果使用 USMP,则只需要比较小的值(例如 1024 字节)即可。 + - 如果不使用 USMP,请查看 metadata.json 中的 “workspace_size_bytes” 字段以估算所需内存。 + +6. 从构建中排除以下文件夹(右键单击文件夹名称,选择 Resource Configuration → Exclude from build)。检查 Debug 和 Release 配置。 + + - CMSIS_NN/Tests + +7. 从 [CMSIS Version 5 存储库](https://github.com/ARM-software/CMSIS_5)下载 CMSIS 驱动程序。 + - 在项目目录中,删除 Drivers/CMSIS/Include 文件夹(这是 CMSIS 驱动程序的旧版本),并将您从下载的版本中复制的 CMSIS/Core/Include 粘贴到相同位置。 + + +8. 编辑 main.c 文件: + * 包含下列头文件 + +```c +#include +#include +#include +#include "tvmgen_default.h" +#include "sample_person.h" +#include "sample_not_person.h" +``` + + * 在 main 函数的无限循环前复制下面这段代码。该代码设置模型的输入和输出 + +```c +TVMPlatformInitialize(); +signed char output[2]; +struct tvmgen_default_inputs inputs = { +.input_1_int8 = (void*)&sample_person, +}; +struct tvmgen_default_outputs outputs = { +.Identity_int8 = (void*)&output, +}; +char msg[] = "Evaluating VWW model using microTVM:\r\n"; +HAL_UART_Transmit(&hlpuart1, msg, strlen(msg), 100); +uint8_t sample = 0; +uint32_t timer_val; +char buf[50]; +uint16_t buf_len; +``` + + * 将以下代码复制到无限循环中。该代码将在图片上运行推断并在控制台打印结果。 + +```c +if (sample == 0) + inputs.input_1_int8 = (void*)&sample_person; +else + inputs.input_1_int8 = (void*)&sample_not_person; + +timer_val = HAL_GetTick(); +tvmgen_default_run(&inputs, &outputs); +timer_val = HAL_GetTick() - timer_val; +if (output[0] > output[1]) + buf_len = sprintf(buf, "Person not detected, inference time = %lu ms\r\n", timer_val); +else + buf_len = sprintf(buf, "Person detected, inference time = %lu ms\r\n", timer_val); +HAL_UART_Transmit(&hlpuart1, buf, buf_len, 100); + +sample++; +if (sample == 2) + sample = 0; + +``` + + * 在 main 中定义 TVMLogf 函数,接受 TVM 运行时在控制台的报错 + +``` c +void TVMLogf(const char* msg, ...) { + char buffer[128]; + int size; + va_list args; + va_start(args, msg); + size = TVMPlatformFormatMessage(buffer, 128, msg, args); + va_end(args); + HAL_UART_Transmit(&hlpuart1, buffer, size, 100); +} + +``` + +9. 在项目属性中,找到 C/C++ Build -> Settings, MCU GCC Compiler -> Optimization,设置 Optimization 为 Optimize more (-O2)。 + + +## 评估模型 +现在,选择菜单栏中的 Run -> Run 来刷写 MCU 并运行项目。您应该看到 LED 在闪烁,并且控制台上在打印推理结果。 \ No newline at end of file From 6847200d34f403b0db35e7f93ecb6e3f160ad07a Mon Sep 17 00:00:00 2001 From: anleeos <2937160075@qq.com> Date: Thu, 7 Dec 2023 22:13:59 +0800 Subject: [PATCH 05/26] change the download link --- docs/how_to/microtvm/09-micro_mlperftiny.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_to/microtvm/09-micro_mlperftiny.md b/docs/how_to/microtvm/09-micro_mlperftiny.md index 9de37f86..a661354b 100644 --- a/docs/how_to/microtvm/09-micro_mlperftiny.md +++ b/docs/how_to/microtvm/09-micro_mlperftiny.md @@ -3,7 +3,7 @@ title: 创建使用 microTVM 的 MLPerfTiny 提交 --- :::note -单击 [此处](https://tvm.apache.org/docs/v0.13.0/how_to/work_with_microtvm/micro_mlperftiny.html#:~:text=on%20your%20board.-,Download,Python%20source%20code%3A%20micro_mlperftiny.py,-Download) 下载完整的示例代码 +单击 [此处](https://tvm.apache.org/docs/v0.13.0/how_to/work_with_microtvm/micro_mlperftiny.html#sphx-glr-download-how-to-work-with-microtvm-micro-mlperftiny-py) 下载完整的示例代码 ::: From 3dcbadd62ce22c29f298d402fadb46b8b36896e1 Mon Sep 17 00:00:00 2001 From: anleeos <2937160075@qq.com> Date: Thu, 7 Dec 2023 22:35:40 +0800 Subject: [PATCH 06/26] translate micro_pytorch --- docs/how_to/microtvm/08-micro_pytorch.md | 204 +++++++++++++++++++++++ 1 file changed, 204 insertions(+) diff --git a/docs/how_to/microtvm/08-micro_pytorch.md b/docs/how_to/microtvm/08-micro_pytorch.md index e69de29b..17bfa5da 100644 --- a/docs/how_to/microtvm/08-micro_pytorch.md +++ b/docs/how_to/microtvm/08-micro_pytorch.md @@ -0,0 +1,204 @@ +--- +title: microTVM PyTorch 教程 +--- + +:::note +单击 [此处](https://tvm.apache.org/docs/v0.13.0/how_to/work_with_microtvm/micro_pytorch.html#sphx-glr-download-how-to-work-with-microtvm-micro-pytorch-py) 下载完整的示例代码 +::: + +# microTVM PyTorch 教程 +作者:[Mehrdad Hessar](https://github.com/mehrdadh) + +该教程展示了如何使用 PyTorch 模型进行 microTVM 主机驱动的 AOT 编译。此教程可以在使用 C 运行时(CRT)的 x86 CPU 上执行。 + +**注意:**此教程仅在使用 CRT 的 x86 CPU 上运行,不在 Zephy r上运行,因为该模型不适用于我们当前支持的 Zephyr 主板。 + +## 安装 microTVM Python 依赖项 +TVM 不包含用于 Python 串行通信包,因此在使用 microTVM 之前我们必须先安装一个。我们还需要TFLite来加载模型。 + +```bash +pip install pyserial==3.5 tflite==2.1 +``` + +```python +import pathlib +import torch +import torchvision +from torchvision import transforms +import numpy as np +from PIL import Image + +import tvm +from tvm import relay +from tvm.contrib.download import download_testdata +from tvm.relay.backend import Executor +import tvm.micro.testing + +``` + +## 加载预训练 PyTorch 模型 +首先,从 torchvision 中加载预训练的 MobileNetV2 模型。然后,下载一张猫的图像并进行预处理,以便用作模型的输入。 + +```python +model = torchvision.models.quantization.mobilenet_v2(weights="DEFAULT", quantize=True) +model = model.eval() + +input_shape = [1, 3, 224, 224] +input_data = torch.randn(input_shape) +scripted_model = torch.jit.trace(model, input_data).eval() + +img_url = "https://github.com/dmlc/mxnet.js/blob/main/data/cat.png?raw=true" +img_path = download_testdata(img_url, "cat.png", module="data") +img = Image.open(img_path).resize((224, 224)) + +# Preprocess the image and convert to tensor +my_preprocess = transforms.Compose( + [ + transforms.Resize(256), + transforms.CenterCrop(224), + transforms.ToTensor(), + transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), + ] +) +img = my_preprocess(img) +img = np.expand_dims(img, 0) + +input_name = "input0" +shape_list = [(input_name, input_shape)] +relay_mod, params = relay.frontend.from_pytorch(scripted_model, shape_list) + +``` + +输出: + +``` +/venv/apache-tvm-py3.8/lib/python3.8/site-packages/torch/ao/quantization/utils.py:310: UserWarning: must run observer before calling calculate_qparams. Returning default values. + warnings.warn( +Downloading: "https://download.pytorch.org/models/quantized/mobilenet_v2_qnnpack_37f702c5.pth" to /workspace/.cache/torch/hub/checkpoints/mobilenet_v2_qnnpack_37f702c5.pth + + 0%| | 0.00/3.42M [00:00 ver +/venv/apache-tvm-py3.8/lib/python3.8/site-packages/setuptools/_distutils/version.py:346: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead. + other = LooseVersion(other) + +``` + +## 定义目标、运行时与执行器 +在本教程中,我们使用 AOT 主机驱动执行器。为了在 x86 机器上对嵌入式模拟环境编译模型,我们使用 C 运行时(CRT),并使用主机微型目标。使用该设置,TVM 为 C 运行时编译可以在 x86 CPU 机器上运行的模型,可以在物理微控制器上运行的相同流程。CRT 使用 `src/runtime/crt/host/main.cc` 中的 main()。要使用物理硬件,请将 board 替换为另一个物理微型目标,例如 `nrf5340dk_nrf5340_cpuapp` 或 `mps2_an521`,并将平台类型更改为 Zephyr。在《[为 Arduino 上的 microTVM 训练视觉模型](https://tvm.apache.org/docs/v0.13.0/how_to/work_with_microtvm/micro_train.html#tutorial-micro-train-arduino)》和《[microTVM TFLite 教程](https://tvm.apache.org/docs/v0.13.0/how_to/work_with_microtvm/micro_tflite.html#tutorial-micro-tflite)》中,可以看到 更多目标示例。 + +```python +target = tvm.micro.testing.get_target(platform="crt", board=None) + +# 使用 C 运行时 (crt) 并通过设置 system-lib 为 True 打开静态链接 +runtime = tvm.relay.backend.Runtime("crt", {"system-lib": True}) + +# 使用 AOT 执行器代替图或 vm 执行器。不要使用未包装的 API 或 C 风格调用 +executor = Executor("aot") + +``` + +## 编译模型 +现在为目标编译模型: + +```python +with tvm.transform.PassContext( + opt_level=3, + config={"tir.disable_vectorize": True}, +): + module = tvm.relay.build( + relay_mod, target=target, runtime=runtime, executor=executor, params=params + ) + +``` + +## 创建 microTVM 项目 +现在,我们已经将编译好的模型作为 IRModule 准备好,我们还需要创建一个固件项目,以便在 microTVM 中使用编译好的模型。为此,我们需要使用 Project API。 + +```python +template_project_path = pathlib.Path(tvm.micro.get_microtvm_template_projects("crt")) +project_options = {"verbose": False, "workspace_size_bytes": 6 * 1024 * 1024} + +temp_dir = tvm.contrib.utils.tempdir() / "project" +project = tvm.micro.generate_project( + str(template_project_path), + module, + temp_dir, + project_options, +) +``` + +## 构建、烧录和执行模型 +接下来,我们构建 microTVM项 目并进行烧录。烧录步骤特定于物理微控制器,如果通过主机的 `main.cc` 模拟微控制器,或者选择 Zephyr 模拟主板作为目标,则会跳过该步骤。 + +```python +project.build() +project.flash() + +input_data = {input_name: tvm.nd.array(img.astype("float32"))} +with tvm.micro.Session(project.transport()) as session: + aot_executor = tvm.runtime.executor.aot_executor.AotModule(session.create_aot_executor()) + aot_executor.set_input(**input_data) + aot_executor.run() + result = aot_executor.get_output(0).numpy() +``` + +## 查询 Synset 名称 +查询在 1000 个类别 Synset 中的 top-1 的预测。 + +```python +synset_url = ( + "https://raw.githubusercontent.com/Cadene/" + "pretrained-models.pytorch/master/data/" + "imagenet_synsets.txt" +) +synset_name = "imagenet_synsets.txt" +synset_path = download_testdata(synset_url, synset_name, module="data") +with open(synset_path) as f: + synsets = f.readlines() + +synsets = [x.strip() for x in synsets] +splits = [line.split(" ") for line in synsets] +key_to_classname = {spl[0]: " ".join(spl[1:]) for spl in splits} + +class_url = ( + "https://raw.githubusercontent.com/Cadene/" + "pretrained-models.pytorch/master/data/" + "imagenet_classes.txt" +) +class_path = download_testdata(class_url, "imagenet_classes.txt", module="data") +with open(class_path) as f: + class_id_to_key = f.readlines() + +class_id_to_key = [x.strip() for x in class_id_to_key] + +# Get top-1 result for TVM +top1_tvm = np.argmax(result) +tvm_class_key = class_id_to_key[top1_tvm] + +# Convert input to PyTorch variable and get PyTorch result for comparison +with torch.no_grad(): + torch_img = torch.from_numpy(img) + output = model(torch_img) + + # Get top-1 result for PyTorch + top1_torch = np.argmax(output.numpy()) + torch_class_key = class_id_to_key[top1_torch] + +print("Relay top-1 id: {}, class name: {}".format(top1_tvm, key_to_classname[tvm_class_key])) +print("Torch top-1 id: {}, class name: {}".format(top1_torch, key_to_classname[torch_class_key])) + +``` + +输出结果: + +``` +Relay top-1 id: 282, class name: tiger cat +Torch top-1 id: 282, class name: tiger cat +``` + +**该脚本总运行时间:**(1分26.552秒) \ No newline at end of file From 9245d2d6a00219f38a11819c7476403d977d5ecb Mon Sep 17 00:00:00 2001 From: anleeos <2937160075@qq.com> Date: Thu, 7 Dec 2023 22:38:47 +0800 Subject: [PATCH 07/26] make corrections --- docs/how_to/microtvm/08-micro_pytorch.md | 8 ++++---- docs/how_to/microtvm/09-micro_mlperftiny.md | 2 +- docs/how_to/microtvm/10-micro_custom_ide.md | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/how_to/microtvm/08-micro_pytorch.md b/docs/how_to/microtvm/08-micro_pytorch.md index 17bfa5da..5323820e 100644 --- a/docs/how_to/microtvm/08-micro_pytorch.md +++ b/docs/how_to/microtvm/08-micro_pytorch.md @@ -1,17 +1,17 @@ --- -title: microTVM PyTorch 教程 +title: 4.microTVM PyTorch 教程 --- :::note 单击 [此处](https://tvm.apache.org/docs/v0.13.0/how_to/work_with_microtvm/micro_pytorch.html#sphx-glr-download-how-to-work-with-microtvm-micro-pytorch-py) 下载完整的示例代码 ::: -# microTVM PyTorch 教程 -作者:[Mehrdad Hessar](https://github.com/mehrdadh) +# 4.microTVM PyTorch 教程 +**作者:**[Mehrdad Hessar](https://github.com/mehrdadh) 该教程展示了如何使用 PyTorch 模型进行 microTVM 主机驱动的 AOT 编译。此教程可以在使用 C 运行时(CRT)的 x86 CPU 上执行。 -**注意:**此教程仅在使用 CRT 的 x86 CPU 上运行,不在 Zephy r上运行,因为该模型不适用于我们当前支持的 Zephyr 主板。 +**注意:** 此教程仅在使用 CRT 的 x86 CPU 上运行,不支持在 Zephyr 上运行,因为该模型不适用于我们当前支持的 Zephyr 主板。 ## 安装 microTVM Python 依赖项 TVM 不包含用于 Python 串行通信包,因此在使用 microTVM 之前我们必须先安装一个。我们还需要TFLite来加载模型。 diff --git a/docs/how_to/microtvm/09-micro_mlperftiny.md b/docs/how_to/microtvm/09-micro_mlperftiny.md index a661354b..f57248fb 100644 --- a/docs/how_to/microtvm/09-micro_mlperftiny.md +++ b/docs/how_to/microtvm/09-micro_mlperftiny.md @@ -1,5 +1,5 @@ --- -title: 创建使用 microTVM 的 MLPerfTiny 提交 +title: 8.创建使用 microTVM 的 MLPerfTiny 提交 --- :::note diff --git a/docs/how_to/microtvm/10-micro_custom_ide.md b/docs/how_to/microtvm/10-micro_custom_ide.md index 49b69b0f..75f7cb50 100644 --- a/docs/how_to/microtvm/10-micro_custom_ide.md +++ b/docs/how_to/microtvm/10-micro_custom_ide.md @@ -1,5 +1,5 @@ --- -title: 开发环境中加入 microTVM +title: 9.开发环境中加入 microTVM --- :::note From fb6b1616ef2e333d64a2e243fd79c7049f107670 Mon Sep 17 00:00:00 2001 From: anleeos <2937160075@qq.com> Date: Thu, 7 Dec 2023 23:41:03 +0800 Subject: [PATCH 08/26] update microtvn --- docs/how_to/microtvm/01-aot.md | 86 ++++++-- docs/how_to/microtvm/02-autotune_microtvm.md | 81 +++++-- docs/how_to/microtvm/03-tvm_arm.md | 17 +- docs/how_to/microtvm/05-microtvm_tflite.md | 221 ++++++++----------- docs/how_to/microtvm/06-microtvm_arduino.md | 22 +- docs/how_to/microtvm/07-tvmc_micro.md | 92 +++++--- docs/how_to/microtvm/08-micro_pytorch.md | 12 +- docs/how_to/microtvm/09-micro_mlperftiny.md | 6 +- docs/how_to/microtvm/10-micro_custom_ide.md | 6 +- 9 files changed, 321 insertions(+), 222 deletions(-) diff --git a/docs/how_to/microtvm/01-aot.md b/docs/how_to/microtvm/01-aot.md index 8389cb4f..04324ff0 100644 --- a/docs/how_to/microtvm/01-aot.md +++ b/docs/how_to/microtvm/01-aot.md @@ -1,8 +1,8 @@ --- -title: microTVM 主机驱动的 AoT +title: 3.microTVM AoT 编译 --- -# microTVM 主机驱动的 AoT +# 3.microTVM AoT 编译 :::note 单击 [此处](https://tvm.apache.org/docs/how_to/work_with_microtvm/micro_aot.html#sphx-glr-download-how-to-work-with-microtvm-micro-aot-py) 下载完整的示例代码 @@ -12,14 +12,65 @@ title: microTVM 主机驱动的 AoT 本教程展示了 microTVM(使用 TFLite 模型)主机驱动的 AoT 编译。与 GraphExecutor 相比,AoTExecutor 减少了运行时解析图的开销。此外,我们可以通过提前编译更好地进行内存管理。本教程可以使用 C 运行时(CRT)在 x86 CPU 上执行,也可以在 Zephyr 支持的微控制器/板上的 Zephyr 平台上执行。 +## 安装 microTVM Python 依赖项 +TVM 不包含用于 Python 串行通信包,因此在使用 microTVM 之前我们必须先安装一个。我们还需要TFLite来加载模型。 + +```bash +pip install pyserial==3.5 tflite==2.1 +``` + +```python +import os + + +# 本指南默认运行在使用 TVM 的 C 运行时的 x86 CPU 上,如果你想 +# 在 Zephyr 实机硬件上运行,你必须导入 `TVM_MICRO_USE_HW` 环境 +# 变量。此外如果你使用 C 运行时,你可以跳过安装 Zephyr。 +# 将花费大约20分钟安装 Zephyr。 +use_physical_hw = bool(os.getenv("TVM_MICRO_USE_HW")) + +``` + +## 安装 Zephyr + +``` bash +# 安装 west 和 ninja +python3 -m pip install west +apt-get install -y ninja-build + +# 安装 ZephyrProject +ZEPHYR_PROJECT_PATH="/content/zephyrproject" +export ZEPHYR_BASE=${ZEPHYR_PROJECT_PATH}/zephyr +west init ${ZEPHYR_PROJECT_PATH} +cd ${ZEPHYR_BASE} +git checkout v3.2-branch +cd .. +west update +west zephyr-export +chmod -R o+w ${ZEPHYR_PROJECT_PATH} + +# 安装 Zephyr SDK +cd /content +ZEPHYR_SDK_VERSION="0.15.2" +wget "https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZEPHYR_SDK_VERSION}/zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.gz" +tar xvf "zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.gz" +mv "zephyr-sdk-${ZEPHYR_SDK_VERSION}" zephyr-sdk +rm "zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.gz" + +# 安装 python 依赖 +python3 -m pip install -r "${ZEPHYR_BASE}/scripts/requirements.txt" +``` + +## 导入 Python 依赖项 + ``` python import numpy as np import pathlib import json -import os import tvm from tvm import relay +import tvm.micro.testing from tvm.relay.backend import Executor, Runtime from tvm.contrib.download import download_testdata ``` @@ -31,9 +82,8 @@ from tvm.contrib.download import download_testdata **注意:**默认情况下,本教程使用 CRT 在 x86 CPU 上运行,若要在 Zephyr 平台上运行,需要导出 *TVM_MICRO_USE_HW* 环境变量。 ``` python -use_physical_hw = bool(os.getenv("TVM_MICRO_USE_HW")) -MODEL_URL = "https://github.com/tlc-pack/web-data/raw/main/testdata/microTVM/model/keyword_spotting_quant.tflite" -MODEL_PATH = download_testdata(MODEL_URL, "keyword_spotting_quant.tflite", module="model") +MODEL_URL = "https://github.com/mlcommons/tiny/raw/bceb91c5ad2e2deb295547d81505721d3a87d578/benchmark/training/keyword_spotting/trained_models/kws_ref_model.tflite" +MODEL_PATH = download_testdata(MODEL_URL, "kws_ref_model.tflite", module="model") SAMPLE_URL = "https://github.com/tlc-pack/web-data/raw/main/testdata/microTVM/data/keyword_spotting_int8_6.pyc.npy" SAMPLE_PATH = download_testdata(SAMPLE_URL, "keyword_spotting_int8_6.pyc.npy", module="data") @@ -56,25 +106,23 @@ relay_mod, params = relay.frontend.from_tflite( ## 定义 target -接下来定义 target、runtime 和 executor。本教程将详细介绍使用 AOT 主机驱动的执行器。这里使用的主机微 target,它使用 CRT runtime 在 x86 CPU 上运行模型,或者在 qemu_x86 模拟器单板上运行带有 Zephyr 平台的模型。对于物理微控制器,获取物理单板(例如 nucleo_l4r5zi)的 target 模型,并将其传递给 *tvm.target.target.micro*,从而创建完整的微目标。 +接下来定义 target、runtime 和 executor。本教程将详细介绍使用 AOT 主机驱动的执行器。这里使用的主机微 target,它使用 CRT runtime 在 x86 CPU 上运行模型,或者在 qemu_x86 模拟器单板上运行带有 Zephyr 平台的模型。对于物理微控制器,获取物理单板(例如 nucleo_l4r5zi)的 target 模型,并将其修改 `BOARD` 支持 Zephyr 单板。 ``` python # 使用 C runtime(crt),并通过将 system-lib 设置为 True 来启用静态链接 RUNTIME = Runtime("crt", {"system-lib": True}) -# 在主机上模拟一个微控制器。使用来自 `src/runtime/crt/host/main.cc [https://github.com/apache/tvm/blob/main/src/runtime/crt/host/main.cc](https://github.com/apache/tvm/blob/main/src/runtime/crt/host/main.cc)`_ 的 main()。 +# 在主机上模拟一个微控制器。使用来自 `src/runtime/crt/host/main.cc`_ 的 main()。 # 若要使用物理硬件,请将「host」替换为与你的硬件匹配的内容。 -TARGET = tvm.target.target.micro("host") +TARGET = tvm.micro.testing.get_target("crt") # 使用 AOT 执行器,而非计算图或是虚拟机执行器。不要使用未打包的 API 或 C 调用风格。 EXECUTOR = Executor("aot") if use_physical_hw: - boards_file = pathlib.Path(tvm.micro.get_microtvm_template_projects("zephyr")) / "boards.json" - with open(boards_file) as f: - boards = json.load(f) BOARD = os.getenv("TVM_MICRO_BOARD", default="nucleo_l4r5zi") - TARGET = tvm.target.target.micro(boards[BOARD]["model"]) + SERIAL = os.getenv("TVM_MICRO_SERIAL", default=None) + TARGET = tvm.micro.testing.get_target("zephyr", BOARD) ``` ## 编译模型 @@ -105,7 +153,13 @@ project_options = {} # 可以用选项通过 TVM 提供特定于平台的选项 if use_physical_hw: template_project_path = pathlib.Path(tvm.micro.get_microtvm_template_projects("zephyr")) - project_options = {"project_type": "host_driven", "zephyr_board": BOARD} + project_options = { + "project_type": "host_driven", + "board": BOARD, + "serial_number": SERIAL, + "config_main_stack_size": 4096, + "zephyr_base": os.getenv("ZEPHYR_BASE", default="/content/zephyrproject/zephyr"), + } temp_dir = tvm.contrib.utils.tempdir() generated_project_dir = temp_dir / "project" @@ -155,6 +209,6 @@ with tvm.micro.Session(project.transport()) as session: Label is `left` with index `6` ``` -[下载 Python 源代码:micro_aot.py](https://tvm.apache.org/docs/_downloads/f8a7209a0e66b246185bfc41bbc82f54/micro_aot.py) +[下载 Python 源代码:micro_aot.py](https://tvm.apache.org/docs/v0.13.0/_downloads/f8a7209a0e66b246185bfc41bbc82f54/micro_aot.py) -[下载 Jupyter Notebook:micro_aot.ipynb](https://tvm.apache.org/docs/_downloads/c00933f3fbcf90c4f584d54607b33805/micro_aot.ipynb) +[下载 Jupyter Notebook:micro_aot.ipynb](https://tvm.apache.org/docs/v0.13.0/_downloads/c00933f3fbcf90c4f584d54607b33805/micro_aot.ipynb) diff --git a/docs/how_to/microtvm/02-autotune_microtvm.md b/docs/how_to/microtvm/02-autotune_microtvm.md index 837a936c..a7c6d5c5 100644 --- a/docs/how_to/microtvm/02-autotune_microtvm.md +++ b/docs/how_to/microtvm/02-autotune_microtvm.md @@ -1,8 +1,8 @@ --- -title: 使用 microTVM 进行自动调优 +title: 6.使用 microTVM 进行模型调优 --- -# 使用 microTVM 进行自动调优 +# 6.使用 microTVM 进行模型调优 :::note 单击 [此处](https://tvm.apache.org/docs/how_to/work_with_microtvm/micro_autotune.html#sphx-glr-download-how-to-work-with-microtvm-micro-autotune-py) 下载完整的示例代码 @@ -12,16 +12,61 @@ title: 使用 microTVM 进行自动调优 本教程介绍如何用 C runtime 自动调优模型。 -``` python +## 安装 microTVM Python 依赖项 +TVM 不包含用于 Python 串行通信包,因此在使用 microTVM 之前我们必须先安装一个。我们还需要TFLite来加载模型。 + +```bash +pip install pyserial==3.5 tflite==2.1 +``` + +```python +# 如果下面的标志为 False,可以跳过下一节(安装 Zephyr) +# 安装 Zephyr 约花费20分钟 import os + +use_physical_hw = bool(os.getenv("TVM_MICRO_USE_HW")) + +``` +## 安装 Zephyr + +``` bash +# 安装 west 和 ninja +python3 -m pip install west +apt-get install -y ninja-build + +# 安装 ZephyrProject +ZEPHYR_PROJECT_PATH="/content/zephyrproject" +export ZEPHYR_BASE=${ZEPHYR_PROJECT_PATH}/zephyr +west init ${ZEPHYR_PROJECT_PATH} +cd ${ZEPHYR_BASE} +git checkout v3.2-branch +cd .. +west update +west zephyr-export +chmod -R o+w ${ZEPHYR_PROJECT_PATH} + +# 安装 Zephyr SDK +cd /content +ZEPHYR_SDK_VERSION="0.15.2" +wget "https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZEPHYR_SDK_VERSION}/zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.gz" +tar xvf "zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.gz" +mv "zephyr-sdk-${ZEPHYR_SDK_VERSION}" zephyr-sdk +rm "zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.gz" + +# 安装 python 依赖 +python3 -m pip install -r "${ZEPHYR_BASE}/scripts/requirements.txt" +``` + +## 导入 Python 依赖项 + +``` python import json import numpy as np import pathlib import tvm from tvm.relay.backend import Runtime - -use_physical_hw = bool(os.getenv("TVM_MICRO_USE_HW")) +import tvm.micro.testing ``` ## 定义模型 @@ -62,19 +107,16 @@ params = {"weight": weight_sample} ``` python RUNTIME = Runtime("crt", {"system-lib": True}) -TARGET = tvm.target.target.micro("host") +TARGET = tvm.micro.testing.get_target("crt") # 为物理硬件编译 # -------------------------------------------------------------------------- # 在物理硬件上运行时,选择描述硬件的 TARGET 和 BOARD。 # 下面的示例中选择 STM32L4R5ZI Nucleo。 if use_physical_hw: - boards_file = pathlib.Path(tvm.micro.get_microtvm_template_projects("zephyr")) / "boards.json" - with open(boards_file) as f: - boards = json.load(f) - BOARD = os.getenv("TVM_MICRO_BOARD", default="nucleo_l4r5zi") - TARGET = tvm.target.target.micro(boards[BOARD]["model"]) + SERIAL = os.getenv("TVM_MICRO_SERIAL", default=None) + TARGET = tvm.micro.testing.get_target("zephyr", BOARD) ``` ## 提取调优任务 @@ -117,10 +159,10 @@ if use_physical_hw: module_loader = tvm.micro.AutoTvmModuleLoader( template_project_dir=pathlib.Path(tvm.micro.get_microtvm_template_projects("zephyr")), project_options={ - "zephyr_board": BOARD, - "west_cmd": "west", + "board": BOARD, "verbose": False, "project_type": "host_driven", + "serial_number": SERIAL, }, ) builder = tvm.autotvm.LocalBuilder( @@ -182,10 +224,11 @@ if use_physical_hw: lowered, temp_dir / "project", { - "zephyr_board": BOARD, - "west_cmd": "west", + "board": BOARD, "verbose": False, "project_type": "host_driven", + "serial_number": SERIAL, + "config_main_stack_size": 4096, }, ) @@ -240,10 +283,12 @@ if use_physical_hw: lowered_tuned, temp_dir / "project", { - "zephyr_board": BOARD, + "board": BOARD, "west_cmd": "west", "verbose": False, "project_type": "host_driven", + "serial_number": SERIAL, + "config_main_stack_size": 4096, }, ) @@ -273,6 +318,6 @@ tvmgen_default_fused_layout_transform tvmgen_default_fused_layout_transf Total_time - 195.83 - - - - - ``` -[下载 Python 源代码:micro_autotune.py](https://tvm.apache.org/docs/_downloads/9ccca8fd489a1486ac71b55a55c320c5/micro_autotune.py) +[下载 Python 源代码:micro_autotune.py](https://tvm.apache.org/docs/v0.13.0/_downloads/9ccca8fd489a1486ac71b55a55c320c5/micro_autotune.py) -[下载 Jupyter notebook:micro_autotune.ipynb](https://tvm.apache.org/docs/_downloads/f83ba3df2d52f9b54cf141114359481a/micro_autotune.ipynb) \ No newline at end of file +[下载 Jupyter notebook:micro_autotune.ipynb](https://tvm.apache.org/docs/v0.13.0/_downloads/f83ba3df2d52f9b54cf141114359481a/micro_autotune.ipynb) \ No newline at end of file diff --git a/docs/how_to/microtvm/03-tvm_arm.md b/docs/how_to/microtvm/03-tvm_arm.md index 492d7344..16c58364 100644 --- a/docs/how_to/microtvm/03-tvm_arm.md +++ b/docs/how_to/microtvm/03-tvm_arm.md @@ -1,8 +1,8 @@ --- -title: 在支持 CMSIS-NN 的 Arm(R) Cortex(R)-M55 CPU 和 Ethos(TM)-U55 NPU 裸机上运行 TVM +title: 7.在支持 CMSIS-NN 的 Arm(R) Cortex(R)-M55 CPU 和 Ethos(TM)-U55 NPU 裸机上运行 TVM --- -# 在支持 CMSIS-NN 的 Arm(R) Cortex(R)-M55 CPU 和 Ethos(TM)-U55 NPU 裸机上运行 TVM +# 7.在支持 CMSIS-NN 的 Arm(R) Cortex(R)-M55 CPU 和 Ethos(TM)-U55 NPU 裸机上运行 TVM :::note 单击 [此处](https://tvm.apache.org/docs/how_to/work_with_microtvm/micro_ethosu.html#sphx-glr-download-how-to-work-with-microtvm-micro-ethosu-py) 下载完整的示例代码 @@ -51,15 +51,14 @@ TVMC - TVM driver command-line interface attrs==21.2.0 cloudpickle==2.0.0 decorator==5.1.0 - ethos-u-vela==3.2.0 - flatbuffers==1.12 + ethos-u-vela==3.8.0 + flatbuffers==2.0.7 lxml==4.6.3 nose==1.3.7 numpy==1.19.5 Pillow==8.3.2 psutil==5.8.0 scipy==1.5.4 - synr==0.4 tflite==2.4.0 tornado==6.1 ``` @@ -278,7 +277,7 @@ demo.c[¶](#demo-c) #include #include "ethosu_mod.h" - #include "uart.h" + #include "uart_stdout.h" // convert_image.py 和 convert_labels.py 生成的头文件 #include "inputs.h" @@ -288,7 +287,7 @@ demo.c[¶](#demo-c) int abs(int v) { return v * ((v > 0) - (v < 0)); } int main(int argc, char** argv) { - uart_init(); + UartStdOutInit(); printf("Starting Demo\n"); EthosuInit(); @@ -444,6 +443,6 @@ Info: /OSCI/SystemC: Simulation stopped by user. 可以看到,输出的最后部分显示图像已被正确分类为「tabby」。 -[下载 Python 源代码:micro_ethosu.py](https://tvm.apache.org/docs/_downloads/ab2eef18d10188532645b1d60fc7dd68/micro_ethosu.py) +[下载 Python 源代码:micro_ethosu.py](https://tvm.apache.org/docs/v0.13.0/_downloads/ab2eef18d10188532645b1d60fc7dd68/micro_ethosu.py) -[下载 Jupyter Notebook:micro_ethosu.ipynb](https://tvm.apache.org/docs/_downloads/55a9eff88b1303e525d53269eeb16897/micro_ethosu.ipynb) +[下载 Jupyter Notebook:micro_ethosu.ipynb](https://tvm.apache.org/docs/v0.13.0/_downloads/55a9eff88b1303e525d53269eeb16897/micro_ethosu.ipynb) diff --git a/docs/how_to/microtvm/05-microtvm_tflite.md b/docs/how_to/microtvm/05-microtvm_tflite.md index e183c81f..a0cc4db8 100644 --- a/docs/how_to/microtvm/05-microtvm_tflite.md +++ b/docs/how_to/microtvm/05-microtvm_tflite.md @@ -1,8 +1,8 @@ --- -title: 支持 TFLite 模型的 microTVM +title: 2. microTVM TFLite 指南 --- -# 支持 TFLite 模型的 microTVM +# 2. microTVM TFLite 指南 :::note 单击 [此处](https://tvm.apache.org/docs/how_to/work_with_microtvm/micro_tflite.html#sphx-glr-download-how-to-work-with-microtvm-micro-tflite-py) 下载完整的示例代码 @@ -12,83 +12,58 @@ title: 支持 TFLite 模型的 microTVM 本教程介绍如何用 microTVM 和支持 Relay 的 TFLite 模型。 -:::note -若要在 microTVM 虚拟机参考手册上运行本教程,请根据页面底部的链接下载 Jupyter Notebook 并将其保存到 TVM 目录中。然后: - -1. 用修改后的 `vagrant ssh` 命令登录到虚拟机参考手册: - `$ vagrant ssh -- -L8888:localhost:8888` -2. 安装 Jupyter: `pip install jupyterlab` -3. `cd` 到 TVM 目录 -4. 安装 TFLite:`poetry install -E importer-tflite` -5. 启动 Jupyter Notebook:`jupyter notebook` -6. 复制 localhost URL,并将其粘贴到浏览器中 -7. 导航到已保存的 Jupyter Notebook(`.ipynb` 文件) -::: - -## 设置 - -### 安装 TFLite - -开始前,先安装 TFLite 包,两种安装方式如下所示: - -1. 使用 `pip` 安装 - - ``` bash - pip install tflite=2.1.0 --user - ``` - -2. 生成 TFLite 包,步骤如下: - - 获取 flatc 编译器,参阅 https://github.com/google/flatbuffers 了解详细信息,确保已正确安装。 - - ``` bash - flatc --version - ``` - - 获取 TFLite schema。 - - ``` bash - wget https://raw.githubusercontent.com/tensorflow/tensorflow/r1.13/tensorflow/lite/schema/schema.fbs - ``` - - 生成 TFLite 包。 +## 安装 microTVM Python 依赖项 +TVM 不包含用于 Python 串行通信包,因此在使用 microTVM 之前我们必须先安装一个。我们还需要TFLite来加载模型。 - ``` bash - flatc --python schema.fbs - ``` - - 将当前文件夹(包含生成的 TFLite 模块)添加到 PYTHONPATH。 - - ``` bash - export PYTHONPATH=${PYTHONPATH:+$PYTHONPATH:}$(pwd) - ``` - -用 `python -c "import tflite"` 验证 TFLite 包是否安装成功。 - -### 安装 Zephyr(仅限物理硬件) - -用主机模拟运行本教程时(默认),使用主机 `gcc` 构建模拟设备的固件镜像。若编译到物理硬件上运行,需安装一个 *toolchain* 以及一些特定于 target 的依赖。microTVM 允许用户提供任何可以启动 TVM RPC 服务器的编译器和 runtime。开始之前,请注意本教程依赖于 Zephyr RTOS 来提供这些部分。 - -参考 [安装说明](https://docs.zephyrproject.org/latest/getting_started/index.html) 安装 Zephyr。 +```bash +pip install pyserial==3.5 tflite==2.1 +``` -**题外话:重新创建预训练 TFLite 模型** +```python +import os - 本教程下载了预训练的 TFLite 模型。使用微控制器时,请注意这些设备的资源高度受限,像 MobileNet 这样的标准模型和小内存并不匹配。 - 本教程使用 TF Micro 示例模型之一。 +# 本指南默认运行在使用 TVM 的 C 运行时的 x86 CPU 上,如果你想 +# 在 Zephyr 实机硬件上运行,你必须导入 `TVM_MICRO_USE_HW` 环境 +# 变量。此外如果你使用 C 运行时,你可以跳过安装 Zephyr。 +# 将花费大约20分钟安装 Zephyr。 +use_physical_hw = bool(os.getenv("TVM_MICRO_USE_HW")) - 若要复制训练步骤,参阅:https://github.com/tensorflow/tensorflow/tree/master/tensorflow/lite/micro/examples/hello_world/train +``` - :::note - 若不小心从 `wget https://storage.googleapis.com/download.tensorflow.org/models/tflite/micro/hello_world_2020_04_13.zip` 下载了示例预训练模型,会由于未实现的操作码(114)而失败。 - ::: +## 安装 Zephyr -## 加载并准备预训练模型 +``` bash +# 安装 west 和 ninja +python3 -m pip install west +apt-get install -y ninja-build + +# 安装 ZephyrProject +ZEPHYR_PROJECT_PATH="/content/zephyrproject" +export ZEPHYR_BASE=${ZEPHYR_PROJECT_PATH}/zephyr +west init ${ZEPHYR_PROJECT_PATH} +cd ${ZEPHYR_BASE} +git checkout v3.2-branch +cd .. +west update +west zephyr-export +chmod -R o+w ${ZEPHYR_PROJECT_PATH} + +# 安装 Zephyr SDK +cd /content +ZEPHYR_SDK_VERSION="0.15.2" +wget "https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZEPHYR_SDK_VERSION}/zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.gz" +tar xvf "zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.gz" +mv "zephyr-sdk-${ZEPHYR_SDK_VERSION}" zephyr-sdk +rm "zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.gz" + +# 安装 python 依赖 +python3 -m pip install -r "${ZEPHYR_BASE}/scripts/requirements.txt" +``` -把预训练 TFLite 模型从当前目录中的文件中加载到 buffer +## 导入 Python 依赖项 -``` python -import os +```python import json import tarfile import pathlib @@ -96,21 +71,25 @@ import tempfile import numpy as np import tvm +import tvm.micro +import tvm.micro.testing from tvm import relay import tvm.contrib.utils +from tvm.micro import export_model_library_format from tvm.contrib.download import download_testdata -use_physical_hw = bool(os.getenv("TVM_MICRO_USE_HW")) -model_url = "https://people.linaro.org/~tom.gall/sine_model.tflite" +model_url = ( + "https://github.com/tlc-pack/web-data/raw/main/testdata/microTVM/model/sine_model.tflite" +) model_file = "sine_model.tflite" model_path = download_testdata(model_url, model_file, module="data") tflite_model_buf = open(model_path, "rb").read() -``` -利用 buffer,转换为 TFLite 模型 Python 对象 +``` -``` python +使用 buffer,转换为 tflite 模型 python 对象: +```python try: import tflite @@ -119,18 +98,19 @@ except AttributeError: import tflite.Model tflite_model = tflite.Model.Model.GetRootAsModel(tflite_model_buf, 0) + ``` -打印模型的版本 +打印模型版本: -``` python +```python version = tflite_model.Version() print("Model Version: " + str(version)) + ``` 输出结果: - -``` bash +``` Model Version: 3 ``` @@ -152,57 +132,42 @@ mod, params = relay.frontend.from_tflite( 接下来为 Relay 创建一个构建配置,关闭两个选项,然后调用 relay.build,为选定的 TARGET 生成一个 C 源文件。 -当在与主机( Python 脚本执行的位置)相同架构的模拟 target 上运行时,为 TARGET 选择下面的「host」,选择 C Runtime 作为 RUNTIME ,并选择适当的单板/虚拟机来运行它(Zephyr 将创建基于 BOARD 的正确 QEMU 虚拟机)。 +当在与主机( Python 脚本执行的位置)相同架构的模拟 target 上运行时,为 TARGET 选择下面的「crt」,选择 C Runtime 作为 RUNTIME ,并选择适当的单板/虚拟机来运行它(Zephyr 将创建基于 BOARD 的正确 QEMU 虚拟机)。 下面的示例中,选择 x86 架构并相应地选择 x86 虚拟机: ``` python RUNTIME = tvm.relay.backend.Runtime("crt", {"system-lib": True}) -TARGET = tvm.target.target.micro("host") +TARGET = tvm.micro.testing.get_target("crt") -# -# 为物理硬件编译 -# 在物理硬件上运行时,选择描述硬件的 TARGET 和 BOARD。 -# 下面的示例中选择 STM32F746 Nucleo target 和单板。另一种选择是 -# STM32F746 Discovery 板。由于该板具有与 Nucleo 相同的 MCU -# 板,但是一些接线和配置不同,选择「stm32f746g_disco」 -# 板生成正确的固件镜像。 -# +# 运行于物理硬件时,选择描述对应硬件的 TARGET 和 BOARD。 +# 下面的示例选择 STM32L4R5ZI Nucleo target 和 board。你可以改变测试板, +# 只需要使用不同的 Zephyr 支持单板导入`TVM_MICRO_BOARD` 变量 if use_physical_hw: - boards_file = pathlib.Path(tvm.micro.get_microtvm_template_projects("zephyr")) / "boards.json" - with open(boards_file) as f: - boards = json.load(f) - - BOARD = os.getenv("TVM_MICRO_BOARD", default="nucleo_f746zg") - TARGET = tvm.target.target.micro(boards[BOARD]["model"]) + BOARD = os.getenv("TVM_MICRO_BOARD", default="nucleo_l4r5zi") + SERIAL = os.getenv("TVM_MICRO_SERIAL", default=None) + TARGET = tvm.micro.testing.get_target("zephyr", BOARD) # # 对于某些单板,Zephyr 默认使用 QEMU 模拟运行,例如,下面 -# TARGET 和 BOARD 用于为 mps2-an521 开发板构建 microTVM 固件。自从那块板 -# 在 Zephyr 上默认模拟运行,板名称添加后缀「-qemu」通知 -# microTVM 必须使用 QEMU 传输器与开发板通信。如果名称 -# 已经有前缀「qemu_」,比如「qemu_x86」,就不需要加上那个后缀了。 +# TARGET 和 BOARD 用于为 mps2-an521 开发板构建 microTVM 固件。 # -# TARGET = tvm.target.target.micro("mps2_an521") -# BOARD = "mps2_an521-qemu" +# `mps2_an521 = "mps2_an521"` +# `TARGET = tvm.micro.testing.get_target("zephyr", BOARD)` ``` -为 target 编译模型: +为 target 编译模型。如果你不需要执行器将默认使用图执行器。 ``` python -with tvm.transform.PassContext( - opt_level=3, config={"tir.disable_vectorize": True}, disabled_pass=["AlterOpLayout"] -): +with tvm.transform.PassContext(opt_level=3, config={"tir.disable_vectorize": True}): module = relay.build(mod, target=TARGET, runtime=RUNTIME, params=params) +``` # 检查编译输出 -# --------------------------------- -# -# 编译过程产生了一些计算图中实现算子的 C 代码。 -# 可以通过打印 CSourceModule 内容来检查它(本教程 -# 只打印前 10 行): +编译过程产生了一些计算图中实现算子的 C 代码。可以通过打印 CSourceModule 内容来检查它(本教程只打印前 10 行): +```python c_source_module = module.get_lib().imported_modules[0] assert c_source_module.type_key == "c", "tutorial is broken" @@ -212,27 +177,21 @@ assert any( l.startswith("TVM_DLL int32_t tvmgen_default_") for l in first_few_lines ), f"tutorial is broken: {first_few_lines!r}" print("\n".join(first_few_lines)) +``` # 编译生成的代码 -# ---------------------------- -# -# 下面需要将生成的 C 代码合并到一个项目中,以便在 -# 设备中运行推理。最简单的方法是自己集成,使用 microTVM 的标准输出格式 -# (:doc:`模型库格式` ``),这是具有标准布局的 tarball: +下面需要将生成的 C 代码合并到一个项目中,以便在设备中运行推理。最简单的方法是自己集成,使用 microTVM 的标准输出格式化模型库格式。这是标准布局的 tarball。 +```python # 获取可以存储 tarball 的临时路径(作为教程运行)。 -fd, model_library_format_tar_path = tempfile.mkstemp() -os.close(fd) -os.unlink(model_library_format_tar_path) -tvm.micro.export_model_library_format(module, model_library_format_tar_path) +temp_dir = tvm.contrib.utils.tempdir() +model_tar_path = temp_dir / "model.tar" +export_model_library_format(module, model_tar_path) -with tarfile.open(model_library_format_tar_path, "r:*") as tar_f: +with tarfile.open(model_tar_path, "r:*") as tar_f: print("\n".join(f" - {m.name}" for m in tar_f.getmembers())) -# 清理: -os.unlink(model_library_format_tar_path) - # TVM 还为嵌入式平台提供了一个标准的方式来自动生成一个独立的 # 项目,编译并烧录到一个 target,使用标准的 TVM RPC 与它通信。 # 模型库格式用作此过程的模型输入。 @@ -247,17 +206,21 @@ os.unlink(model_library_format_tar_path) template_project_path = pathlib.Path(tvm.micro.get_microtvm_template_projects("crt")) project_options = {} # 可以使用 TVM 提供特定于平台 options。 -# 编译物理硬件(或仿真板,如 mps_an521) -# -------------------------------------------------------------------------- # 对于物理硬件,可以通过使用不同的模板项目来试用 Zephyr 平台 # 和选项: -# if use_physical_hw: template_project_path = pathlib.Path(tvm.micro.get_microtvm_template_projects("zephyr")) - project_options = {"project_type": "host_driven", "zephyr_board": BOARD} + project_options = { + "project_type": "host_driven", + "board": BOARD, + "serial_number": SERIAL, + "config_main_stack_size": 4096, + "zephyr_base": os.getenv("ZEPHYR_BASE", default="/content/zephyrproject/zephyr"), + } # 创建临时目录 + temp_dir = tvm.contrib.utils.tempdir() generated_project_dir = temp_dir / "generated-project" generated_project = tvm.micro.generate_project( @@ -326,6 +289,6 @@ with tvm.micro.Session(transport_context_manager=generated_project.transport()) result is: [[0.4443792]] ``` -[下载 Python 源代码:micro_tflite.py](https://tvm.apache.org/docs/_downloads/2fb9ae7bf124f72614a43137cf2919cb/micro_tflite.py) +[下载 Python 源代码:micro_tflite.py](https://tvm.apache.org/docs/v0.13.0/_downloads/2fb9ae7bf124f72614a43137cf2919cb/micro_tflite.py) -[下载 Jupyter Notebook:micro_tflite.ipynb](https://tvm.apache.org/docs/_downloads/5b279d8a8718816263fa65b0eef1a5c0/micro_tflite.ipynb) +[下载 Jupyter Notebook:micro_tflite.ipynb](https://tvm.apache.org/docs/v0.13.0/_downloads/5b279d8a8718816263fa65b0eef1a5c0/micro_tflite.ipynb) diff --git a/docs/how_to/microtvm/06-microtvm_arduino.md b/docs/how_to/microtvm/06-microtvm_arduino.md index fa1bd39e..828e117a 100644 --- a/docs/how_to/microtvm/06-microtvm_arduino.md +++ b/docs/how_to/microtvm/06-microtvm_arduino.md @@ -1,8 +1,8 @@ --- -title: 在 Arduino 上为 microTVM 训练视觉模型 +title: 5.在 Arduino 上为 microTVM 训练视觉模型 --- -# 在 Arduino 上为 microTVM 训练视觉模型 +# 5.在 Arduino 上为 microTVM 训练视觉模型 :::note 单击 [此处](https://tvm.apache.org/docs/how_to/work_with_microtvm/micro_train.html#sphx-glr-download-how-to-work-with-microtvm-micro-train-py) 下载完整的示例代码 @@ -12,10 +12,6 @@ title: 在 Arduino 上为 microTVM 训练视觉模型 本教程介绍如何训练 MobileNetV1 模型以适应嵌入式设备,以及如何使用 TVM 将这些模型部署到 Arduino。 -:::note -推荐用 Jupyter Notebook 查看本教程的代码,可以用本页底部的链接下载并运行,或者使用 [Google Colab](https://colab.research.google.com/github/apache/tvm-site/blob/asf-site/docs/_downloads/a7c7ea4b5017ae70db1f51dd8e6dcd82/micro_train.ipynb) 免费在线查看。 -::: - ## 背景简介 构建物联网设备时,通常想让它们能够**看到并理解**它们周围的世界。可以采取多种形式,但通常设备也会想知道**某种物体**是否在其视野中。 @@ -346,20 +342,24 @@ TVM 是一个优化编译器,对模型的优化是通过**中间表示**分阶 ``` python import shutil -import tflite import tvm +import tvm.micro.testing # 在 TFLite 1 和 2 中加载模型的方法不同 try: # TFLite 2.1 and above # TFLite 2.1 及以上 + import tflite + tflite_model = tflite.Model.GetRootAsModel(quantized_model, 0) except AttributeError: # Fall back to TFLite 1.14 method # 回退到 TFLite 1.14 方法 + import tflite.Model + tflite_model = tflite.Model.Model.GetRootAsModel(quantized_model, 0) # 转换为 Relay 中间表示 mod, params = tvm.relay.frontend.from_tflite(tflite_model) # 设置配置标志以提高性能 -target = tvm.target.target.micro("nrf52840") +target = tvm.micro.testing.get_target("zephyr", "nrf5340dk_nrf5340_cpuapp") runtime = tvm.relay.backend.Runtime("crt") executor = tvm.relay.backend.Executor("aot", {"unpacked-api": True}) @@ -374,7 +374,7 @@ arduino_project = tvm.micro.generate_project( mod, f"{FOLDER}/models/project", { - "arduino_board": "nano33ble", + "board": "nano33ble", "arduino_cli_cmd": "/content/bin/arduino-cli", "project_type": "example_project", }, @@ -505,6 +505,6 @@ Other object results: **脚本总运行时长:**( 4 分 44.392 秒) -[下载 Python 源代码:micro_train.py](https://tvm.apache.org/docs/_downloads/b52cec46baf4f78d6bcd94cbe269c8a6/micro_train.py) +[下载 Python 源代码:micro_train.py](https://tvm.apache.org/docs/v0.13.0/_downloads/b52cec46baf4f78d6bcd94cbe269c8a6/micro_train.py) -[下载 Jupyter Notebook:micro_train.ipynb](https://tvm.apache.org/docs/_downloads/a7c7ea4b5017ae70db1f51dd8e6dcd82/micro_train.ipynb) +[下载 Jupyter Notebook:micro_train.ipynb](https://tvm.apache.org/docs/v0.13.0/_downloads/a7c7ea4b5017ae70db1f51dd8e6dcd82/micro_train.ipynb) diff --git a/docs/how_to/microtvm/07-tvmc_micro.md b/docs/how_to/microtvm/07-tvmc_micro.md index 8f566859..7bf17d58 100644 --- a/docs/how_to/microtvm/07-tvmc_micro.md +++ b/docs/how_to/microtvm/07-tvmc_micro.md @@ -1,8 +1,8 @@ --- -title: 使用 TVMC Micro 执行微模型 +title: 1. microRVM CLI 工具 --- -# 使用 TVMC Micro 执行微模型 +# 1. 使用 TVMC Micro 执行微模型 :::note 单击 [此处](https://tvm.apache.org/docs/how_to/work_with_microtvm/micro_tvmc.html#sphx-glr-download-how-to-work-with-microtvm-micro-tvmc-py) 下载完整的示例代码 @@ -10,19 +10,44 @@ title: 使用 TVMC Micro 执行微模型 **作者**:[Mehrdad Hessar](https://github.com/mehrdadh) -本教程介绍了如何为微型设备编译一个微模型,并在 Zephyr 平台上构建一个程序,来执行这个模型,烧录程序,并用 tvmc micro 命令来执行所有模型。 +本教程介绍了如何为微型设备编译一个微模型,并在 Zephyr 平台上构建一个程序,来执行这个模型,烧录程序,并用 tvmc micro 命令来执行所有模型。在进行本教程之前你需要安装 python 和 Zephyr 依赖 -:::note -本教程将介绍如何在 Zephyr 平台上使用 TVMC Mirco。学习本教程前,请安装 Zephyr 依赖项,或通过以下方式(已经安装了 Zephyr 依赖)之一运行本教程。 +## 安装 microTVM Python 依赖项 +TVM 不包含用于 Python 串行通信包,因此在使用 microTVM 之前我们必须先安装一个。我们还需要TFLite来加载模型。 + +```bash +pip install pyserial==3.5 tflite==2.1 +``` -* 使用 [microTVM 虚拟机参考手册](https://tvm.apache.org/docs/how_to/work_with_microtvm/micro_reference_vm.html#sphx-glr-how-to-work-with-microtvm-micro-reference-vm-py)。 -* 使用 TVM 提供的 QEMU Docker 镜像。下载并登录到 Docker 镜像: +## 安装 Zephyr ``` bash -cd tvm -./docker/bash.sh tlcpack/ci-qemu +# 安装 west 和 ninja +python3 -m pip install west +apt-get install -y ninja-build + +# 安装 ZephyrProject +ZEPHYR_PROJECT_PATH="/content/zephyrproject" +export ZEPHYR_BASE=${ZEPHYR_PROJECT_PATH}/zephyr +west init ${ZEPHYR_PROJECT_PATH} +cd ${ZEPHYR_BASE} +git checkout v3.2-branch +cd .. +west update +west zephyr-export +chmod -R o+w ${ZEPHYR_PROJECT_PATH} + +# 安装 Zephyr SDK +cd /content +ZEPHYR_SDK_VERSION="0.15.2" +wget "https://github.com/zephyrproject-rtos/sdk-ng/releases/download/v${ZEPHYR_SDK_VERSION}/zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.gz" +tar xvf "zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.gz" +mv "zephyr-sdk-${ZEPHYR_SDK_VERSION}" zephyr-sdk +rm "zephyr-sdk-${ZEPHYR_SDK_VERSION}_linux-x86_64.tar.gz" + +# 安装 python 依赖 +python3 -m pip install -r "${ZEPHYR_BASE}/scripts/requirements.txt" ``` -::: ## 使用 TVMC Micro @@ -44,31 +69,29 @@ tvmc micro --help ## 获取微模型 -本教程使用 TFLite micro 的 Magic Wand 模型(一种深度卷积层模型,可通过加速度传感器识别手势)。 +本教程使用 TFLite micro 的 Micro Speech 模型。Micro Speech 是一个深度卷积模型,可以识别演讲中的关键词。 本教程使用 TFLite 格式的模型。 ``` bash -wget https://github.com/tensorflow/tflite-micro/raw/main/tensorflow/lite/micro/examples/magic_wand/magic_wand.tflite +wget https://github.com/tensorflow/tflite-micro/raw/a56087ffa2703b4d5632f024a8a4c899815c31bb/tensorflow/lite/micro/examples/micro_speech/micro_speech.tflite ``` ## 将 TFLite 模型编译为模型库格式 模型库格式(Model Library Format,简称 MLF)是 TVM 为微 target 提供的一种输出格式,MLF 是包含了 TVM 编译器输出的所有部分的 tarball,这些编译器输出可以用于 TVM 环境之外的微 target。更多信息请访问 [模型库格式](https://tvm.apache.org/docs/arch/model_library_format.html)。 -为 `qemu_x86` Zephyr 板生成一个 MLF 文件,为 `magic_wand` TFLite 模型生成 MLF 输出: +在这里,我们为 `qemu_x86` Zephyr 板生成一个 MLF 文件。您可以选择使用 AOT 或图形执行器类型来运行本教程,不过我们建议在 microTVM 目标上使用 AOT,因为 AOT 使用静态内存分配的提前编译。要生成 `micro_speech` tflite 模型的 MLF 输出:: ``` bash -tvmc compile magic_wand.tflite \ - --target='c -keys=cpu -link-params=0 -model=host' \ - --runtime=crt \ - --runtime-crt-system-lib 1 \ - --executor='graph' \ - --executor-graph-link-params 0 \ - --output model.tar \ - --output-format mlf \ - --pass-config tir.disable_vectorize=1 \ - --disabled-pass=AlterOpLayout +tvmc compile micro_speech.tflite \ + --target='c -keys=cpu -model=host' \ + --runtime=crt \ + --runtime-crt-system-lib 1 \ + --executor='aot' \ + --output model.tar \ + --output-format mlf \ + --pass-config tir.disable_vectorize=1 ``` 这将生成一个包含 TVM 编译器输出文件的 `model.tar` 文件。若要为不同的 Zephyr 设备运行此命令,需要更新 `target`。例如,对于 `nrf5340dk_nrf5340_cpuapp` 板,target 是 `--target='c -keys=cpu -link-params=0 -model=nrf5340dk'`。 @@ -82,7 +105,7 @@ tvmc micro create \ project \ model.tar \ zephyr \ - --project-option project_type=host_driven zephyr_board=qemu_x86 + --project-option project_type=host_driven board=qemu_x86 ``` 以上命令为 `qemu_x86` Zephyr 板生成一个 `Host-Driven` Zephyr 项目,在 Host-Driven 模板项目中,图执行器(Graph Executor)将在主机上运行,并通过使用 RPC 机制向设备发出命令,在 Zephyr 设备上运行模型执行。阅读有关[主机驱动执行](https://tvm.apache.org/docs/arch/microtvm_design.html#host-driven-execution)的更多信息。 @@ -127,17 +150,20 @@ tvmc run \ --fill-mode ones \ --print-top 4 - # Output: - # - # INFO:__main__:b'[100%] [QEMU] CPU: qemu32,+nx,+pae\n' - # remote: microTVM Zephyr runtime - running - # INFO:__main__:b'[100%] Built target run\n' - # [[3. 1. 2. 0. ] - # [0.47213247 0.41364592 0.07525456 0.03896701]] ``` 具体来说,此命令将模型的输入全部设置为 1,并显示输出的四个值及其索引。 -[下载 Python 源代码:micro_tvmc.py](https://tvm.apache.org/docs/_downloads/eb483c672b88006c331115968e0ffd9b/micro_tvmc.py) +```bash +# Output: +# INFO:__main__:b'[100%] [QEMU] CPU: qemu32,+nx,+pae\n' +# remote: microTVM Zephyr runtime - running +# INFO:__main__:b'[100%] Built target run\n' +# [[ 3 2 1 0] +# [ 113 -120 -121 -128]] + +``` + +[下载 Python 源代码:micro_tvmc.py](https://tvm.apache.org/docs/v0.13.0/_downloads/eb483c672b88006c331115968e0ffd9b/micro_tvmc.py) -[下载 Jupyter notebook:micro_tvmc.ipynb](https://tvm.apache.org/docs/_downloads/6e511f5a8ddbf12f2fca2dfadc0cc4a9/micro_tvmc.ipynb) +[下载 Jupyter notebook:micro_tvmc.ipynb](https://tvm.apache.org/docs/v0.13.0/_downloads/6e511f5a8ddbf12f2fca2dfadc0cc4a9/micro_tvmc.ipynb) diff --git a/docs/how_to/microtvm/08-micro_pytorch.md b/docs/how_to/microtvm/08-micro_pytorch.md index 5323820e..933dace3 100644 --- a/docs/how_to/microtvm/08-micro_pytorch.md +++ b/docs/how_to/microtvm/08-micro_pytorch.md @@ -11,7 +11,7 @@ title: 4.microTVM PyTorch 教程 该教程展示了如何使用 PyTorch 模型进行 microTVM 主机驱动的 AOT 编译。此教程可以在使用 C 运行时(CRT)的 x86 CPU 上执行。 -**注意:** 此教程仅在使用 CRT 的 x86 CPU 上运行,不支持在 Zephyr 上运行,因为该模型不适用于我们当前支持的 Zephyr 主板。 +**注意:** 此教程仅在使用 CRT 的 x86 CPU 上运行,不支持在 Zephyr 上运行,因为该模型不适用于我们当前支持的 Zephyr 单板。 ## 安装 microTVM Python 依赖项 TVM 不包含用于 Python 串行通信包,因此在使用 microTVM 之前我们必须先安装一个。我们还需要TFLite来加载模型。 @@ -51,7 +51,7 @@ img_url = "https://github.com/dmlc/mxnet.js/blob/main/data/cat.png?raw=true" img_path = download_testdata(img_url, "cat.png", module="data") img = Image.open(img_path).resize((224, 224)) -# Preprocess the image and convert to tensor +# 预处理图片并转换为张量 my_preprocess = transforms.Compose( [ transforms.Resize(256), @@ -133,7 +133,7 @@ project = tvm.micro.generate_project( ``` ## 构建、烧录和执行模型 -接下来,我们构建 microTVM项 目并进行烧录。烧录步骤特定于物理微控制器,如果通过主机的 `main.cc` 模拟微控制器,或者选择 Zephyr 模拟主板作为目标,则会跳过该步骤。 +接下来,我们构建 microTVM项 目并进行烧录。烧录步骤特定于物理微控制器,如果通过主机的 `main.cc` 模拟微控制器,或者选择 Zephyr 模拟单板作为目标,则会跳过该步骤。 ```python project.build() @@ -201,4 +201,8 @@ Relay top-1 id: 282, class name: tiger cat Torch top-1 id: 282, class name: tiger cat ``` -**该脚本总运行时间:**(1分26.552秒) \ No newline at end of file +**该脚本总运行时间:**(1分26.552秒) + +[下载 Python 源代码:micro_pytorch.py](https://tvm.apache.org/docs/v0.13.0/_downloads/12b9ecc04c41abaa12022061771821d1/micro_pytorch.py) + +[下载 Jupyter notebook:micro_pytorch.ipynb](https://tvm.apache.org/docs/v0.13.0/_downloads/09df7d9b9c90a2a1bdd570520693fd9f/micro_pytorch.ipynb) \ No newline at end of file diff --git a/docs/how_to/microtvm/09-micro_mlperftiny.md b/docs/how_to/microtvm/09-micro_mlperftiny.md index f57248fb..123e7a38 100644 --- a/docs/how_to/microtvm/09-micro_mlperftiny.md +++ b/docs/how_to/microtvm/09-micro_mlperftiny.md @@ -291,4 +291,8 @@ west flash ``` -现在,您可以按照这些说明将您的板子连接到 EEMBC runner 并在您的板子上对此模型进行基准测试。 \ No newline at end of file +现在,您可以按照这些说明将您的板子连接到 EEMBC runner 并在您的板子上对此模型进行基准测试。 + +[下载 Python 源代码:micro_mlperftiny.py](https://tvm.apache.org/docs/v0.13.0/_downloads/4577847d31fa9ec38d0a6dda3e1d178d/micro_mlperftiny.py) + +[下载 Jupyter notebook:micro_mlperftiny.ipynb](https://tvm.apache.org/docs/v0.13.0/_downloads/1fc1683d67bee4f26703504a58d42578/micro_mlperftiny.ipynb) \ No newline at end of file diff --git a/docs/how_to/microtvm/10-micro_custom_ide.md b/docs/how_to/microtvm/10-micro_custom_ide.md index 75f7cb50..db065490 100644 --- a/docs/how_to/microtvm/10-micro_custom_ide.md +++ b/docs/how_to/microtvm/10-micro_custom_ide.md @@ -310,4 +310,8 @@ void TVMLogf(const char* msg, ...) { ## 评估模型 -现在,选择菜单栏中的 Run -> Run 来刷写 MCU 并运行项目。您应该看到 LED 在闪烁,并且控制台上在打印推理结果。 \ No newline at end of file +现在,选择菜单栏中的 Run -> Run 来刷写 MCU 并运行项目。您应该看到 LED 在闪烁,并且控制台上在打印推理结果。 + +[下载 Python 源代码:micro_custom_ide.py](https://tvm.apache.org/docs/v0.13.0/_downloads/9322c6c215567e9975d1df6b3a218ff1/micro_custom_ide.py) + +[下载 Jupyter notebook:micro_custom_ide.ipynb](https://tvm.apache.org/docs/v0.13.0/_downloads/a74627f44186b95116fe0ed6f77e3b99/micro_custom_ide.ipynb) \ No newline at end of file From 14efef5dac926f862e6f6d23e7f276f3d8b96093 Mon Sep 17 00:00:00 2001 From: anleeos <2937160075@qq.com> Date: Fri, 8 Dec 2023 16:40:43 +0800 Subject: [PATCH 09/26] fix build fail --- docs/how_to/microtvm/10-micro_custom_ide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_to/microtvm/10-micro_custom_ide.md b/docs/how_to/microtvm/10-micro_custom_ide.md index db065490..8e15edb0 100644 --- a/docs/how_to/microtvm/10-micro_custom_ide.md +++ b/docs/how_to/microtvm/10-micro_custom_ide.md @@ -189,7 +189,7 @@ with tarfile.open(TAR_PATH, mode="a") as tar_file: 4. 一个文本框将出现,询问是否要 “以默认模式初始化所有外设?”。点击 “Yes”。这将生成项目并打开设备配置工具,您可以使用 GUI 设置外设。默认情况下启用了 USB、USART3 和 LPUART1,以及一些 GPIO。 5. 我们将使用 LPUART1 将数据发送到主机 PC。从连接部分中选择 LPUART1,并将 “Baud Rate” 设置为 115200,将 “Word Length” 设置为 8。保存更改并点击 “Yes” 以重新生成初始化代码。这应该会重新生成代码并打开您的 main.c 文件。您还可以从左侧的 Project Explorer 面板中找到 main.c,在 microtvm_vww_demo -> Core -> Src 下。 6. 为了进行健全性检查,请复制下面的代码并将其粘贴到主函数的无线循环(即 While(1) )部分。 - * 注意:确保您的代码写在由 USER CODE BEGIN <...> 和 USER CODE END <...> 包围的部分内。如果重新生成初始化代码,被包围之外的代码将被擦除。 + * 注意:确保您的代码写在由 USER CODE BEGIN\<...\> 和 USER CODE END\<...\> 包围的部分内。如果重新生成初始化代码,被包围之外的代码将被擦除。 ``` From 82571dc1c87597ca9458c1775868089e6ed3be54 Mon Sep 17 00:00:00 2001 From: anleeos <2937160075@qq.com> Date: Fri, 8 Dec 2023 16:41:24 +0800 Subject: [PATCH 10/26] fix <> --- docs/how_to/microtvm/10-micro_custom_ide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_to/microtvm/10-micro_custom_ide.md b/docs/how_to/microtvm/10-micro_custom_ide.md index 8e15edb0..be88f326 100644 --- a/docs/how_to/microtvm/10-micro_custom_ide.md +++ b/docs/how_to/microtvm/10-micro_custom_ide.md @@ -200,7 +200,7 @@ HAL_Delay(1000); 7. 从菜单栏中选择 Project -> Build(或右键单击项目名称并选择 Build)。这将构建项目并生成 .elf 文件。选择 Run -> Run 以将二进制文件下载到您的 MCU。如果打开了“Edit Configuration”窗口,请直接点击 “OK”。 -8. 在主机机器上打开终端控制台。在 Mac 上,您可以简单地使用 “screen 115200” 命令,例如 “screen tty.usbmodemXXXX 115200” 。板上的 LED 应该会闪烁,终端控制台上每秒应该会打印出字符串 “Hello World.”。按 “Control-a k” 退出 screen。 +8. 在主机机器上打开终端控制台。在 Mac 上,您可以简单地使用 “screen \ 115200” 命令,例如 “screen tty.usbmodemXXXX 115200” 。板上的 LED 应该会闪烁,终端控制台上每秒应该会打印出字符串 “Hello World.”。按 “Control-a k” 退出 screen。 ## 将模型导入生成的项目 要将编译后的模型集成到生成的项目中,请按照以下步骤操作: From aeaf7f2ddf4a8180c788961b747174f45e10307a Mon Sep 17 00:00:00 2001 From: anleeos <2937160075@qq.com> Date: Mon, 11 Dec 2023 15:41:31 +0800 Subject: [PATCH 11/26] update index --- docs/topic/microtvm/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/topic/microtvm/index.md b/docs/topic/microtvm/index.md index 2b91dfd1..7da5f857 100644 --- a/docs/topic/microtvm/index.md +++ b/docs/topic/microtvm/index.md @@ -26,9 +26,9 @@ microTVM 目前测试支持 Zephyr RTOS 的 Cortex-M 微控制器;不过,它 在使用 microTVM 之前,推荐使用支持的开发板。然后,按照这些教程开始使用 microTVM: -1. [启动 microTVM 虚拟机参考手册](/docs/how_to/microtvm/microtvm_vm)。microTVM 教程依赖于 Zephyr 和硬件的编译器工具链。通过虚拟机参考手册,可快速安装这些依赖。 -2. 尝试使用 [TFLite 教程的 microTVM](/docs/how_to/microtvm/microtvm_tflite)。 -3. 尝试运行更复杂的 [CIFAR10-CNN 模型](https://github.com/areusch/microtvm-blogpost-eval)。 +1. 尝试使用[microTVM CLI 工具](https://tvm.apache.org/docs/v0.13.0/how_to/work_with_microtvm/micro_tvmc.html#tutorial-micro-cli-tool)。 +2. 尝试使用 [microTVM TFLite 教程](/docs/how_to/microtvm/microtvm_tflite)。 +3. 尝试运行更复杂的 [使用 microTVM 创建你的 MLPerfTiny 提交](https://tvm.apache.org/docs/v0.13.0/how_to/work_with_microtvm/micro_mlperftiny.html#tutorial-micro-mlperftiny)。 ## microTVM 的工作原理 From 14325b54925ce12080a3e3d3bcc1057c2a26b788 Mon Sep 17 00:00:00 2001 From: anleeos <2937160075@qq.com> Date: Mon, 11 Dec 2023 16:06:26 +0800 Subject: [PATCH 12/26] conflict --- docs/topic/microtvm/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/topic/microtvm/index.md b/docs/topic/microtvm/index.md index 7da5f857..a76ba75c 100644 --- a/docs/topic/microtvm/index.md +++ b/docs/topic/microtvm/index.md @@ -28,7 +28,7 @@ microTVM 目前测试支持 Zephyr RTOS 的 Cortex-M 微控制器;不过,它 1. 尝试使用[microTVM CLI 工具](https://tvm.apache.org/docs/v0.13.0/how_to/work_with_microtvm/micro_tvmc.html#tutorial-micro-cli-tool)。 2. 尝试使用 [microTVM TFLite 教程](/docs/how_to/microtvm/microtvm_tflite)。 -3. 尝试运行更复杂的 [使用 microTVM 创建你的 MLPerfTiny 提交](https://tvm.apache.org/docs/v0.13.0/how_to/work_with_microtvm/micro_mlperftiny.html#tutorial-micro-mlperftiny)。 +3. 尝试运行更复杂的教程 [使用 microTVM 创建你的 MLPerfTiny 提交](https://tvm.apache.org/docs/v0.13.0/how_to/work_with_microtvm/micro_mlperftiny.html#tutorial-micro-mlperftiny)。 ## microTVM 的工作原理 From a2611502deaac437c728e7900c90b86da9e6c0df Mon Sep 17 00:00:00 2001 From: anleeos <2937160075@qq.com> Date: Mon, 11 Dec 2023 16:15:36 +0800 Subject: [PATCH 13/26] broken links --- versioned_docs/version-0.10.0/topic/microtvm/index.md | 2 +- versioned_docs/version-0.12.0/topic/microtvm/index.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/versioned_docs/version-0.10.0/topic/microtvm/index.md b/versioned_docs/version-0.10.0/topic/microtvm/index.md index 2b91dfd1..d213a37e 100644 --- a/versioned_docs/version-0.10.0/topic/microtvm/index.md +++ b/versioned_docs/version-0.10.0/topic/microtvm/index.md @@ -26,7 +26,7 @@ microTVM 目前测试支持 Zephyr RTOS 的 Cortex-M 微控制器;不过,它 在使用 microTVM 之前,推荐使用支持的开发板。然后,按照这些教程开始使用 microTVM: -1. [启动 microTVM 虚拟机参考手册](/docs/how_to/microtvm/microtvm_vm)。microTVM 教程依赖于 Zephyr 和硬件的编译器工具链。通过虚拟机参考手册,可快速安装这些依赖。 +1. [启动 microTVM 虚拟机参考手册](/docs/0.10.0/how_to/microtvm/microtvm_vm)。microTVM 教程依赖于 Zephyr 和硬件的编译器工具链。通过虚拟机参考手册,可快速安装这些依赖。 2. 尝试使用 [TFLite 教程的 microTVM](/docs/how_to/microtvm/microtvm_tflite)。 3. 尝试运行更复杂的 [CIFAR10-CNN 模型](https://github.com/areusch/microtvm-blogpost-eval)。 diff --git a/versioned_docs/version-0.12.0/topic/microtvm/index.md b/versioned_docs/version-0.12.0/topic/microtvm/index.md index 2b91dfd1..58f180e6 100644 --- a/versioned_docs/version-0.12.0/topic/microtvm/index.md +++ b/versioned_docs/version-0.12.0/topic/microtvm/index.md @@ -26,7 +26,7 @@ microTVM 目前测试支持 Zephyr RTOS 的 Cortex-M 微控制器;不过,它 在使用 microTVM 之前,推荐使用支持的开发板。然后,按照这些教程开始使用 microTVM: -1. [启动 microTVM 虚拟机参考手册](/docs/how_to/microtvm/microtvm_vm)。microTVM 教程依赖于 Zephyr 和硬件的编译器工具链。通过虚拟机参考手册,可快速安装这些依赖。 +1. [启动 microTVM 虚拟机参考手册](/docs/0.12.0/how_to/microtvm/microtvm_vm)。microTVM 教程依赖于 Zephyr 和硬件的编译器工具链。通过虚拟机参考手册,可快速安装这些依赖。 2. 尝试使用 [TFLite 教程的 microTVM](/docs/how_to/microtvm/microtvm_tflite)。 3. 尝试运行更复杂的 [CIFAR10-CNN 模型](https://github.com/areusch/microtvm-blogpost-eval)。 From b2f27a359d4b3e531353db73039d96bc73d025fa Mon Sep 17 00:00:00 2001 From: Anleeos <2937160075@qq.com> Date: Mon, 11 Dec 2023 17:10:02 +0800 Subject: [PATCH 14/26] Update docs/how_to/microtvm/01-aot.md Co-authored-by: sparanoid --- docs/how_to/microtvm/01-aot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_to/microtvm/01-aot.md b/docs/how_to/microtvm/01-aot.md index 04324ff0..06a01731 100644 --- a/docs/how_to/microtvm/01-aot.md +++ b/docs/how_to/microtvm/01-aot.md @@ -1,5 +1,5 @@ --- -title: 3.microTVM AoT 编译 +title: 3. microTVM AoT 编译 --- # 3.microTVM AoT 编译 From 1cd725839a9f6c6095cfba8b3699ae07c42a9c55 Mon Sep 17 00:00:00 2001 From: Anleeos <2937160075@qq.com> Date: Mon, 11 Dec 2023 17:10:10 +0800 Subject: [PATCH 15/26] Update docs/how_to/microtvm/02-autotune_microtvm.md Co-authored-by: sparanoid --- docs/how_to/microtvm/02-autotune_microtvm.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_to/microtvm/02-autotune_microtvm.md b/docs/how_to/microtvm/02-autotune_microtvm.md index a7c6d5c5..63ba34a6 100644 --- a/docs/how_to/microtvm/02-autotune_microtvm.md +++ b/docs/how_to/microtvm/02-autotune_microtvm.md @@ -1,5 +1,5 @@ --- -title: 6.使用 microTVM 进行模型调优 +title: 6. 使用 microTVM 进行模型调优 --- # 6.使用 microTVM 进行模型调优 From 6a187cd120af88d2bd276b3b90f51b0bf2c66995 Mon Sep 17 00:00:00 2001 From: Anleeos <2937160075@qq.com> Date: Mon, 11 Dec 2023 17:10:19 +0800 Subject: [PATCH 16/26] Update docs/how_to/microtvm/01-aot.md Co-authored-by: sparanoid --- docs/how_to/microtvm/01-aot.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_to/microtvm/01-aot.md b/docs/how_to/microtvm/01-aot.md index 06a01731..c57b0b78 100644 --- a/docs/how_to/microtvm/01-aot.md +++ b/docs/how_to/microtvm/01-aot.md @@ -2,7 +2,7 @@ title: 3. microTVM AoT 编译 --- -# 3.microTVM AoT 编译 +# 3. microTVM AoT 编译 :::note 单击 [此处](https://tvm.apache.org/docs/how_to/work_with_microtvm/micro_aot.html#sphx-glr-download-how-to-work-with-microtvm-micro-aot-py) 下载完整的示例代码 From 68bd589d0a4b21bcc0941ada9679ec1a1c268137 Mon Sep 17 00:00:00 2001 From: Anleeos <2937160075@qq.com> Date: Mon, 11 Dec 2023 17:10:28 +0800 Subject: [PATCH 17/26] Update docs/how_to/microtvm/02-autotune_microtvm.md Co-authored-by: sparanoid --- docs/how_to/microtvm/02-autotune_microtvm.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_to/microtvm/02-autotune_microtvm.md b/docs/how_to/microtvm/02-autotune_microtvm.md index 63ba34a6..72824398 100644 --- a/docs/how_to/microtvm/02-autotune_microtvm.md +++ b/docs/how_to/microtvm/02-autotune_microtvm.md @@ -2,7 +2,7 @@ title: 6. 使用 microTVM 进行模型调优 --- -# 6.使用 microTVM 进行模型调优 +# 6. 使用 microTVM 进行模型调优 :::note 单击 [此处](https://tvm.apache.org/docs/how_to/work_with_microtvm/micro_autotune.html#sphx-glr-download-how-to-work-with-microtvm-micro-autotune-py) 下载完整的示例代码 From 6eac382e313177736a7a65063d85fac73f077eec Mon Sep 17 00:00:00 2001 From: Anleeos <2937160075@qq.com> Date: Mon, 11 Dec 2023 17:10:36 +0800 Subject: [PATCH 18/26] Update docs/how_to/microtvm/03-tvm_arm.md Co-authored-by: sparanoid --- docs/how_to/microtvm/03-tvm_arm.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_to/microtvm/03-tvm_arm.md b/docs/how_to/microtvm/03-tvm_arm.md index 16c58364..a9b76d11 100644 --- a/docs/how_to/microtvm/03-tvm_arm.md +++ b/docs/how_to/microtvm/03-tvm_arm.md @@ -1,5 +1,5 @@ --- -title: 7.在支持 CMSIS-NN 的 Arm(R) Cortex(R)-M55 CPU 和 Ethos(TM)-U55 NPU 裸机上运行 TVM +title: 7. 在支持 CMSIS-NN 的 Arm(R) Cortex(R)-M55 CPU 和 Ethos(TM)-U55 NPU 裸机上运行 TVM --- # 7.在支持 CMSIS-NN 的 Arm(R) Cortex(R)-M55 CPU 和 Ethos(TM)-U55 NPU 裸机上运行 TVM From 759278b7fcbc5ab4052d3e97c4e2569be2722c93 Mon Sep 17 00:00:00 2001 From: Anleeos <2937160075@qq.com> Date: Mon, 11 Dec 2023 17:10:45 +0800 Subject: [PATCH 19/26] Update docs/how_to/microtvm/08-micro_pytorch.md Co-authored-by: sparanoid --- docs/how_to/microtvm/08-micro_pytorch.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_to/microtvm/08-micro_pytorch.md b/docs/how_to/microtvm/08-micro_pytorch.md index 933dace3..ddcad1a1 100644 --- a/docs/how_to/microtvm/08-micro_pytorch.md +++ b/docs/how_to/microtvm/08-micro_pytorch.md @@ -1,5 +1,5 @@ --- -title: 4.microTVM PyTorch 教程 +title: 4. microTVM PyTorch 教程 --- :::note From 21583ac8e40c7d5af9e7b0c79c949cdda712d034 Mon Sep 17 00:00:00 2001 From: Anleeos <2937160075@qq.com> Date: Mon, 11 Dec 2023 17:10:54 +0800 Subject: [PATCH 20/26] Update docs/how_to/microtvm/08-micro_pytorch.md Co-authored-by: sparanoid --- docs/how_to/microtvm/08-micro_pytorch.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_to/microtvm/08-micro_pytorch.md b/docs/how_to/microtvm/08-micro_pytorch.md index ddcad1a1..c641f8e6 100644 --- a/docs/how_to/microtvm/08-micro_pytorch.md +++ b/docs/how_to/microtvm/08-micro_pytorch.md @@ -6,7 +6,7 @@ title: 4. microTVM PyTorch 教程 单击 [此处](https://tvm.apache.org/docs/v0.13.0/how_to/work_with_microtvm/micro_pytorch.html#sphx-glr-download-how-to-work-with-microtvm-micro-pytorch-py) 下载完整的示例代码 ::: -# 4.microTVM PyTorch 教程 +# 4. microTVM PyTorch 教程 **作者:**[Mehrdad Hessar](https://github.com/mehrdadh) 该教程展示了如何使用 PyTorch 模型进行 microTVM 主机驱动的 AOT 编译。此教程可以在使用 C 运行时(CRT)的 x86 CPU 上执行。 From 80ca7a66ca837313750c250e038484d0c9451199 Mon Sep 17 00:00:00 2001 From: Anleeos <2937160075@qq.com> Date: Mon, 11 Dec 2023 17:11:01 +0800 Subject: [PATCH 21/26] Update docs/how_to/microtvm/09-micro_mlperftiny.md Co-authored-by: sparanoid --- docs/how_to/microtvm/09-micro_mlperftiny.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_to/microtvm/09-micro_mlperftiny.md b/docs/how_to/microtvm/09-micro_mlperftiny.md index 123e7a38..1f15cc87 100644 --- a/docs/how_to/microtvm/09-micro_mlperftiny.md +++ b/docs/how_to/microtvm/09-micro_mlperftiny.md @@ -1,5 +1,5 @@ --- -title: 8.创建使用 microTVM 的 MLPerfTiny 提交 +title: 8. 创建使用 microTVM 的 MLPerfTiny 提交 --- :::note From 258923fb2936cb90811de96d2e6cc9eef271283a Mon Sep 17 00:00:00 2001 From: Anleeos <2937160075@qq.com> Date: Mon, 11 Dec 2023 17:11:09 +0800 Subject: [PATCH 22/26] Update docs/how_to/microtvm/09-micro_mlperftiny.md Co-authored-by: sparanoid --- docs/how_to/microtvm/09-micro_mlperftiny.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_to/microtvm/09-micro_mlperftiny.md b/docs/how_to/microtvm/09-micro_mlperftiny.md index 1f15cc87..2a31d66b 100644 --- a/docs/how_to/microtvm/09-micro_mlperftiny.md +++ b/docs/how_to/microtvm/09-micro_mlperftiny.md @@ -7,7 +7,7 @@ title: 8. 创建使用 microTVM 的 MLPerfTiny 提交 ::: -# 8.创建使用 microTVM 的 MLPerfTiny 提交 +# 8. 创建使用 microTVM 的 MLPerfTiny 提交 **作者:**[Mehrdad Hessar](https://github.com/mehrdadh) From ec0b3577d3f2988f8c167002cd5fb7a5ef24ed6a Mon Sep 17 00:00:00 2001 From: Anleeos <2937160075@qq.com> Date: Mon, 11 Dec 2023 17:11:16 +0800 Subject: [PATCH 23/26] Update docs/how_to/microtvm/10-micro_custom_ide.md Co-authored-by: sparanoid --- docs/how_to/microtvm/10-micro_custom_ide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_to/microtvm/10-micro_custom_ide.md b/docs/how_to/microtvm/10-micro_custom_ide.md index be88f326..c9aba3cb 100644 --- a/docs/how_to/microtvm/10-micro_custom_ide.md +++ b/docs/how_to/microtvm/10-micro_custom_ide.md @@ -1,5 +1,5 @@ --- -title: 9.开发环境中加入 microTVM +title: 9. 开发环境中加入 microTVM --- :::note From 657134916682087b69b0ef6bbcbf505fb4c30de1 Mon Sep 17 00:00:00 2001 From: Anleeos <2937160075@qq.com> Date: Mon, 11 Dec 2023 17:11:30 +0800 Subject: [PATCH 24/26] Update docs/how_to/microtvm/03-tvm_arm.md Co-authored-by: sparanoid --- docs/how_to/microtvm/03-tvm_arm.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_to/microtvm/03-tvm_arm.md b/docs/how_to/microtvm/03-tvm_arm.md index a9b76d11..674443d7 100644 --- a/docs/how_to/microtvm/03-tvm_arm.md +++ b/docs/how_to/microtvm/03-tvm_arm.md @@ -2,7 +2,7 @@ title: 7. 在支持 CMSIS-NN 的 Arm(R) Cortex(R)-M55 CPU 和 Ethos(TM)-U55 NPU 裸机上运行 TVM --- -# 7.在支持 CMSIS-NN 的 Arm(R) Cortex(R)-M55 CPU 和 Ethos(TM)-U55 NPU 裸机上运行 TVM +# 7. 在支持 CMSIS-NN 的 Arm(R) Cortex(R)-M55 CPU 和 Ethos(TM)-U55 NPU 裸机上运行 TVM :::note 单击 [此处](https://tvm.apache.org/docs/how_to/work_with_microtvm/micro_ethosu.html#sphx-glr-download-how-to-work-with-microtvm-micro-ethosu-py) 下载完整的示例代码 From 415a1762caf3ba3078a70f666b8c307f84752d97 Mon Sep 17 00:00:00 2001 From: Anleeos <2937160075@qq.com> Date: Mon, 11 Dec 2023 17:11:40 +0800 Subject: [PATCH 25/26] Update docs/how_to/microtvm/06-microtvm_arduino.md Co-authored-by: sparanoid --- docs/how_to/microtvm/06-microtvm_arduino.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_to/microtvm/06-microtvm_arduino.md b/docs/how_to/microtvm/06-microtvm_arduino.md index 828e117a..f3c80632 100644 --- a/docs/how_to/microtvm/06-microtvm_arduino.md +++ b/docs/how_to/microtvm/06-microtvm_arduino.md @@ -1,5 +1,5 @@ --- -title: 5.在 Arduino 上为 microTVM 训练视觉模型 +title: 5. 在 Arduino 上为 microTVM 训练视觉模型 --- # 5.在 Arduino 上为 microTVM 训练视觉模型 From 9d184f3923e96744b46d4d458e4fbea981b81d23 Mon Sep 17 00:00:00 2001 From: Anleeos <2937160075@qq.com> Date: Mon, 11 Dec 2023 17:11:51 +0800 Subject: [PATCH 26/26] Update docs/how_to/microtvm/06-microtvm_arduino.md Co-authored-by: sparanoid --- docs/how_to/microtvm/06-microtvm_arduino.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/how_to/microtvm/06-microtvm_arduino.md b/docs/how_to/microtvm/06-microtvm_arduino.md index f3c80632..cc9e84d3 100644 --- a/docs/how_to/microtvm/06-microtvm_arduino.md +++ b/docs/how_to/microtvm/06-microtvm_arduino.md @@ -2,7 +2,7 @@ title: 5. 在 Arduino 上为 microTVM 训练视觉模型 --- -# 5.在 Arduino 上为 microTVM 训练视觉模型 +# 5. 在 Arduino 上为 microTVM 训练视觉模型 :::note 单击 [此处](https://tvm.apache.org/docs/how_to/work_with_microtvm/micro_train.html#sphx-glr-download-how-to-work-with-microtvm-micro-train-py) 下载完整的示例代码