【TVM 教程】使用 TVM 部署框架预量化模型

TVM部署预定义模型 TVM部署预定义模型 本文通过深度学习框架量化的模型加载到TVM中。预量化的模型导入是在TVM中提供的量化支持之一。 本文演示如何加载和运行由PyTorch,MXNet和TFLite量化的模型。加载后,可以在任何TVM支持的硬件上运行已编译的量化模型。 首先,必要输入 from PIL import Image import numpy as np import torch from torchvision.models.quantization import mobilenet as qmobilenet 阅读详情

本文介绍如何将深度学习框架量化的模型加载到 TVM。预量化模型的导入是 TVM 中支持的量化之一。有关 TVM 中量化的更多信息,参阅 此处。

这里演示了如何加载和运行由 PyTorch、MXNet 和 TFLite 量化的模型。加载后,可以在任何 TVM 支持的硬件上运行编译后的量化模型。

首先,导入必要的包:

from PIL import Image
import numpy as np
import torch
from torchvision.models.quantization import mobilenet as qmobilenet

import tvm
from tvm import relay
from tvm.contrib.download import download_testdata

定义运行 demo 的辅助函数:

def get_transform():
    import torchvision.transforms as transforms

    normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
    return transforms.Compose(
        [
            transforms.Resize(256),
            transforms.CenterCrop(224),
            transforms.ToTensor(),
            normalize,
        ]
    )

def get_real_image(im_height, im_width):
    img_url = "https://github.com/dmlc/mxnet.js/blob/main/data/cat.png?raw=true"
    img_path = download_testdata(img_url, "cat.png", module="data")
    return Image.open(img_path).resize((im_height, im_width))

def get_imagenet_input():
    im = get_real_image(224, 224)
    preprocess = get_transform()
    pt_tensor = preprocess(im)
    return np.expand_dims(pt_tensor.numpy(), 0)

def get_synset():
    synset_url = "".join(
        [
            "https://gist.githubusercontent.com/zhreshold/",
            "4d0b62f3d01426887599d4f7ede23ee5/raw/",
            "596b27d23537e5a1b5751d2b0481ef172f58b539/",
            "imagenet1000_clsid_to_human.txt",
        ]
    )
    synset_name = "imagenet1000_clsid_to_human.txt"
    synset_path = download_testdata(synset_url, synset_name, module="data")
    with open(synset_path) as f:
        return eval(f.read())

def run_tvm_model(mod, params, input_name, inp, target="llvm"):
    with tvm.transform.PassContext(opt_level=3):
        lib = relay.build(mod, target=target, params=params)

    runtime = tvm.contrib.graph_executor.GraphModule(lib["default"](tvm.device(target, 0)))

    runtime.set_input(input_name, inp)
    runtime.run()
    return runtime.get_output(0).numpy(), runtime

从标签到类名的映射,验证模型的输出是否合理:

synset = get_synset()

用猫的图像进行演示:

inp = get_imagenet_input()

部署量化的 PyTorch 模型​

首先演示如何用 PyTorch 前端加载由 PyTorch 量化的深度学习模型。

参考 PyTorch 静态量化教程,了解量化的工作流程。

用下面的函数来量化 PyTorch 模型。此函数采用浮点模型,并将其转换为 uint8。这个模型是按通道量化的。

def quantize_model(model, inp):
    model.fuse_model()
    model.qconfig = torch.quantization.get_default_qconfig("fbgemm")
    torch.quantization.prepare(model, inplace=True)
    # Dummy calibration
    model(inp)
    torch.quantization.convert(model, inplace=True)

从 torchvision 加载预量化、预训练的 Mobilenet v2 模型​

之所以选择 mobilenet v2,是因为该模型接受了量化感知训练,而其他模型则需要完整的训练后校准。

qmodel = qmobilenet.mobilenet_v2(pretrained=True).eval()

输出结果:

Downloading: "https://download.pytorch.org/models/mobilenet_v2-b0353104.pth" to /workspace/.cache/torch/hub/checkpoints/mobilenet_v2-b0353104.pth

  0%|          | 0.00/13.6M [00:00<?, ?B/s]
 44%|####4     | 6.03M/13.6M [00:00<00:00, 63.2MB/s]
 89%|########8 | 12.1M/13.6M [00:00<00:00, 61.4MB/s]
100%|##########| 13.6M/13.6M [00:00<00:00, 66.0MB/s]

量化、跟踪和运行 PyTorch Mobilenet v2 模型​

量化和 jit 的详细信息可参考 PyTorch 网站上的教程。

pt_inp = torch.from_numpy(inp)
quantize_model(qmodel, pt_inp)
script_module = torch.jit.trace(qmodel, pt_inp).eval()

with torch.no_grad():
    pt_result = script_module(pt_inp).numpy()

输出结果:

/usr/local/lib/python3.7/dist-packages/torch/ao/quantization/observer.py:179: UserWarning: Please use quant_min and quant_max to specify the range for observers.                     reduce_range will be deprecated in a future release of PyTorch.
  reduce_range will be deprecated in a future release of PyTorch."
/usr/local/lib/python3.7/dist-packages/torch/ao/quantization/observer.py:1126: UserWarning: must run observer before calling calculate_qparams.                                    Returning default scale and zero point
  Returning default scale and zero point "

使用 PyTorch 前端将量化的 Mobilenet v2 转换为 Relay-QNN​

PyTorch 前端支持将量化的 PyTorch 模型,转换为具有量化感知算子的等效 Relay 模块。将此表示称为 Relay QNN dialect。

若要查看量化模型是如何表示的,可以从前端打印输出。

可以看到特定于量化的算子,例如 qnn.quantize、qnn.dequantize、qnn.requantize 和 qnn.conv2d 等。

input_name = "input"  # 对于 PyTorch 前端,输入名称可以是任意的。
input_shapes = [(input_name, (1, 3, 224, 224))]
mod, params = relay.frontend.from_pytorch(script_module, input_shapes)
# print(mod) # 打印查看 QNN IR 转储

编译并运行 Relay 模块​

获得量化的 Relay 模块后,剩下的工作流程与运行浮点模型相同。详细信息请参阅其他教程。

在底层,量化特定的算子在编译之前,会被降级为一系列标准 Relay 算子。

target = "llvm"
tvm_result, rt_mod = run_tvm_model(mod, params, input_name, inp, target=target)

输出结果:

/workspace/python/tvm/driver/build_module.py:268: UserWarning: target_host parameter is going to be deprecated. Please pass in tvm.target.Target(target, host=target_host) instead.
  "target_host parameter is going to be deprecated. "

比较输出标签​

可看到打印出相同的标签。

pt_top3_labels = np.argsort(pt_result[0])[::-1][:3]
tvm_top3_labels = np.argsort(tvm_result[0])[::-1][:3]

print("PyTorch top3 labels:", [synset[label] for label in pt_top3_labels])
print("TVM top3 labels:", [synset[label] for label in tvm_top3_labels])

输出结果:

PyTorch top3 labels: ['tiger cat', 'Egyptian cat', 'tabby, tabby cat']
TVM top3 labels: ['tiger cat', 'Egyptian cat', 'tabby, tabby cat']

但由于数字的差异,通常原始浮点输出不应该是相同的。下面打印 mobilenet v2 的 1000 个输出中,有多少个浮点输出值是相同的。

print("%d in 1000 raw floating outputs identical." % np.sum(tvm_result[0] == pt_result[0]))

输出结果:

154 in 1000 raw floating outputs identical.

测试性能​

以下举例说明如何测试 TVM 编译模型的性能。

n_repeat = 100  # 为使测试更准确,应选取更大的数值
dev = tvm.cpu(0)
print(rt_mod.benchmark(dev, number=1, repeat=n_repeat))

输出结果:

Execution time summary:
 mean (ms)   median (ms)    max (ms)     min (ms)     std (ms)
  90.3752      90.2667      94.6845      90.0629       0.6087

备注

推荐这种方法的原因如下:

  • 测试是在 C++ 中完成的,因此没有 Python 开销大
  • 包括几个准备工作
  • 可用相同的方法在远程设备(Android 等)上进行分析。

备注

如果硬件对 INT8 整数的指令没有特殊支持,量化模型与 FP32 模型速度相近。如果没有 INT8 整数的指令,TVM 会以 16 位进行量化卷积,即使模型本身是 8 位。

对于 x86,在具有 AVX512 指令集的 CPU 上可实现最佳性能。这种情况 TVM 对给定 target 使用最快的可用 8 位指令,包括对 VNNI 8 位点积指令(CascadeLake 或更新版本)的支持。

此外,以下一般技巧对 CPU 性能的提升同样适用:

  • 将环境变量 TVM_NUM_THREADS 设置为物理 core 的数量
  • 为硬件选择最佳 target,例如 “llvm -mcpu=skylake-avx512” 或 “llvm -mcpu=cascadelake”(未来会有更多支持 AVX512 的 CPU)

部署量化的 MXNet 模型​

待更新

部署量化的 TFLite 模型​

待更新

脚本总运行时长: (1 分 7.374 秒)

下载 Python 源代码:deploy_prequantized.py

下载 Jupyter Notebook:deploy_prequantized.ipynb

探索 TVM 进行量化方法 探索 TVM 进行量化方法 Relay框架 如上图所示,有两种不同的并行工作正在进行中 • 自动整数量化 - 采用 FP32 框架图,在 Relay 中自动转换为 Int8。 • 接受预量化整数模型 - 这种方法接受预量化模型,引入称为 QNN 的Relay方言,生成 Int8 Relay图。 关于 Relay Automatic FP16 Downcasting 的讨论很少。还没有任何 RFC。 正在对此进行探索/原型设计,计划提出 RFC。 Relay优化 • 与目标无关的Relay pass- TV 阅读详情

相关推荐

imagenet1000_clsid_to_human.txt

pytorch vgg19预训练模型的索引和类别对应表

TVM框架详解

在上面TVM的架构图中,主要包含三个部分内容:Unified IR/*!*//*!/*!/*!*//*!/*!/*!/*!/*!/*!*//*!在该部分中,主要包含三个方面的内容。

探索未知,成就非凡 3746

Windows版MySQL8.4.2LTS解压直用(下载免安装-绿色-项目打包直接使用-含卸载)

安装前运行微软常用运行库全集(也可能称为依赖)关于MySQL8中相关参数配置,可通过。选择8.5.2LTS长期服务版。选中密码,右键会直接复制。

xzzteach的博客 1440

面向ASIC设备的编译器框架:TVM or MLIR?

目前TVM和MLIR都没有完全支持定制DSA的设计、上层编译的成熟路线,也就是最终选型的结果对实际工程开发的影响不会很大,都需要开发者/团队深度定制大量代码。...

csdndevpress0035的博客 1189

如何制作Mike21溢油模型围油栏文件

这段时间群友在做海洋环评的做了一个MIKE21的溢油模型,溢油模型其实也是ECOLAB模块的应用,而在海上发生溢油事件的时候,为防止溢油对海洋生态的破坏,经常使用的一种手段就是使用围油栏技术将溢油控制在一定范围并进行处理。今天小编就给大家说说在MIKE21里怎么实现围油栏文件的制作

zhuzhujiayoua的博客 1330

SD--根据订单创建出库单(相关的函数列表的介绍系列篇(2))

创建订单样例代码参见:http://blog.youkuaiyun.com/CompassButton/archive/2007/05/09/1601712.aspx 可以根据一个订单或者部分订单项来创建出库单,代码如下:* Populating the item data lx_sales_item-ref_doc = l_vbeln. lx_sales_item-ref_item = c_000010

SAP BLOG--Jack Wu 6226

TVM[2] —— TVM简介和发展

深度学习编译器学习记录~

ict_rtf的博客 4012

为JETSON TX2开发板部署YoloV5

参考资料一:nvidia为JETSON Tx2编译的pytorch 参考资料二:Jetson软件包下载 参考资料三:Tx2安装工具的使用 参考资料四: Jetson烧录工具 参考资料五: B站下载的行人视频 一、升级TX2系统版本到最新版(JetPack4.6) 我拿到的板子的版本太低了,在工作的过程中会有很多问题,因此要先升级到最新版 下载参考资料四中的烧录工具,在Ubuntu18.04中安装,只能,必须,一定是Ubuntu18.04 安装完成后使用非root用户启动SDK Manger,登录Nvi.

贱贱的剑 5887

【TVM 学习资料】使用 TVMC 编译和优化模型

TVM 的基石——TVMC

HyperAI超神经 1583

2024年全国青少年信息素养大赛初赛真题(算法创意实践挑战赛C++小学组:带解析)

2024全国青少年信息素养大赛C++算法创意实践挑战赛初赛真题及解析

王老师青少年编程 2810

用AI科研绘图全新升级!借助谷歌新发布模型Nano Banana pro实测一键绘制机制图与技术路线图,直接告别文字乱码与低画质

之前有同仁反馈,用Nano Banana画科研插图的时候,要么文字部分容易乱码,要么抓不住关键内容,画出来的效果反复修改后,还是达不到理想的效果。终于在Gemini 3发布没几天,万众期待的大香蕉模型也成功升级到了Pro版本,官方名称叫“Gemini 3 Pro Image”,实际上也就是我们说的Nano Banana 2。这次的Nano Banana Pro模型,不仅可以直出4K高清图,还能自定义比例,推理能力和中文文字的稳定性也得到了提升。

智能AI让学术科研更容易 1889

TVM 从入门到精通 | 安装 TVM (Part 1)

手把手教学之从源码安装 TVM

HyperAI超神经 3203

北斗导航 | 卫星导航接收机原理(基础)

卡尔曼滤波,最小二乘,伪距,芯片,模组,接收机,捕获,跟踪,RTK,RTD,PPP,SPP,多普勒,DOP,灵敏度,热启动,冷启动,PNT,北斗发展,MEO,IGSO,GEO,ICD,导航电文,载波,载噪比

尘世冰封的专栏 2342

【TVM 教程】使用 TVM 部署框架预量化模型 - 第 3 部分(TFLite)

更多 TVM 中文文档可访问 →此教程介绍如何量化 TFLite 计算图,并通过 TVM 编译和执行。有关使用 TFLite 量化模型的更多详细信息,参阅。TFLite 模型下载。开始前,先安装 TensorFlow 和 TFLite 包。执行命令检查 TFLite 包是否安装成功。

HyperAI超神经 1580

Python 爬虫实战:爬取评论数据做情感分析

摘要:本文介绍基于Python的京东商品评论爬取与情感分析全流程实现。通过Requests库抓取评论数据接口,结合JSON解析获取结构化评论信息。利用SnowNLP进行中文文本情感分析,量化用户评价的情感倾向(正面/负面/中性)。结果显示正面评论占比66.3%,负面评论13.3%,关键词分析发现"卡顿""发热"是主要负面因素。该方法可应用于产品优化、品牌管理等场景,为决策提供数据支持。

2503_91057718的博客 1709

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

[AI算法][模型部署]:TVM模型部署实战

[模型部署]:TVM模型部署实战

Bin_Dut的博客 4057

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

TVM-CN项目实战:使用TVM部署预量化模型的技术解析

在深度学习模型部署领域,模型量化是提升推理效率的重要手段。本文将深入探讨如何使用TVM框架部署预量化模型,帮助开发者理解量化模型在TVM中的处理流程和优化技巧。 ## 量化技术基础 模型量化是指将浮点模型转换为低精度(如INT8)表示的过程,主要优势包括: 1. 减少模型大小 2. 提高推理速度 3. 降低内存带宽需求 4. 降低功耗 TVM支持多种量化方式,包括训练后量化和量化感知训练。

gitblog_00852的博客 504

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

利用TVM神经网络编译器完成模型C++端的部署

在上一篇文章中<一步一步解读神经网络编译器TVM(一)——一个简单的例子>,我们简单介绍了什么是TVM以及如何利用Relay IR去编译网络权重然后并运行起来。上述文章中的例子很简单,但是实际中我们更需要的是利用TVM去部署我们的应用么,最简单直接的就是在嵌入式系统中运行起我们的神经网络模型。例如树莓派。这才是最重要的是不是?所以嘛,在深入TVM之前还是要走一遍基本的实践流程的,也唯有实践流程才能让我们更好地理解TVM到底可以做什么。

生活需要深度 1519

TVM 项目实战:部署预量化 TFLite 模型全流程指南

在边缘计算和移动设备上部署深度学习模型时,模型量化是提升推理效率的关键技术。本文将详细介绍如何使用 TVM 框架部署预量化的 TFLite 模型,涵盖从模型加载到性能优化的完整流程。 ## 环境准备 首先需要安装必要的 Python 依赖: ```bash pip install tensorflow==2.1.0 pip install tflite==2.1.0 ``` 安装完成后,可

gitblog_00904的博客 654

打破硬件壁垒:TVM 助力 AI技术跨平台部署

TVM(Tensor Virtual Machine, 张量虚拟机)是一种开源的模型编译框架,旨在将机器学习模型自动编译成可供下层硬件执行的机器语言,从而利用多种类型的算力。其工作原理是,先将深度学习模型进行优化推理、内存管理与线程调度,再借用LLVM框架将模型部署在CPU、GPU、FPGA、ARM等硬件设备上。本书全面解析TVM的主要功能,帮助读者理解TVM工作原理,以及使用 TVM对深度学习与机器学习进行优化与部署。

程序边界 4888

TVM系列 - 量化

TVM系列 - 量化TVM量化原理TVM量化现状TVM量化原理介绍TVM量化代码解析 TVM量化原理 关于量化的方式其实已经有足够的文章去了解目前最主流的两种:离线量化及训练时量化(大家应该能理解,其实就是伪量化),而tvm的作者之一也对这些文章有一个初步的汇总:tvm作者关于量化方式的讨论,这部分不做过多讨论,直接进入tvm量化的部分 TVM量化现状 事实上,可能tvm团队将主要精力放到了autotvm,以框架整体的优化上(毕竟这部分才是tvm的特点呀),tvm的单纯量化效果并不理想,不仅精度有所下降,正

Artyze的博客 4759

TVM模型量化全攻略:从原理到落地最佳实践

在深度学习部署中,你是否遇到过这些问题:模型太大导致内存不足?推理速度太慢无法满足实时需求?量化(Quantization)技术正是解决这些痛点的关键方案。通过将模型权重和激活值从32位浮点数转换为8位整数,量化可以: - 减少75%的模型存储空间 - 降低50%以上的内存占用 - 提升2-4倍的推理速度 - 降低功耗,延长边缘设备续航 TVM作为开源深度学习编译器栈,提供了完整的量化解决方案...

gitblog_00401的博客 983

tvm 学习笔记(四):tvm量化pytorch的onnx模型

1、模型来源: github链接:https://github.com/qfgaohao/pytorch-ssd 2、保存成onnx模型 运行convert_to_caffe2_models.py脚本 >> python convert_to_caffe2_models.py 3、使用onnx-simplifier工具: 安装使用: >> pip3 ins...

sinat_31425585的博客 5963

【TVM 教程】在 CUDA 上部署量化模型

更多 TVM 中文文档可访问 →本文介绍如何用 TVM 自动量化(TVM 的一种量化方式)。有关 TVM 中量化的更多详细信息,参阅。本教程将在 ImageNet 上导入一个 GluonCV 预训练模型到 Relay,量化 Relay 模型,然后执行推理。

HyperAI超神经 667
上一篇: 一键运行 ComfyUI SD3!大规模医学 VQA 评测数据集上线,涉及超 20 个人体器官和部位
下一篇: OpenAI官宣新公司,谷歌前高管任CEO,打造AI健身教练;上海交大开源3D医学大模型,构建超大规模3D医学图像分割数据集...
HyperAI超神经
博客等级 码龄7年 8872粉丝 1753原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值