部署模型并集成 TVM#

本页面包含有关如何将 TVM 部署到各种平台以及如何将其与您的项目集成的指南。

https://tvm.apache.org/images/release/tvm_flexible.png

构建 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 运行时库后,您可以链接编译好的库。

https://raw.githubusercontent.com/tlc-pack/web-data/main/images/dev/tvm_deploy_crosscompile.svg

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。请参阅以下资源了解如何操作。

其他部署指南#

还开发了许多针对特定设备的指南,其中包含可在 Jupyter notebook 中查看的 Python 代码。这些指南描述了如何准备模型并将其部署到许多受支持的后端。