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量化相关推荐

  1. 模型加速之INT8量化原理及实践(基于TensorRT)

    一.模型量化: 1.量化的定义是将网络参数从Float-32量化到更低位数,如Float-16.INT8.1bit等. 2.量化的作用:更小的模型尺寸.更低的功耗.更快的计算速度.下图是不同数据结构比 ...

  2. OpenVINO 2021r4.1 - 瞎搞YOLOV5 模型转换,INT8量化及C++推理实现

    今年年初的时候曾经玩了一阵openvino yolov5量化,后来找到了这个github的大神教程完美解决GitHub - Chen-MingChang/pytorch_YOLO_OpenVINO_d ...

  3. 基于Distiller的模型压缩工具简介

    Reference: https://github.com/NervanaSystems/distiller https://nervanasystems.github.io/distiller/in ...

  4. CNN模型 INT8 量化实现方式(一)

    当前CNN模型基本都是 float32,将其转换为 INT8 可以降低模型大小,提升速度,精度降低的也不太多.那么在实际中如何实现这个量化了?在网上找到了三种实践方法, 基于腾讯的NCNN, Tens ...

  5. 【部署加速】模型Int8量化

    0前言 为什么量化有用? 因为CNN对噪声不敏感. 2. 为什么用量化? 模型太大,比如alexnet就200MB,存储压力大的哟,必须要降一降温: 每个层的weights范围基本都是确定的,且波动不 ...

  6. PyTorch模型训练完毕后静态量化、保存、加载int8量化模型

    1. PyTorch模型量化方法 Pytorch模型量化方法介绍有很多可以参考的,这里推荐两篇文章写的很详细可以给大家一个大致的参考Pytorch的量化,官方量化文档 Pytorch的量化大致分为三种 ...

  7. OpenVINO 2022.3实战六:NNCF 实现 YOLOv5 模型 INT8 量化

    OpenVINO 2022.3实战六:NNCF 实现 YOLOv5 模型 INT8 量化 1 将YOLOv5模型转换为OpenVINO IR 使用OpenVINO模型优化器将YOLOv5模型转换为Op ...

  8. fp32和int8模型的区别_Int8量化-ncnn社区Int8重构之路(三)

    传送门ncnn​github.comBUG1989/caffe-int8-convert-tools​github.com 前言 从去年8月初首次向社区提交armv7a版本的int8功能模块到现在过去 ...

  9. 揭晓飞桨平台提速秘诀:INT8量化加速实现“事半功倍”

    为帮助广大企业和开发者更加便捷和快速地创建深度学习应用,百度飞桨正不断地提升平台的训练和推理能力,并与英特尔紧密合作,在至强® 平台集成的AI加速能力的支持下,以 INT8 量化方案,在不影响预测准确 ...

  10. TensorRT INT8量化原理与实现(非常详细)

    目录 一.模型量化是什么? 二.为什么要做模型量化? 三.模型量化的目标是什么? 四.模型量化的必要条件 五.模型量化的分类 5.1 线性量化和非线性量化 5.2 逐层量化.逐组量化和逐通道量化 5. ...

最新文章

  1. SQL Server 创建数据库快照
  2. 面了一个47的程序员,我很慌...
  3. python opencv投影变换增强
  4. 大学士带你领略“大院大所”黑科技!
  5. 用软件lm_sensors监测Linux系统和CPU温度(转)
  6. 来自Riot 的一份游戏美术教程(五):技术美术
  7. iOS 网络输入流提供请求体(适用于大容量内容)
  8. CodeForces - 1307D Cow and Fields(最短路+思维)
  9. 【Java语法】抽象类、接口、内部类
  10. YBTOJ:前缀询问(trie树)
  11. 华为云3大体系化防护实践,保障金融业云上数据安全
  12. modules node 太大了_如何将Node.js Docker镜像大小减小10倍
  13. java版mini聊天室
  14. 【保险类项目】开发必须了解知道的概念 / 术语
  15. 基于安卓的高清语音技术亮相中国国际通信展览会
  16. Python+Open3D 解析Velodyne VLP-16激光雷达数据
  17. 扡扫机器人_评测:不会满场乱飞奔 这台Anker扫拖机器人指哪儿扫哪儿
  18. python3.8 安装fitter包失败,网上所有办法都试过不行之后!
  19. Siemens CXV65+Photoshop CS2
  20. UDP实战模拟——聊天模拟器

热门文章

  1. 超级计算机 任务提交,超算任务提交系统slurm用法
  2. 解决启动filebeat时遇到Exiting: error unpacking config data: more than one namespace configured accessing错误
  3. 亲测好用的6个临时邮箱推荐
  4. 两台电脑用网线直连传文件
  5. 图像融合(Image Fusion)简介
  6. key_t键和ftok函数
  7. 《JAVA》编程创建一个Box类(长方体),在Box类中定义三个变量
  8. 阿里云部署数据库(遇到的问题及解决方案)
  9. adb remount失败的解决办法:
  10. 【ThreeJS基础教程-初识Threejs】1.2掌控我们的物体和模型