Ubuntu20.04部署TVM流程及编译优化模型示例

news2025/2/22 7:16:30

前言:记录自己安装TVM的流程,以及一个简单的利用TVM编译模型并执行的示例。

1,官网下载TVM源码

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

git submodule init
git submodule update

顺便完成准备工作,比如升级cmake版本需要3.18及以上版本。还有如下库:

sudo apt-get update
sudo apt-get install -y python3 python3-dev python3-setuptools gcc libtinfo-dev zlib1g-dev build-essential cmake libedit-dev libxml2-dev

2,安装clang,llvm,ninja

llvm安装依赖clang和ninja,所以直接安装llvm即可顺便完成全部的安装。

llvm ,clang安装参考:Linux系统无痛编译安装LLVM简明指南_linux安装llvm11-CSDN博客

步骤如下:

git clone git@github.com:llvm/llvm-project.git

cd llvm-project
mkdir build

cd build

sudo cmake ../llvm -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_BUILD_TYPE=Debug
sudo make -j8
sudo make install

检查版本:

clang --version
llvm-as --version

3,安装NNPACK

NNPACK是为了优化加速神经网络的框架,可以提高在CPU上的计算效率

git clone --recursive https://github.com/Maratyszcza/NNPACK.git
cd NNPACK
# Add PIC option in CFLAG and CXXFLAG to build NNPACK shared library
sed -i "s|gnu99|gnu99 -fPIC|g" CMakeLists.txt
sed -i "s|gnu++11|gnu++11 -fPIC|g" CMakeLists.txt
mkdir build
cd build
# Generate ninja build rule and add shared library in configuration
cmake -G Ninja -D BUILD_SHARED_LIBS=ON ..
ninja
sudo ninja install

# Add NNPACK lib folder in your ldconfig
sudo sh -c "echo '/usr/local/lib'>> /etc/ld.so.conf.d/nnpack.conf"
sudo ldconfig

4,编译TVM

如下步骤,在tvm建立build文件夹,把config.cmake复制到build中

cd tvm
mkdir build

cp cmake/config.cmake build

build里的config.cmake是编译配置文件,可以按需打开关闭一些开关。下面是我修改的一些配置(TENSORRT和CUDNN我以为之前已经配置好了,结果编译报了这两个的错误,如果只是想跑流程,可以不打开这两个的开关,这样就能正常编译结束了)

set(USE_RELAY_DEBUG ON)
set(USE_CUDA ON)
set(USE_NNPACK ON)
set(USE_LLVM ON)
set(USE_TENSORRT_CODEGEN ON)
set(USE_TENSORRT_RUNTIME ON)
set(USE_CUDNN ON)

编译代码:

cd build
cmake ..

make -j12

5,配置python环境

从build文件夹出来进入到tvm/python文件夹下,执行如下命令,即可配置python中的tvm库了。

cd ../python
python setup.py install

python中使用tvm测试,导入tvm不出错即配置tvm安装成功

import tvm

print(tvm.__version__)

6,一个简单示例

该测试来自TVM官方文档的示例,包括编译一个测试执行一个分类网络和编译器自动调优测试。仅先直观的看到TVM如何作为一个工具对模型编译并部署的流程。

1) 下载onnx模型

wget https://github.com/onnx/models/raw/b9a54e89508f101a1611cd64f4ef56b9cb62c7cf/vision/classification/resnet/model/resnet50-v2-7.onnx

2) 编译onnx模型

python -m tvm.driver.tvmc compile --target "llvm" --input-shapes "data:[1,3,224,224]" --output resnet50-v2-7-tvm.tar resnet50-v2-7.onnx

如果报这样的警告:

就在git上下载一份tophub,把整个文件夹tophub复制到 ~/.tvm/路径下

git clone git@github.com:tlc-pack/tophub.git
sudo cp -r tophub ~/.tvm/

解压生成的tvm编译模型,得到3个文件:

  • mod.so  作为一个C++库的编译模型, 能被 TVM runtime加载

  • mod.json TVM Relay计算图的文本表示

  • mod.params onnx模型的预训练权重参数

mkdir model
tar -xvf resnet50-v2-7-tvm.tar -C model
ls model

3) 输入数据前处理

python preprocess.py

图像处理代码文件:preprocess.py

#!python ./preprocess.py
from tvm.contrib.download import download_testdata
from PIL import Image
import numpy as np

img_url = "https://s3.amazonaws.com/model-server/inputs/kitten.jpg"
img_path = download_testdata(img_url, "imagenet_cat.png", module="data")

# Resize it to 224x224
resized_image = Image.open(img_path).resize((224, 224))
img_data = np.asarray(resized_image).astype("float32")

# ONNX expects NCHW input, so convert the array
img_data = np.transpose(img_data, (2, 0, 1))

# Normalize according to ImageNet
imagenet_mean = np.array([0.485, 0.456, 0.406])
imagenet_stddev = np.array([0.229, 0.224, 0.225])
norm_img_data = np.zeros(img_data.shape).astype("float32")
for i in range(img_data.shape[0]):
      norm_img_data[i, :, :] = (img_data[i, :, :] / 255 - imagenet_mean[i]) / imagenet_stddev[i]

# Add batch dimension
img_data = np.expand_dims(norm_img_data, axis=0)

# Save to .npz (outputs imagenet_cat.npz)
np.savez("imagenet_cat", data=img_data)

4) 运行编译模型

python -m tvm.driver.tvmc run --inputs imagenet_cat.npz --output predictions.npz resnet50-v2-7-tvm.tar

5) 输出后处理

python postprocess.py

执行之后得到分类结果的输出:

class='n02123045 tabby, tabby cat' with probability=0.621104
class='n02123159 tiger cat' with probability=0.356378
class='n02124075 Egyptian cat' with probability=0.019712
class='n02129604 tiger, Panthera tigris' with probability=0.001215
class='n04040759 radiator' with probability=0.000262

后处理代码:postprocess.py

#!python ./postprocess.py
import os.path
import numpy as np

from scipy.special import softmax

from tvm.contrib.download import download_testdata

# Download a list of labels
labels_url = "https://s3.amazonaws.com/onnx-model-zoo/synset.txt"
labels_path = download_testdata(labels_url, "synset.txt", module="data")

with open(labels_path, "r") as f:
    labels = [l.rstrip() for l in f]

output_file = "predictions.npz"

# Open the output and read the output tensor
if os.path.exists(output_file):
    with np.load(output_file) as data:
        scores = softmax(data["output_0"])
        scores = np.squeeze(scores)
        ranks = np.argsort(scores)[::-1]

        for rank in ranks[0:5]:
            print("class='%s' with probability=%f" % (labels[rank], scores[rank]))

6) 编译器自动调优

调优的算法使用的是xgboost,所以需要python安装一下这个库。

pip install xgboost

python -m tvm.driver.tvmc tune --target "llvm" --output resnet50-v2-7-autotuner_records.json resnet50-v2-7.onnx

7) 重新编译并执行调优后的模型

python -m tvm.driver.tvmc compile --target "llvm" --tuning-records resnet50-v2-7-autotuner_records.json  --output resnet50-v2-7-tvm_autotuned.tar resnet50-v2-7.onnx

python -m tvm.driver.tvmc run --inputs imagenet_cat.npz --output predictions.npz resnet50-v2-7-tvm_autotuned.tar

python postprocess.py

预测结果:
 

class='n02123045 tabby, tabby cat' with probability=0.610552
class='n02123159 tiger cat' with probability=0.367180
class='n02124075 Egyptian cat' with probability=0.019365
class='n02129604 tiger, Panthera tigris' with probability=0.001273
class='n04040759 radiator' with probability=0.000261

8) 比较编译前后执行模型的速度

python -m tvm.driver.tvmc run --inputs imagenet_cat.npz --output predictions.npz  --print-time --repeat 100 resnet50-v2-7-tvm_autotuned.tar

python -m tvm.driver.tvmc run --inputs imagenet_cat.npz --output predictions.npz  --print-time --repeat 100 resnet50-v2-7-tvm.tar

执行时间如下,上面是自动调优过的的,可以明显看出推理时间上的优化效果。 

Execution time summary:
 mean (ms)   median (ms)    max (ms)     min (ms)     std (ms)  
  84.6208      74.9435      143.9276     72.8249      19.0734 

 mean (ms)   median (ms)    max (ms)     min (ms)     std (ms)  
  131.1953     130.7819     140.6614     106.0725      3.5606

比较了一下两个编译后模型的Relay计算图json文件的区别,就看到了算子数据layout的区别,更多细节还是要看源码吧

参考:TVM Ubuntu20安装_ubuntu20.04配置tvm_shelgi的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1266855.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库的重要你了解多少?如何保障数据库的安全?

随着信息技术的快速发展,数据库已经成为企业、组织以及个人日常生活中不可或缺的一部分。然而,随着数据库的广泛应用,其安全性问题也日益凸显。数据库的安全性主要包括数据的完整性、保密性和可用性。本文将探讨数据库安全性的重要性、以及如…

户外低功耗太阳能板供电无线RTU数据采集支持定时采集各类485接口传感器数据推送数据到第三方平台远程监测系统搭建方案

户外低功耗太阳能板供电无线RTU数据采集,下行支持定时采集各种485接口传感器,对外输出5V/12V电压,上行支持各物联网云平台接入。

销售手里的找客户神器:天眼销

那些曾经战斗在B端(企业)销售战线的朋友们,都应该深知其中的苦涩。尤其是那如同大海捞针般的客户搜寻,批量客户的挖掘,更不用说批量精准客户的寻找了。在互联网的海洋里探索线索,既耗时又耗力,还…

去水印软件有哪些?亲测四款好用去水印神器

去水印软件有哪些?随着图片的普及和应用范围不断扩大,我们有时需要对图片进行编辑或修改。然而,有些图片可能会带有水印,这会降低图片的美观度和应用效果。作为一名自媒体打工人,经过多番对比,整理了四款好…

硬核实力,闪耀羊城!第23届广州车展完美收官,大运乘用车尽显品牌魅力

11月26日,第23届广州国际车展在广州圆满闭幕。作为各大车展的老朋友,本届广交会大运乘用车携旗下潮玩纯电越野小钢炮悦虎及大7座智能豪华纯电MPV远志M1两大明星车型闪耀全场,再次揽收空前关注。 当下以85、90、00后为主的年轻群体看中新能源汽…

基于SpringBoot+微信小程序汽车服务系统的设计与实现

早晨四点起来,开发个基于SpringBoot微信小程序汽车服务系统。 困死我了。 送完孩子,然后去上班。 昨天有个读者朋友问小孟:程序员之间的差距为何如此之大。 有时候甚至在同一所大学,同一个专业,有的学生大四毕业可…

Linux中的Rust支持步入成熟,得到业界巨头的大力支持

导读Rust在Linux中的支持正在逐步走向成熟,并且得到了思科、三星和Canonical等业界巨头的积极支持。尽管Rust不可能完全取代C语言在Linux内核中的地位,但其必将成为Linux开发的重要语言。 Rust语言的安全性和性能优势为其在Linux开发中的应用打开了大门…

Jupyter Markdown 插入图片

首先截图 注意 这一步是关键的!! 它需要使用电脑自带的截图,用qq啊vx啊美图秀秀那些都不行哦。 截图之后复制: 然后快捷键粘贴到jupyter里面,它会生成一段代码(没有代码就是说截图形式不对)&a…

如何在数字营销中增强客户体验和参与度

不久前,许多人还把身临其境技术与科幻小说联系在一起,而最近,这种技术又与游戏联系在了一起。如今,许多组织都认识到了采用增强现实和虚拟现实技术改善运营的优势。增强现实(AR)和虚拟现实(VR&a…

MySQL系列 - 数据类型

MySQL是一种常用的关系型数据库管理系统,它支持多种数据类型,包括整数、浮点数、字符串、日期和时间等。在本文中,我们将介绍MySQL中常用的数据类型及其用法。 MySQL数据类型介绍: 1、整数类型: MySQL提供了多种整数…

【面试心经】——上海广升智能科技有限公司

介绍 本文记录的是2018.5月份应聘上海广升linux 开发岗位的经历。 福利待遇: BOSS 岗位薪资:15K ~25K。 每月一天带薪病假或事假。 国家规定外有额外4天年假。 每年两次旅游,上半年国外,下半年国内。 每年两次调薪机会&…

南大通用 GBase 8s数据库级别权限

对于所有有权使用指定数据库的用户都必须赋予其数据库级别的用户权限。在GBase 8s 中,数据库级别的用户权限有三种,按权限从低到高排列依次为:CONNECT、RESOURCE、DBA。 1. CONNECT 这是级别最低的一种数据库级别用户权限。拥有该权限的用户…

H3C堆叠和聚合配置

因ensp做不了堆叠,所以用了华三的模拟器HCL,下载地址:H3C网络设备模拟器官方免费下载-新华三集团-H3C 拓朴如下: 1、堆叠配置步骤如下: 1、S1和S2配置堆叠过程: [S1] irf domain 1 irf member 1 priority …

人工智能驱动的医疗辅助:陪诊系统的技术原理与应用

随着人工智能技术的不断发展,医疗领域也迎来了新的可能性。本文将深入探讨陪诊系统的技术原理及其在医疗领域中的应用。我们将重点关注人工智能的核心概念,如自然语言处理、机器学习和语音识别,以解释陪诊系统是如何在医疗环境中发挥作用的。…

2023年03月 Scratch图形化(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共10题,每题2分,共30分) 第1题 编写一段程序,从26个英文字母中,随机选出10个加入列表a。空白处应填入的代码是?( ) A: B: C: D:

基础课13——知识库

1.知识库的概念、特点与功能 智能客服中的知识库是一个以知识为基础的系统,可以明确地表达与实际问题相对应的知识,并构成相对独立的程序行为主体,有利于有效、准确地解决实际问题。它储存着机器人对所有信息的认知概念和理解,这…

数据预处理:随机裁剪放缩

随机裁剪放缩是一种数据增强技术,可以在训练神经网络时增加数据的多样性,提高模型的泛化能力。具体来说,随机裁剪放缩可以通过随机裁剪和缩放原始图片来生成多个不同的训练样本,从而增加数据集的大小和多样性。这种技术在图像分类…

Python编程基础:数据类型和运算符解析

想要学习Python编程语言?本文将为您介绍Python中常见的数据类型和运算符,为您打下坚实的编程基础。了解不同的数据类型和运算符,掌握它们之间的配合方式,让您能够更轻松地进行数据处理和计算任务。无论您是初学者还是有一定经验的…

昨日一题 1670. 设计前中后队列(中等,列表)

维护左右两个队列,控制左队列的长度比右队列长,且不超过1pushFront 往左队列的左边添加元素pushMiddle 往左队列的右边或者右队列的左边添加元素其余同理,可以参照代码 class FrontMiddleBackQueue:def __init__(self):self.llist, self.rli…

博客RESTful API 接口开发

目录 1.博客系统规划 2.基础服务搭建 3.登录接口 4.新增文章接口 5.查询文章接口 6.修改文章接口 7.删除文章接口 总结 1.博客系统规划 首先规划一下有哪些接口,从博客文章角度来看,需要如下接口: 新增文章接口,传递…