【TVM教程】使用 TVMC Micro 执行微模型

Apache TVM是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →https://tvm.hyper.ai/

作者Mehrdad Hessar

本教程介绍了如何为微型设备编译一个微模型,并在 Zephyr 平台上构建一个程序,来执行这个模型,烧录程序,并用 tvmc micro 命令来执行所有模型。在进行本教程之前你需要安装 python 和 Zephyr 依赖

安装 microTVM Python 依赖项

TVM 不包含用于 Python 串行通信包,因此在使用 microTVM 之前我们必须先安装一个。我们还需要TFLite来加载模型。

复制代码
pip install pyserial==3.5 tflite==2.1

安装 Zephyr

复制代码
# 安装 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

TVMC 是一个命令行工具,也是 TVM Python 包的一部分。机器设置不同,访问此软件包的方式也不一样。多数情况下,可以直接使用 tvmc 命令。如果在 $PYTHONPATH 上将 TVM 作为 Python 模块,你可以使用 python -m tvm.driver.tvmc 命令来访问此驱动程序。简单起见,本教程使用 tvmc 命令。

检查是否安装了 TVMC 命令,运行如下命令:

复制代码
tvmc --help

使用 tvmc compile 子命令为 microtvm 编译模型,此命令的输出在后续步骤中与 tvmc micro 子命令一起使用。使用以下命令检查 TVMC Micro 是否可用:

复制代码
tvmc micro --help

使用 tvmc micro 执行的主要任务是 createbuildflash。要了解各个子命令下的特定选项,可使用 tvmc micro <subcommand> --help。本教程会使用每个子命令。

获取微模型

本教程使用 TFLite micro 的 Micro Speech 模型。Micro Speech 是一个深度卷积模型,可以识别演讲中的关键词。

本教程使用 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。更多信息请访问 模型库格式

在这里,我们为 qemu_x86 Zephyr 板生成一个 MLF 文件。您可以选择使用 AOT 或图形执行器类型来运行本教程,不过我们建议在 microTVM 目标上使用 AOT,因为 AOT 使用静态内存分配的提前编译。要生成 micro_speech tflite 模型的 MLF 输出::

复制代码
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'

使用模型库格式创建 Zephyr 项目

使用 TVM Micro 子命令 create 生成 Zephyr 项目。将 MLF 格式、项目路径,以及项目选项传递给 create 子命令。每个平台(Zephyr/Arduino)的项目选项在其项目 API 服务器文件中定义。运行如下命令生成 Zephyr 项目:

复制代码
tvmc micro create \
    project \
    model.tar \
    zephyr \
    --project-option project_type=host_driven board=qemu_x86

以上命令为 qemu_x86 Zephyr 板生成一个 Host-Driven Zephyr 项目,在 Host-Driven 模板项目中,图执行器(Graph Executor)将在主机上运行,并通过使用 RPC 机制向设备发出命令,在 Zephyr 设备上运行模型执行。阅读有关主机驱动执行的更多信息。

获取有关 TVMC Micro create 子命令的更多信息,执行如下命令:

复制代码
tvmc micro create --help

使用 TVMC Micro 构建和烧录 Zephyr 项目

接下来使用如下命令构建 Zephyr 项目(包括用于运行微模型的 TVM 生成代码、用于在主机驱动模式下运行模型的 Zephyr 模板代码和 TVM runtime 源/头文件)。要构建项目:

复制代码
tvmc micro build \
    project \
    zephyr \
    --project-option zephyr_board=qemu_x86

以上命令将在 project 目录中构建项目,并在 project/build 下生成二进制文件,要为不同的 Zephyr 板构建 Zephyr 项目,需更改 zephyr_board 项目选项。

接下来把 Zephyr 二进制文件烧录到 Zephyr 设备。对于 qemu_x86 Zephyr 板,因为要用到 QEMU,所以不会执行任何操作,但是对于物理硬件,此步骤不可省略。

复制代码
tvmc micro flash \
    project \
    zephyr \
    --project-option zephyr_board=qemu_x86

在微 Target 上运行微模型

与设备通信后,在设备上对编译好的模型和 TVM RPC 服务器进行编程。Zephyr 板等待主机打开通信通道。MicroTVM 设备通常使用串口通信(UART)进行通信 。要使用 TVMC 在设备上运行闪存模型,可通过 tvmc run 子命令并通过 --device micro 来指定设备类型,打开通信通道,使用主机上的 Graph Executor 设置输入值并在设备上运行完整模型,然后从设备获取输出。

复制代码
tvmc run \
 --device micro \
    project \
    --project-option zephyr_board=qemu_x86 \
    --fill-mode ones \
    --print-top 4

具体来说,此命令将模型的输入全部设置为 1,并显示输出的四个值及其索引。

复制代码
# 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

下载 Jupyter notebook:micro_tvmc.ipynb

相关推荐
1haooo9 分钟前
Mamba 模型:深度学习序列建模的新突破
python·深度学习·神经网络·计算机视觉·transformer
tt55555555555514 分钟前
pyQt学习笔记——Qt资源文件(.qrc)的创建与使用
笔记·学习·pyqt
Johnny_Cheung15 分钟前
第一次程序Hello Python
开发语言·python
戴国进23 分钟前
全面讲解python的uiautomation包
开发语言·python
技能咖36 分钟前
2025春招市场迎AI热潮:生成式人工智能(GAI)认证如何重构人才竞争力
人工智能
士别三日&&当刮目相看1 小时前
JAVA学习*String类
java·开发语言·学习
rookie fish1 小时前
websocket结合promise的通信协议
javascript·python·websocket·网络协议
Heorine1 小时前
数学建模 绘图 图表 可视化(3)
python·数据可视化
2301_764441331 小时前
基于BERT的序列到序列(Seq2Seq)模型,生成文本摘要或标题
人工智能·python·深度学习·bert