【TVM】——ubuntu18.04源码编译TVM

server/2024/10/18 14:00:44/

tvm, ubuntu18.04

1.创建conda环境

# make sure to start with a fresh environment
conda env remove -n tvm-build-venv
# create the conda environment with build dependency
conda create -n tvm-build-venv -c conda-forge \"llvmdev>=15" \"cmake>=3.24" \git \python=3.11
# enter the build environment
conda activate tvm-build-venv

注意

  • llvmdev要从conda-forge安装,我从清华源安装会报错“tvm LLVM ERROR: Only small, tiny and large code models are allowed on AArch64”
  • llvmdev版本有可能报错:OSError: /root/miniconda3/lib/libstdc++.so.6: version `GLIBCXX_3.4.30’ not found (required by /root/miniconda3/envs/snpe/lib/libLLVM-16.so),应该是预编译的libllvm和系统的c++不匹配。conda install llvmdev==14.0.0换个版本试一下

2.获得源码

git clone --recursive https://github.com/apache/tvm tvm

3.编译

打开llvm后端,
set(USE_LLVM ON)

cd tvm
rm -rf build && mkdir build && cd build
# Specify the build configuration via CMake options
# 
cp ../cmake/config.cmake .
cmake .. && cmake --build . --parallel $(nproc)

编译之后会有libtvm.solibtvm_runtime.sobuild/文件夹下

tvm python接口添加到python路径,打开~/.bashrc

export TVM_HOME=/path-to-tvm
export PYTHONPATH=$TVM_HOME/python:$PYTHONPATH

4.安装测试

>>> python -c "import tvm; print(tvm.__file__)"
/some-path/lib/python3.11/site-packages/tvm/__init__.py

5.编译/runtime测试

创建以下python文件并执行

import tvm
from tvm import relax
from tvm.relax.frontend import nnclass MLPModel(nn.Module):def __init__(self):super(MLPModel, self).__init__()self.fc1 = nn.Linear(784, 256)self.relu1 = nn.ReLU()self.fc2 = nn.Linear(256, 10)def forward(self, x):x = self.fc1(x)x = self.relu1(x)x = self.fc2(x)return xmod, param_spec = MLPModel().export_tvm(spec={"forward": {"x": nn.spec.Tensor((1, 784), "float32")}}
)
mod.show()import numpy as nptarget = tvm.target.Target("llvm")
ex = relax.build(mod, target)
device = tvm.cpu()
vm = relax.VirtualMachine(ex, device)
data = np.random.rand(1, 784).astype("float32")
tvm_data = tvm.nd.array(data, device=device)
params = [np.random.rand(*param.shape).astype("float32") for _, param in param_spec]
params = [tvm.nd.array(param, device=device) for param in params]
print(vm["forward"](tvm_data, *params).numpy())

结果:

# from tvm.script import ir as I
# from tvm.script import relax as R@I.ir_module
class Module:@R.functiondef forward(x: R.Tensor((1, 784), dtype="float32"), fc1_weight: R.Tensor((256, 784), dtype="float32"), fc1_bias: R.Tensor((256,), dtype="float32"), fc2_weight: R.Tensor((10, 256), dtype="float32"), fc2_bias: R.Tensor((10,), dtype="float32")) -> R.Tensor((1, 10), dtype="float32"):R.func_attr({"num_input": 1})with R.dataflow():permute_dims: R.Tensor((784, 256), dtype="float32") = R.permute_dims(fc1_weight, axes=None)matmul: R.Tensor((1, 256), dtype="float32") = R.matmul(x, permute_dims, out_dtype="void")add: R.Tensor((1, 256), dtype="float32") = R.add(matmul, fc1_bias)relu: R.Tensor((1, 256), dtype="float32") = R.nn.relu(add)permute_dims1: R.Tensor((256, 10), dtype="float32") = R.permute_dims(fc2_weight, axes=None)matmul1: R.Tensor((1, 10), dtype="float32") = R.matmul(relu, permute_dims1, out_dtype="void")add1: R.Tensor((1, 10), dtype="float32") = R.add(matmul1, fc2_bias)gv: R.Tensor((1, 10), dtype="float32") = add1R.output(gv)return gv[[27072.736 24800.156 25007.713 25144.564 23554.26  25691.121 25755.08223728.863 26370.531 25379.229]]

参考

  1. tvm中文文档
  2. tvm官方文档

http://www.ppmy.cn/server/131729.html

相关文章

鸿蒙NEXT开发-知乎评论小案例(基于最新api12稳定版)

注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 专栏地址: https://blog.csdn.net/qq_56760790/…

【零散技术】MAC 安装多版本node

时间是我们最宝贵的财富,珍惜手上的每个时分 不同前端项目运行的node版本不一致,会导致无法运行,就像Odoo也需要依据版本使用对应的python环境。python 可以用 conda随时切换版本,那么Node可以吗?答案是肯定的。 1、安装 n&#x…

llvm开发心得

llvm使用心得 常用llvm命令 # 将.c编译为bitcode clang -emit-llvm -c test.c# 将bitcode反汇编为ir llvm-dis test.bc# 将ir转成bitcode llvm-as test.ll# 用lli执行bitcode或ir lli test.bc lli test.ll# llc将bitcode或ir转成目标汇编 llc test.bc llc test.ll# as将汇编转…

鸿蒙--下拉刷新+上拉加载

概述 Refresh组件支持下拉刷新,包裹list组件,下拉事件中更新列表 这里我们需要提前了解一下 @Builder装饰器 的基本用法 ArkUI提供了一种轻量的UI元素复用机制@Builder,该自定义组件内部UI结构固定,仅与使用方进行数据传递,开发者可以将重复使用的UI元素抽象成一个方法…

Android SELinux——安全策略(三)

SELinux 通过严格的访问控制机制增强了 Linux 系统的安全性。它通过标签和安全策略来控制进程和文件的访问权限,从而保护系统免受未经授权的访问和攻击。 一、策略介绍 1、主要组件 安全标签(Security Labels):每个文件、目录、进程等都有一个安全标签。标签包含类型(Ty…

使用激光跟踪仪提升码垛机器人精度

标题1.背景 码垛机器人是一种用于工业自动化的机器人,专门设计用来将物品按照一定的顺序和结构堆叠起来,通常用于仓库、物流中心和生产线上,它们可以自动执行重复的、高强度的搬运和堆垛任务。 图1 码垛机器人 传统调整码垛机器人的方法&a…

JavaEE: 深入解析HTTP协议的奥秘(2)

文章目录 HTTP认识 URLURL encode 介绍 认识 "方法"(method)GETPOST其他方法 HTTP JavaEE: 深入解析HTTP协议的奥秘(1) 书接上文~ 认识 URL 平时我们俗称的"网址"其实就是说的 URL .(唯一资源定位符) URL 不是 HTTP 专属的,很多协议都会用到. 其实除了 …

基于springboot+小程序的智慧物流管理系统(物流1)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于springboot小程序的智慧物流管理系统实现了管理员、司机及用户。 1、管理员实现了司机管理、用户管理、车辆管理、商品管理、物流信息管理、基础数据管理、论坛管理、公告信息管理等。…