本篇文章译自英文文档 Deploy Models and Integrate TVM tvm 0.14.dev0 documentation 更多 TVM 中文文档可访问 →Apache TVM 是一个端到端的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。 | Apache TVM 中文站
本节介绍如何将 TVM 布置到各种渠道,以及如何将其与项目集成。
构建 TVM runtime 库
不同于传统的深度学习框架,TVM 仓库分为两个首要组件:
- TVM compiler:负责模型的编译和优化。
- TVM runtime:在方针设备上运行。
集成编译后的模块并不需要在方针设备上构建整个 TVM,只需在你的电脑上构建 TVM 编译器仓库,然后用来穿插编译要布置到方针设备上的模块。
这里只需利用可集成到各种渠道的轻量级 runtime API 即可。
例如,可在基于 Linux 的嵌入式体系(如树莓派)上,运行以下指令来构建 runtime 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 仅构建 runtime 库。
也可以穿插编译 runtime 库,但不要和嵌入式设备的穿插编译模型混淆。
若要包含其他 runtime(例如 OpenCL),可以修正 config.cmake 来启用这些选项。获取 TVM runtime 库后,就可以链接编译好的库了。
TVM 可针对不同架构(例如 x64_64 主机上的 aarch64)穿插编译模型(不管是否被 TVM 优化)。一旦模型被穿插编译,runtime 必须与方针架构兼容,才能运行穿插编译的模型。
为其他架构穿插编译 TVM runtime
在 上面 的示例中,runtime 库是在树莓派上编译的,与树莓派等方针设备相比,在拥有高性能芯片和足够资源的主机(如笔记本电脑、工作站)上生成 runtime 库的速度要快得多。为了穿插编译 runtime,必须装置方针设备的东西链。装置正确的东西链后,与原生编译相比,首要差异在于向 cmake 传递了一些额定的指令行参数来指定要使用的东西链。例如,在现代笔记本电脑(使用 8 个线程)上为 aarch64 构建 TVM runtime 库需要大约 20 秒,而在树莓派 4 上构建 runtime 需要约 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 指令可用于查询生成的 runtime 的架构。
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。下面是相关教程的链接:
- 穿插编译和 RPC
- 在树莓派上布置预练习模型
在方针设备上布置优化模型
完结调优和基准测验后,要在方针设备上以不依赖 RPC 的方法来布置模型。具体操作参阅以下教程:
- 使用 C++ API 布置 TVM 模块
- 布置到 Android
- 将 TVM 集成到项目中
- HLS 后端示例
- Relay Arm 核算库集成
- Relay TensorRT 集成
- Vitis AI 集成
- Relay BNNS 集成
其他布置方法
前面已经有许多针对特定设备的操作指南,其中包含 Python 代码的示例(可用 Jupyter Notebook 查看),这些操作指南描绘了如何准备模型,并将其布置到支撑的后端。
布置深度学习模型