部署模型并集成到 TVM#

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

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

构建 TVM 运行时库#

与传统的深度学习框架不同。TVM 堆栈分为两个主要组件:

  • TVM 编译器(compiler):完成模型的所有编译和优化

  • TVM 运行时(runtime):在目标设备上运行

为了集成已编译的模块,不需要 在目标设备上构建整个 TVM。 您只需要在 desktop 上构建 TVM 编译器堆栈,并使用它来交叉编译部署在目标设备上的模块。

只需要使用轻量级的 runtime API,它可以集成到各种平台中。

例如,在基于 Linux 的嵌入式系统(如 Raspberry Pi)上,可以通过以下命令构建运行时 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 host 上的 aarch64。 一旦模型被交叉编译,为了能够运行交叉编译的模型,就必须有与目标架构兼容的运行时。

交叉编译其他架构的 TVM 运行时#

上面的 例子中,运行时库是在树莓派上编译的。 与树莓派(Raspberry Pi)等目标设备相比,在拥有高性能处理器和充足资源的主机(即 host,如笔记本电脑、工作站)上生成运行时库的速度要快得多。 为了交叉编译运行时,必须安装目标设备的工具链(toolchain)。 在安装了正确的工具链之后,与原生编译的主要区别是向 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

对于 bare metal 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

针对目标设备优化和调优模型#

在嵌入式设备上测试、调优和 benchmark TVM kernel 的最简单和推荐的方法是通过 TVM 的 RPC API。相关教程的链接如下:

在目标设备上部署已优化的模型#

在完成调优和基准测试之后,可能需要在目标设备上部署模型,而不需要依赖 RPC。关于如何这样做,请参阅以下参考资料。

额外的部署指南#

还开发了一些针对特定设备的操作指南,可以在 Jupyter 笔记本中查看可用的 Python 代码。这些“如何操作”描述了如何准备模型并将其部署到许多受支持的后端。

  • ../deploy_models/index