部署模型并集成 TVM#
本页面包含有关如何将 TVM 部署到各种平台以及如何将其与您的项目集成的指南。
构建 TVM 运行时库#
与传统深度学习框架不同,TVM 栈分为两个主要组件:
TVM 编译器,负责完成模型的所有编译和优化工作。
TVM 运行时,运行在目标设备上。
为了集成编译后的模块,不需要 在目标设备上构建整个 TVM。您只需在桌面上构建 TVM 编译器栈,并使用它来交叉编译部署在目标设备上的模块。
只需要使用轻量级的运行时 API,它可以集成到各种平台中。
例如,您可以在基于 Linux 的嵌入式系统(如树莓派)上运行以下命令来构建运行时 API:
git clone --recursive https://github.com/apache/tvm tvm
cd tvm
mkdir build
cp cmake/config.cmake build
cd build
cmake ..
make runtime
请注意,输入 make runtime
仅用于构建运行时库。
也可以对运行时进行交叉编译。交叉编译运行时库不应与为嵌入式设备交叉编译模型混淆。
如果您希望包含额外的运行时(例如 OpenCL),可以修改 config.cmake
以启用这些选项。获取 TVM 运行时库后,您可以链接编译好的库。
TVM 可以为模型(无论是否经过 TVM 优化)在 x64_64
主机上针对不同的架构(例如 aarch64
)进行交叉编译。一旦模型被交叉编译,就需要与目标架构兼容的运行时来运行该交叉编译的模型。
为其他架构交叉编译 TVM 运行时#
在 上面的示例 中,运行时库是在树莓派上编译的。与树莓派等目标设备相比,在具有高性能处理器和充足资源的主机(如笔记本电脑、工作站)上生成运行时库的速度要快得多。为了交叉编译运行时,必须安装目标设备的工具链。安装正确的工具链后,与本地编译的主要区别在于向 cmake 传递一些额外的命令行参数,以指定要使用的工具链。作为参考,在现代笔记本电脑上(使用 8 个线程)为 aarch64
构建 TVM 运行时库大约需要 20 秒,而在树莓派 4 上构建运行时则需要约 10 分钟。
为 aarch64 交叉编译#
sudo apt-get update
sudo apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
cmake .. \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_VERSION=1 \
-DCMAKE_C_COMPILER=/usr/bin/aarch64-linux-gnu-gcc \
-DCMAKE_CXX_COMPILER=/usr/bin/aarch64-linux-gnu-g++ \
-DCMAKE_FIND_ROOT_PATH=/usr/aarch64-linux-gnu \
-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
-DMACHINE_NAME=aarch64-linux-gnu
make -j$(nproc) runtime
对于裸机 ARM 设备,安装以下工具链比 gcc-aarch64-linux-* 更方便:
sudo apt-get install gcc-multilib-arm-linux-gnueabihf g++-multilib-arm-linux-gnueabihf
为 RISC-V 交叉编译#
sudo apt-get update
sudo apt-get install gcc-riscv64-linux-gnu g++-riscv64-linux-gnu
cmake .. \
-DCMAKE_SYSTEM_NAME=Linux \
-DCMAKE_SYSTEM_VERSION=1 \
-DCMAKE_C_COMPILER=/usr/bin/riscv64-linux-gnu-gcc \
-DCMAKE_CXX_COMPILER=/usr/bin/riscv64-linux-gnu-g++ \
-DCMAKE_FIND_ROOT_PATH=/usr/riscv64-linux-gnu \
-DCMAKE_FIND_ROOT_PATH_MODE_PROGRAM=NEVER \
-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=ONLY \
-DMACHINE_NAME=riscv64-linux-gnu
make -j$(nproc) runtime
可以使用 file
命令来查询生成的运行时的架构。
file libtvm_runtime.so
libtvm_runtime.so: ELF 64-bit LSB shared object, UCB RISC-V, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=e9ak845b3d7f2c126dab53632aea8e012d89477e, not stripped
为目标设备优化和调优模型#
在嵌入式设备上测试、调优和基准测试 TVM 内核的最简单且推荐的方法是通过 TVM 的 RPC API。以下是相关教程的链接。
tutorial-cross-compilation-and-rpc
tutorial-deploy-model-on-rasp
在目标设备上部署优化后的模型#
在完成调优和基准测试后,您可能需要在目标设备上部署模型而不依赖 RPC。请参阅以下资源了解如何操作。
- 使用 C++ API 部署 TVM 模块
- 部署到安卓
- 部署到 Adreno™ GPU
- 将 TVM 集成到您的项目中
- HLS 后端示例
- Relay Arm® 计算库集成
- Relay TensorRT 集成
- Vitis AI 集成
- Relay BNNS 集成
- Marvell 机器学习集成
- 1. 简介
- 2. Building TVM with mrvl support
- 2.1 Clone TVM repo
- 2.2 Build and start the TVM - mrvl docker container
- 3. Compiling a model using TVMC command line
- 3.1 TVMC Compilation Flow for a model
- 3.2. TVMC - Command line option(s): Syntax for mrvl target
- 3.3. TVMC Compiler: mrvl specific Command Line Options
- 4. Compile ONNX model using the TVMC flow
- 4.1 Compile and Run ONNX model for Simulator + LLVM / x86_64 target
- 4.2 Compile and Run ONNX model for Octeon target
- 5. Compiling a model using Python APIs
其他部署指南#
还开发了许多针对特定设备的指南,其中包含可在 Jupyter notebook 中查看的 Python 代码。这些指南描述了如何准备模型并将其部署到许多受支持的后端。