惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
V
Visual Studio Blog
雷峰网
雷峰网
J
Java Code Geeks
博客园 - 三生石上(FineUI控件)
人人都是产品经理
人人都是产品经理
MyScale Blog
MyScale Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
B
Blog RSS Feed
C
Check Point Blog
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
V
V2EX
D
Docker
IT之家
IT之家
博客园 - 聂微东
腾讯CDC
U
Unit 42
Microsoft Security Blog
Microsoft Security Blog
The Cloudflare Blog

Пусть этот камень будет более крепким, чем человек

【MLIR】Transform Dialect【0】保持计算结构 【MLIR】跟着Toy语言学习MLIR【6】支持复合结构类型 【MLIR】跟着Toy语言学习MLIR【5】降级到LLVM及CodeGen 【MLIR】跟着Toy语言学习MLIR【4】部分降级到低层方言 【MLIR】跟着Toy语言学习MLIR【3】通过接口实现通用转换 【MLIR】跟着Toy语言学习MLIR【2】pattern匹配和重写 【MLIR】跟着Toy语言学习MLIR【1】Toy语言和 Toy Dialect 【琐记】你的爱好能坚持多少年 【琐记】烟火与尘埃 【Triton】Triton实现矩阵乘 【LLM推理加速】FlashAttention 【LLM推理加速】PagedAttention 【LLM推理加速】Online Softmax LLM基础知识【1】 Transformer模型 【AI编译】LayerGroup Tiling Tile的疑惑和思考 【AI编译】深度优先的Tile调度,万事大吉? 【AI编译】多级流水线Tile调度策略 【CUDA C++】GPU内存使用【3】 【AI编译】Cache缓存地址映射 【CUDA C++】GPU存储【2】 【CUDA C++】GPU基本介绍【1】 【00】0序章-不受欢迎的来客 【转载】我来了——持续低熵 【Halide】调度优化【2】 【感想】写作进度报告5 【Halide】调度优化【1】 【转载】北大中文男足战报2 【BYOC】TVM切分子图 【转载】北大中文男足战报1
【TVM】C++部署运行TVM
Post author: XianMu@Пусть этот камень будет более крепким, чем ч · 2024-06-10 · via Пусть этот камень будет более крепким, чем человек

# 前言

本篇博客主要介绍如何通过 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,并指明哪一篇博客,我看到一定及时回复!