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

推荐订阅源

博客园_首页
I
InfoQ
The Register - Security
The Register - Security
L
LangChain Blog
H
Help Net Security
The GitHub Blog
The GitHub Blog
S
Schneier on Security
博客园 - 【当耐特】
W
WeLiveSecurity
Attack and Defense Labs
Attack and Defense Labs
IT之家
IT之家
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Google DeepMind News
Google DeepMind News
The Cloudflare Blog
H
Heimdal Security Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Y
Y Combinator Blog
雷峰网
雷峰网
N
Netflix TechBlog - Medium
Security Archives - TechRepublic
Security Archives - TechRepublic
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
Lohrmann on Cybersecurity
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Exploit Database - CXSecurity.com
P
Privacy & Cybersecurity Law Blog
G
GRAHAM CLULEY
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
V
Visual Studio Blog
博客园 - 聂微东
PCI Perspectives
PCI Perspectives
Last Week in AI
Last Week in AI
A
Arctic Wolf
宝玉的分享
宝玉的分享
T
The Blog of Author Tim Ferriss
S
Secure Thoughts
T
Threat Research - Cisco Blogs
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
SegmentFault 最新的问题
SecWiki News
SecWiki News
月光博客
月光博客
大猫的无限游戏
大猫的无限游戏
Schneier on Security
Schneier on Security
P
Proofpoint News Feed
博客园 - Franky
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
AI
AI
Engineering at Meta
Engineering at Meta

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

【琐记】烟火与尘埃 【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 【AI编译】张量生命周期管理 SystemC 用寄存器同步建模方法 【脉动阵列】脉动阵列类型 【im2col】AScend conv accelerate 【感想】写作进度报告4 【BYOC】TVM添加自定义编译器 ccompiler 【感想】写作进度报告3 【Tengine】推理流程脑图【2】 【Tengine】推理流程脑图【1】 【NCNN】学习ncnn模型转换 【编译器】使用llvm编译自定义语言【3】编译 object 【编译器】使用llvm编译自定义语言【2】转llvm IR 【编译器】使用llvm编译自定义语言【1】构建AST 【AI编译】如何进行内存分配 【感想】写作进度报告2 【AI编译】layer-group之后如何tiling 【AI编译】如何进行layer-group 【量化】连续卷积层首尾量化的可行性 【Gemm】内存对齐 【gemm】Gemm计算加速 【TVM】通过代码学习编译流程【5】FuseOps 【TVM】通过代码学习编译流程【6】CodeGen 【TVM】通过代码学习类【3.5】Pass 【TVM】通过代码学习编译流程【4】BuildRelay 【AI编译】Tiling操作能优化什么时间 【TVM】通过代码学习编译流程【3】模型编译 【TVM】通过代码学习编译流程【2】模型转换 【TVM】通过代码学习编译流程【1】必要知识 【感想】写作进度报告1 【Winograd】卷积加速算法原理及实现 SystemC 等待异步事件解决方案 【TVM】Python脚本实现模型编译和保存 【推理引擎】常见AI推理框架 【3D建模】T110E3卡迪夫蓝调皮肤模型 【推理引擎】NCNN和Tengine量化推理逻辑对比 【3D建模】IS-7攻城锤流纹岩皮肤展示 【TVM】根据例子走通代码库 博客汇总目录 【Im2Col】卷积加速算法【2】NHWC 【Im2Col】卷积加速算法【1】 NCHW openBlas库的安装与简单使用 C语言工程调用Cpp库解决方案 foo Hello World
【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,并指明哪一篇博客,我看到一定及时回复!