# 前言

本篇博客主要介绍如何通过 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,或者知乎 私信,并指明哪一篇博客,我看到一定及时回复,感激不尽!

Edited on

Give me a cup of [coffee]~( ̄▽ ̄)~*

XianMu WeChat Pay

WeChat Pay

XianMu Alipay

Alipay