定点化和模型量化(三)

news2024/11/16 17:31:30

量化解决的是训练使用的浮点和运行使用的硬件只支持定点的矛盾。这里介绍一些实际量化中使用到的工具。

SNPE简介

The Snapdragon Neural Processing Engine (SNPE)是高通骁龙为了加速网络模型设计的框架。但它不只支持高通,SNPE还支持多种硬件平台,ARM平台、Intel平台等。支持的深度学习框架也有包括Caffe、TensorFlow和ONNX等。

SNPE可以前向运行模型,但需要先将模型转换为Deep Learning Container (DLC) file才可以加载进SNPE中。

CPU支持支持双精度浮点和8位量化的模型,GPU支持混合精度或者单精度浮点,数字信号处理器DSP就只支持支持8位整形。DLC进一步进行8bit量化才可以运行在Qualcomm Hexagon DSP上。

下图是典型的workflow:

上图的上半部分是我们熟悉的模型浮点训练,当模型效果达到预期之后,模型参数固定下来,然后转换成dlc,dlc再经过压缩,量化等操作,最后运行在SNPE中。

SNPE安装及命令

下载SNPE压缩包,版本号与高通芯片有关,主流是2.13,还有2.17,2.22等。在压缩包的docs文件夹里面有官方html文档。

source ./bin/envsetup.sh,激活snpe环境。sh ,bash ,./, source的作用都是执行脚本。然后就可以在终端中调用snpe指令了:

转换dlc

以TensorFlow 为例,模型文件可以是pb file或者checkpoint+meta,调用SNPE转换指令时给定模型路径和输入尺寸,最后一层节点名字,就可以得到dlc文件:

snpe-tensorflow-to-dlc --input_network $SNPE_ROOT/models/inception_v3/tensorflow/inception_v3_2016_08_28_frozen.pb \
                       --input_dim input "1,299,299,3" --out_node "InceptionV3/Predictions/Reshape_1" \
                       --output_path inception_v3.dlc

如果是pytorch框架得到的模型,使用snpe-pytorch-to-dlc,serialized PyTorch model into a SNPE DLC file。

更一般地,不管什么框架,都可以先将模型转换为onnx格式。ONNX(Open Neural Network Exchange)是一种开放式的文件格式,专为机器学习设计,用于存储训练好的模型。它使得不同的深度学习框架(如Pytorch,MXNet)可以采用相同格式存储模型数据。onnx转dlc使用命令snpe-onnx-to-dlc。

解析dlc:

snpe-dlc-info -i ./xxxx.dlc

dlc量化:snpe-dlc-quantize。

[ --input_dlc=<val> ]
                        Path to the dlc container containing the model for which fixed-point encoding
                        metadata should be generated. This argument is required.
  [ --input_list=<val> ]
                        Path to a file specifying the trial inputs. This file should be a plain text file,
                        containing one or more absolute file paths per line. These files will be taken to constitute
                        the trial set. Each path is expected to point to a binary file containing one trial input
                        in the 'raw' format, ready to be consumed by SNPE without any further modifications.
                        This is similar to how input is provided to snpe-net-run 
application.
[ --enable_htp ]      Pack HTP information in quantized DLC.

Snapdragon Neural Processing Engine SDK: Tools

run on linux

cd $SNPE_ROOT/models/alexnet
snpe-net-run --container dlc/bvlc_alexnet.dlc --input_list data/cropped/raw_list.txt

run on android target

推lib下面对应架构的所有so

推lib/dsp下面的so

推bin里面的snpe-net-run

AIMET简介

刚才提到的量化其实是后量化,要想实现量化感知训练QAT,需要使用AIMET(AI Model Efficiency Toolkit),AIMET也是高通提高的工具,可以实现量化和压缩。

AIMET是一个库,可以对训练好的模型进行量化和压缩,从而在保证精度损失最小的情况下缩短运行时间,减轻内存压力。

虽然是在训练过后再使用AIMET,但它不是简单地转化为dlc,而是也有一个训练的过程,这个过程尽量缩小与浮点模型的误差。

AIMET实例

PTQ

参考github上面的文档。AIMET PyTorch AutoQuant API — AI Model Efficiency Toolkit Documentation: ver tf-torch-cpu_1.31.0

即便是后量化也有很多方法组合,需要一些专业的分析。AIMET 提供了AutoQuant 这样的接口,可以自动分析模型,选择最合适的后量化方法。用户只需要指明能接受的精度损失就可以了。

核心是实例化一个AutoQuant类:

auto_quant = AutoQuant(model,                        # Load a pretrained FP32 model
                       dummy_input=dummy_input,      # dummy_input 是一个随机数组,只要维度符合输入就行。
                       data_loader=unlabeled_imagenet_data_loader, 
                       eval_callback=eval_callback)  # 统计准确率

使用默认值初始化后开始量化:
auto_quant.set_adaround_params(adaround_params)
model, optimized_accuracy, encoding_path = auto_quant.optimize(allowed_accuracy_drop=0.01)
print(f"- Quantized Accuracy (after optimization):  {optimized_accuracy}")

注意,auto_quant.optimize会返回三个值,分别是model,精度,和encoding path。encoding path以类似json的格式记录了每一层的名称,位宽,最大值最小值,offset,scale,还有是否是symmertic。

这里的offset,scale应该就对应上一篇量化中提到的step和zero point。

QAT

参考文档。AIMET PyTorch Quantization SIM API — AI Model Efficiency Toolkit Documentation: ver tf-torch-cpu_1.31.0

关键是构建QuantizationSimModel:

sim = QuantizationSimModel(model=model,
                           quant_scheme=QuantScheme.post_training_tf_enhanced,
                           dummy_input=dummy_input,
                           default_output_bw=8,  # activation quantizations的bitwidth
                           default_param_bw=8)   # parameter  quantizations的bitwidth

真正的QAT也只用一行代码完成:

ImageNetDataPipeline.finetune(sim.model, epochs=1, learning_rate=5e-7, learning_rate_schedule=[5, 10], use_cuda=use_cuda)

也可以把sim当成一个正常的模型,然后使用常规的torch的梯度更新的训练方法进行训练。

reference:

基于CentOS更新 glibc - 解决 `GLIBC_2.29‘ not found-CSDN博客

MVision/CNN/Deep_Compression/quantization at master · Ewenwan/MVision · GitHub

模型量化了解一下? - 知乎

Snapdragon Neural Processing Engine SDK: Features Overview

Tensorflow模型量化(Quantization)原理及其实现方法 - 知乎

GitHub - quic/aimet: AIMET is a library that provides advanced quantization and compression techniques for trained neural network models.AI Model Efficiency ToolkitGitHub - quic/aimet: AIMET is a library that provides advanced quantization and compression techniques for trained neural network models.

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

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

相关文章

神经网络不确定性综述(Part III)——Uncertainty estimation_Bayesian neural networks

相关链接&#xff1a; 神经网络不确定性综述(Part I)——A survey of uncertainty in deep neural networks-CSDN博客 神经网络不确定性综述(Part II)——Uncertainty estimation_Single deterministic methods-CSDN博客 神经网络不确定性综述(Part III)——Uncertainty est…

11. Django 常用的Web应用程序

11. 常用的Web应用程序 Django为开发者提供了常见的Web应用程序, 如会话控制, 缓存机制, CSRF防护, 消息框架, 分页功能, 国际化和本地化, 单元测试和自定义中间件. 内置的Web应用程序大大优化了网站性能, 并且完善了安全防护机制, 同时也提高了开发者的开发效率.11.1 会话控制…

纷享销客当选江西省数字经济学会首席信息官专业委员会副主任委员

5月11日&#xff0c;江西省数字经济学会首席信息官(CIO)专业委员会成立大会暨“新质生产力”企业数字化转型论坛在南昌香格里拉大酒店隆重举行。 江西省工业和信息化厅作为指导单位&#xff0c;由江西省数字经济学会、南昌市中小企业服务局主办&#xff0c;金蝶软件&#xff0…

idea、datagrip注册记录下

一、DataGrip注册 DataGrip版本号&#xff1a;DataGrip 2023.2 访问地址&#xff1a;https://3.jetbra.in/ 点击“hardbin.com”&#xff0c;下载“jetbra.zip” 在vm里面添加上&#xff1a; -javaagent:D:\work\idea\jetbra\ja-netfilter.jarjetbrains重启datagrip 在刚刚…

香港苏州商会、香港青年科学家协会博士团参观李良济,加强人才交流,促进科创合作与共赢

近日&#xff0c;香港苏州商会、香港青年科学家协会联合主办的苏港青年科创交流会成功举行&#xff0c;香港青年科学家协会博士团神州行苏州站启动。 5月26日&#xff0c;香港苏州商会及香港青年科学家协会博士团走进李良济&#xff0c;先后参观了李良济中医药文化展厅&#xf…

zynq之UART

之前尝试UART0&#xff08;MIO50、51&#xff09;&#xff0c;串口调试助手收到发送的内容。 现在板子上EMIO端有多个串口&#xff0c;所以看看这个怎么弄。 串口是484的转接板&#xff08;接232的串口就会输出乱码&#xff09; https://blog.51cto.com/u_15262460/2882973 …

vue+css解决图片变形问题(flex-shrink: 0)

解决前 给图片添加 flex-shrink: 0;即可解决图片变形问题

leetcode 1270 向公司CEO汇报工作的所有人(postgresql)

需求 员工表&#xff1a;Employees ---------------------- | Column Name | Type | ---------------------- | employee_id | int | | employee_name | varchar | | manager_id | int | ---------------------- employee_id 是这个表的主键。 这个表中每一行中&#xff0c;e…

四川音盛佳云电子商务有限公司可靠吗?怎么样?

在数字经济的浪潮中&#xff0c;抖音电商以其独特的魅力逐渐崭露头角&#xff0c;成为电商领域的一股新势力。而四川音盛佳云电子商务有限公司&#xff0c;正是这股新势力中的佼佼者&#xff0c;以其专业的服务和创新的理念&#xff0c;引领着抖音电商的发展潮流。 四川音盛佳…

用docker搭建的Vulfocus镜像管理界面没有镜像可以拉取解决办法

ps&#xff1a;截止到今天2023.4.2&#xff0c;kali和vps的docker拉取的vulfocus镜像会有版本的区别&#xff0c;虽然都是拉取的最新版&#xff0c;vps上镜像为3个月以前&#xff0c;kali上为16个月以前&#xff0c;所以在修改 views.py 文件时&#xff0c;可能会发现文件内容不…

Sping源码(九)—— Bean的初始化(非懒加载)— getMergedLocalBeanDefinition

序言 前两篇文章介绍了Bean初始化之前的一些准备工作&#xff0c;包括设置BeanFacroty的ConversionService属性以及将Bean进行冻结。这篇文章将会进入到preInstantiateSingletons方法。进一步了解Bean的初始化流程。 preInstantiateSingletons public void preInstantiateSin…

JS实现彩色图片转换为黑白图片

1. 使用 Canvas 研究 canvas 时发现一个有趣的现象——将彩色图片巧妙地转换为黑白图片。以下是实现这一功能的简洁代码示例&#xff1a; <div style"display: flex"><img src"./panda.jpeg" /><button onclick"change()">转…

[C++]debug介绍+debug时如何查看指针指向内存处的值

一、简介 预备工具和知识&#xff1a;使用使用VSCode使用Debug。 本文简介&#xff1a;本文将简要介绍debug中Continue&#xff0c;Step Over&#xff0c;Step Into和Restart的功能。并介绍如何在debug时查看动态内存地址&#xff08;指针&#xff09;的值&#xff1b; 二、D…

强国机械制造有限公司开展中国制造2050系列高端论坛

为深入探讨中国制造2050战略的实施路径和未来发展方向,强国机械制造有限公司2023年10月13日举办了一系列高端论坛。这些论坛吸引了众多业内专家、学者和企业代表参加,共同交流前沿观点和经验,以推动中国制造业的创新与发展。 本次系列高端论坛涵盖了多个关键主题,以下是各论坛…

《Ai企业知识库》rasa-rasa Core核心-认知理解以及配置文件应用

阿丹&#xff1a; 其实在整个rasa中的关键元素和关键的核心在前面多多少少也涉及到了很多&#xff0c;这里就是开始涉及到了rasa的训练核心core。 Rasa Core: Rasa Core 是Rasa框架中的一个组件&#xff0c;它负责处理对话管理部分&#xff0c;即决定对话流程中机器人的下一步…

大模型预训练结果到底是什么?

近日参加一个线下 AI 交流会议&#xff0c;会上有个非本行业的老师提问&#xff1a;“大家说的训练好的大模型到底是什么&#xff1f;是像 Word 软件一样可以直接使用的程序吗&#xff1f;” 这个问题看似简单&#xff0c;却一下把我问住了。的确&#xff0c;我们这些身处 AI 领…

如何培养元技能?

如何培养元技能&#xff1f; 一、引言 在当今社会&#xff0c;仅仅依靠某一专业技能是远远不够的。我们需要拓宽自己的能力和视野&#xff0c;从而更好地应对日新月异的社会发展和工作需求。在这个过程中&#xff0c;培养元技能变得至关重要。元技能不仅有助于我们在各个领域中…

智能变革:领域大模型重塑企业知识管理!

在如今知识密集型的行业领域里&#xff0c;企业员工每天都要与海量的文档和信息打交道&#xff0c;工作邮箱里充斥着无数邮件&#xff0c;办公桌上堆满了各种报告和文档&#xff0c;而每一个文件里都可能藏有关键信息。 然而&#xff0c;要从这些杂乱无章的信息海洋中找到需要…

JavaDS-学习数据结构之如果从零开始手搓顺序表,顺带学习自定义异常怎么用!

前言 笔者开始学习数据结构了,虽然笔者已经会用了,不管是C 中的stl亦或是Java 中的集合,为了算法比赛多少都突击过,但只知其然而不知其所以然,还是会限制发展的,因此,笔者写下这篇博客.内容是手搓一个顺序表.顺带加一点异常的使用,大伙看个乐子就好了.有错误直接私信喷我就好了…

wxPython Demo大全系列:ActivityIndicator控件分析

一、ActivityIndicator介绍 wx.ActivityIndicator 控件是 wxPython 中用于显示活动指示器的控件&#xff0c;通常用于指示程序正在执行某些后台任务或操作。它在用户界面中以动画的形式表现出活动状态&#xff0c;让用户知道应用程序正在进行处理而不是被挂起。 主要特点 可视…