模型压缩工具Distiller-INT8量化
1.distiller工具介绍
Distiller
是一个开源的Python
软件包,用于神经网络压缩研究。网络压缩可以减少神经网络的内存占用,提高推理速度并节省能源。Distiller
提供了一个PyTorch
环境,用于对压缩算法进行原型设计和分析。
主要功能:
- A framework for integrating pruning, regularization and quantization algorithms. 模型剪枝,正则化以及量化
- A set of tools for analyzing and evaluating compression performance. 分析和评估压缩性能
- Example implementations of state-of-the-art compression algorithms. 一些压缩实例
2.distiller安装
github地址:https://github.com/NervanaSystems/distiller 支持PyTorch1.x(在Pytorch 1.1+PyThon3.6上测试成功)。
使用手册:https://nervanasystems.github.io/distiller/ 具体安装见github。
3.distiller量化模块使用
distiller量化模块的使用以及实例代码位于distiller/quantization和examples/classifier_compression下。
量化模块主要包含的功能如下:
- Automatic mechanism to transform existing models to quantized versions, with customizable bit-width configuration for different layers. No need to re-write the model for different quantization methods.
可对不同的模型进行一般位数(1bit~8bit, 16bit, fp16)量化 - Post-training quantization of trained full-precision models, dynamic and static (statistics-based)
对已经训练好的PyTorch模型文件直接进行压缩,并且能达到无精度损失,支持静态和动态量化。 - Support for quantization-aware training in the loop
可在训练中对模型进行量化
下面主要对量化模型的使用进行简单说明,分别对工具自带模型和自己的模型进行量化。
(1)distiller自带量化实例测试
distiller自带一些测试实例如ResNet20+cifar-10, ResNet50+ImageNet等
- 下面是对ResNet+cifar-10的测试:
找到compress_classifier.py文件,如下:
在此文件目录下运行命令行环境,输入以下指令:
$ python3 compress_classifier.py -a resnet20_cifar ../../../data.cifar10 --resume ../ssl/checkpoints/checkpoint_trained_dense.pth.tar --quantize-eval --evaluate
参数解释:-a 表示模型名称(这里是工具自带的模型名称,其他的如resnet32_cifar, resnet44_cifar, resnet56_cifar等等 cifar的模型代码文件位于distiller/models/cifar10/resnet_cifar.py)
../../../data.cifar10
是数据集路径
--resume 表示保存的模型的路径(一般是FP32即将被量化的模型),此参数现在已经更改为--resum-from
--quantize-eval 表示是否对模型量化并进行保存(只有当--evaluate被设置时才有用)
--evaluate 表示是否在测试集上进行测试
具体的其他参数参看distiller/apputils/image_classifier.py文件和distiller/quantization/range_linear.py文件以及github上参数解释。
运行时会对模型进行压缩,然后在测试集上测试,打印出top1和top5以及loss,运行结束后量化模型会保存在logs下。
(2)使用distiller量化自己的模型(PostTraining)
- 注意:distiller对模型文件的撰写有要求,如果不按照他的要求,那么可能不能量化模型,具体见https://github.com/NervanaSystems/distiller/issues/316
- 下面给出了量化自己模型的代码,在标红处调用prepare_model,此函数可以传递一些参数,比如需要量化的位数,量化的模式等。
- 代码如下:
import logging
from distiller.data_loggers import *
import DataLoader
import distiller.apputils.image_classifier as ic
import torch
from distiller.quantization.range_linear import PostTrainLinearQuantizer
from opt import args
import distiller.apputils as apputils
from distiller.apputils.image_classifier import test
import torch.nn as nn
import os
from your_model import your_modelmodel_path = ‘你自己的模型’model = your_model()
model.load_state_dict(model_path)model = model.cuda()
model.eval()quantizer = PostTrainLinearQuantizer(model)quantizer.prepare_model(torch.rand([你的模型输入的大小如[1, 3, 32, 32]]))apputils.save_checkpoint(0, 'my_model', model, optimizer=None,
name='quantized',
dir='quantization_model')
(3)使用distiller量化自己的模型(AwareTraing)
- 待写
4.一些问题
- 为什么模型被量化之后模型大小没有变小,速度反而降低?
参看https://github.com/NervanaSystems/distiller/wiki/Frequently-Asked-Questions-(FAQ) 中quantization部分
参看https://github.com/NervanaSystems/distiller/issues/159 - distiller中支持的量化操作类型有哪些?
目前的版本支持conv(conv2d, conv3d),relu, fc - 运行上面3(1)时出现错误 Process finished with exit code 132 (interrupted by signal 4: SIGILL)?
原因:模型被放到CPU中。 找到distiller/apputils/image_classifier.py文件,找到evaluate_model函数,将model.cpu()改为model.cuda()
5.distiller量化算法
- 本节介绍distiller量化所使用的算法,在distiller中主要分为PostTraining Quatization和Quantization-Aware Training.
- 待写
6.代码
- 代码已全部整理在 https://github.com/BlossomingL/compression_tool
- distiller修改代码在 https://github.com/BlossomingL/Distiller
- 有用的话麻烦手动点一下小星星,谢谢!
模型压缩工具Distiller-INT8量化相关推荐
- 模型加速之INT8量化原理及实践(基于TensorRT)
一.模型量化: 1.量化的定义是将网络参数从Float-32量化到更低位数,如Float-16.INT8.1bit等. 2.量化的作用:更小的模型尺寸.更低的功耗.更快的计算速度.下图是不同数据结构比 ...
- OpenVINO 2021r4.1 - 瞎搞YOLOV5 模型转换,INT8量化及C++推理实现
今年年初的时候曾经玩了一阵openvino yolov5量化,后来找到了这个github的大神教程完美解决GitHub - Chen-MingChang/pytorch_YOLO_OpenVINO_d ...
- 基于Distiller的模型压缩工具简介
Reference: https://github.com/NervanaSystems/distiller https://nervanasystems.github.io/distiller/in ...
- CNN模型 INT8 量化实现方式(一)
当前CNN模型基本都是 float32,将其转换为 INT8 可以降低模型大小,提升速度,精度降低的也不太多.那么在实际中如何实现这个量化了?在网上找到了三种实践方法, 基于腾讯的NCNN, Tens ...
- 【部署加速】模型Int8量化
0前言 为什么量化有用? 因为CNN对噪声不敏感. 2. 为什么用量化? 模型太大,比如alexnet就200MB,存储压力大的哟,必须要降一降温: 每个层的weights范围基本都是确定的,且波动不 ...
- PyTorch模型训练完毕后静态量化、保存、加载int8量化模型
1. PyTorch模型量化方法 Pytorch模型量化方法介绍有很多可以参考的,这里推荐两篇文章写的很详细可以给大家一个大致的参考Pytorch的量化,官方量化文档 Pytorch的量化大致分为三种 ...
- OpenVINO 2022.3实战六:NNCF 实现 YOLOv5 模型 INT8 量化
OpenVINO 2022.3实战六:NNCF 实现 YOLOv5 模型 INT8 量化 1 将YOLOv5模型转换为OpenVINO IR 使用OpenVINO模型优化器将YOLOv5模型转换为Op ...
- fp32和int8模型的区别_Int8量化-ncnn社区Int8重构之路(三)
传送门ncnngithub.comBUG1989/caffe-int8-convert-toolsgithub.com 前言 从去年8月初首次向社区提交armv7a版本的int8功能模块到现在过去 ...
- 揭晓飞桨平台提速秘诀:INT8量化加速实现“事半功倍”
为帮助广大企业和开发者更加便捷和快速地创建深度学习应用,百度飞桨正不断地提升平台的训练和推理能力,并与英特尔紧密合作,在至强® 平台集成的AI加速能力的支持下,以 INT8 量化方案,在不影响预测准确 ...
- TensorRT INT8量化原理与实现(非常详细)
目录 一.模型量化是什么? 二.为什么要做模型量化? 三.模型量化的目标是什么? 四.模型量化的必要条件 五.模型量化的分类 5.1 线性量化和非线性量化 5.2 逐层量化.逐组量化和逐通道量化 5. ...
最新文章
- SQL Server 创建数据库快照
- 面了一个47的程序员,我很慌...
- python opencv投影变换增强
- 大学士带你领略“大院大所”黑科技!
- 用软件lm_sensors监测Linux系统和CPU温度(转)
- 来自Riot 的一份游戏美术教程(五):技术美术
- iOS 网络输入流提供请求体(适用于大容量内容)
- CodeForces - 1307D Cow and Fields(最短路+思维)
- 【Java语法】抽象类、接口、内部类
- YBTOJ:前缀询问(trie树)
- 华为云3大体系化防护实践,保障金融业云上数据安全
- modules node 太大了_如何将Node.js Docker镜像大小减小10倍
- java版mini聊天室
- 【保险类项目】开发必须了解知道的概念 / 术语
- 基于安卓的高清语音技术亮相中国国际通信展览会
- Python+Open3D 解析Velodyne VLP-16激光雷达数据
- 扡扫机器人_评测:不会满场乱飞奔 这台Anker扫拖机器人指哪儿扫哪儿
- python3.8 安装fitter包失败,网上所有办法都试过不行之后!
- Siemens CXV65+Photoshop CS2
- UDP实战模拟——聊天模拟器
热门文章
- 超级计算机 任务提交,超算任务提交系统slurm用法
- 解决启动filebeat时遇到Exiting: error unpacking config data: more than one namespace configured accessing错误
- 亲测好用的6个临时邮箱推荐
- 两台电脑用网线直连传文件
- 图像融合(Image Fusion)简介
- key_t键和ftok函数
- 《JAVA》编程创建一个Box类(长方体),在Box类中定义三个变量
- 阿里云部署数据库(遇到的问题及解决方案)
- adb remount失败的解决办法:
- 【ThreeJS基础教程-初识Threejs】1.2掌控我们的物体和模型