# 前言
本篇博客主要介绍如何通过 G++ 编译器编译 C++ 代码,部署 TVM。
总感觉,属于我们的时代还没开始,就要结束了呢。
------ 大家好啊 我是 暮冬 Z 羡慕
# 现状
TVM 官方文档: 英文文档 中文文档 主要介绍了通过 Python 脚本和 Python 命令行 tvmc 来编译和部署 TVM。但是以这两种方式部署,部署设备还需要安装 Python 运行环境,带来额外空间占用和开销。显然不能以这种方式部署。
TVM 项目的 howto_deploy 目录下提供了 G++ 编译 C++ 代码部署 TVM 的方式。遗憾的是给的例子没有包含模型的权重.params 和图结构.json 的加载,也没有输入图片的加载。
因此本博客提供了一个简单的 C++ 部署 TVM 工程,可以在 TvmCppDeploy 项目 找到并下载,用于你的 TVM 项目部署。
该项目没有使用 TVM 项目 howto_deploy 中的 Makefile,而是重写了 CMakeLists.txt 文件,更方便读懂和修改。
# 使用方式
下载 TvmCppDeploy 项目 到你的本地,可以通过下载 zip 文件后解压缩,也可以直接 git:
git clone https://github.com/ForCheetah/TvmCppDeploy.git |
进入项目根目录,进行必要的路径修改。和 TVM 项目 howto_deploy 一样,本项目也提供了两种部署方式,所需要修改的内容也有些不同。
# 重新编译 tvm_runtime
重新编译 tvm_runtime,和个人的 C++ 文件编译在一起,编译好的可执行文件可独立执行。
- 第 1 步:打开
src/Resnet50_deploy.cc
文件,找到 81 行const std::string artifacts_folder("/home/xiamu/whs/temp/resnet50-tvm/");
,将其中的/home/xiamu/whs/temp/resnet50-tvm/
修改为自己的已经编译好的模型路径,该路径下应该存在有mod.so, mod.params, mod.json
。 - 第 2 步:还是
src/Resnet50_deploy.cc
文件, 找到 132 行,将其中的图片路径/home/xiamu/whs/python/remote_tvm/imagenet_cat.bin
改为自己的图片路径,该 bin 文件应当是已经转换好的 float 格式文件。 - 第 3 步:打开
src/tvm\_runtime\_pack.cc
, 将文件中所有的路径中的/home/xiamu/tvm
修改为你本地 TVM 工程的根目录路径。 修改完一定要检查一下对应的目录中是否有相应的文件。 - 第 4 步:打开
CMakeLists.txt
, 找到第 10 行set(TVM_ROOT /home/xianmu/tvm)
,将其中的/home/xianmu/tvm
改成你本地 TVM 工程的根目录路径。 - 为防止编译报错,可以将
部署方式二: tvm_runtime.so 作为动态链接库编译
对应的代码(43 至 63 行) 注释掉(当前可能还没有对其进行修改)。 - 第 5 步:编译和执行,在根目录下:
mkdir build && cd build | |
cmake .. | |
make -j4 | |
./MyRunnable |
# tvm_runtime.so 作为动态链接库编译
tvm_runtime.so 作为动态链接库,仅编译个人的 C++ 文件,运行时需要链接 libtvm_runtime.so
这种方式的修改与第一种方式略有不同,修改如下:
- 第 1 步:打开
src/Resnet50_deploy.cc
文件,找到 81 行const std::string artifacts_folder("/home/xiamu/whs/temp/resnet50-tvm/");
,将其中的/home/xiamu/whs/temp/resnet50-tvm/
修改为自己的已经编译好的模型路径,该路径下应该存在有mod.so, mod.params, mod.json
。 - 第 2 步:还是
src/Resnet50_deploy.cc
文件, 找到 132 行,将其中的图片路径/home/xiamu/whs/python/remote_tvm/imagenet_cat.bin
改为自己的图片路径,该 bin 文件应当是已经转换好的 float 格式文件。 - 第 3 步:打开
CMakeLists.txt
, 找到第 10 行set(TVM_ROOT /home/xianmu/tvm)
,将其中的/home/xianmu/tvm
改成你本地 TVM 工程的根目录路径。将 62 行的${TVM_ROOT}/build
libtvm_runtime.so 路径修改为你存放 libtvm_runtime.so 库的路径。 - 为防止编译报错,可以将
部署方式一: 重新编译 tvm_runtime
对应的代码(17 至 38 行)注释掉(当前可能还没有对其进行修改)。 - 第 5 步:编译和执行,在根目录下:
mkdir build && cd build | |
cmake .. | |
make -j4 | |
./MyExcute |
# 后记
本博客目前以及可预期的将来都不会支持评论功能。各位大侠如若有指教和问题,可以在我的 github 项目 或随便一个项目下提出 issue,或者知乎 私信,并指明哪一篇博客,我看到一定及时回复,感激不尽!