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

推荐订阅源

T
Troy Hunt's Blog
Blog — PlanetScale
Blog — PlanetScale
Engineering at Meta
Engineering at Meta
F
Full Disclosure
Recorded Future
Recorded Future
The GitHub Blog
The GitHub Blog
Microsoft Security Blog
Microsoft Security Blog
GbyAI
GbyAI
博客园_首页
博客园 - 叶小钗
MongoDB | Blog
MongoDB | Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Recent Commits to openclaw:main
Recent Commits to openclaw:main
H
Hacker News: Front Page
人人都是产品经理
人人都是产品经理
The Cloudflare Blog
博客园 - 司徒正美
Webroot Blog
Webroot Blog
Google DeepMind News
Google DeepMind News
Help Net Security
Help Net Security
Cloudbric
Cloudbric
PCI Perspectives
PCI Perspectives
有赞技术团队
有赞技术团队
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
TaoSecurity Blog
TaoSecurity Blog
L
Lohrmann on Cybersecurity
量子位
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Tailwind CSS Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
B
Blog RSS Feed
Apple Machine Learning Research
Apple Machine Learning Research
大猫的无限游戏
大猫的无限游戏
P
Proofpoint News Feed
N
News and Events Feed by Topic
罗磊的独立博客
T
Threat Research - Cisco Blogs
Schneier on Security
Schneier on Security
T
Tor Project blog
IT之家
IT之家
M
MIT News - Artificial intelligence
S
Security @ Cisco Blogs
O
OpenAI News
AI
AI
S
Securelist
Simon Willison's Weblog
Simon Willison's Weblog
The Last Watchdog
The Last Watchdog
月光博客
月光博客
Security Archives - TechRepublic
Security Archives - TechRepublic
L
LINUX DO - 热门话题

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

【琐记】烟火与尘埃 【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,并指明哪一篇博客,我看到一定及时回复!