转载自:CSDN Nine-days
 

近日,Intel 开源了一个用于神经网络压缩的开源 Python 软件包 Distiller,它可以减少深度神经网络的内存占用、加快推断速度及节省能耗。Distiller 为 PyTorch 环境提供原型和分析压缩算法,例如产生稀疏性张量的方法和低精度运算等。

项目地址:https://github.com/NervanaSystems/distiller/

文档地址:https://nervanasystems.github.io/distiller/index.html

深度学习正快速发展,它从输入法到汽车已经应用到各种场景和设备当中。但它们所采用的深度神经网络在运算时间、计算力、内存和能耗上都有非常大的需求。很多开发者考虑到硬件和软件的限制及实际应用的环境,而在算法准确度、速度和功耗之间取得平衡。近日,Intel 人工智能实验室开源了 Neural NetworkDistiller,它是一个为神经网络压缩算法研究而设计的 Python 包。Intel 认为深度网络的压缩可以成为促进更多的研究成果投入应用,并实现更优秀的功能。

深度网络压缩

面向用户的深度学习应用需要高度重视用户体验,因为交互式的应用通常对程序的响应时间非常敏感。谷歌的内部研究发现即使很小的服务响应延迟,它对用户的影响也非常显著。而随着越来越多的应用由深度模型提供核心功能,不论我们将模型部署在云端还是移动端,低延迟的推断变得越来越重要。

减少计算资源和加快推断速度的一种方法是从一开始就设计一种紧凑型的神经网络架构。例如 SqueezeNet 和 MobileNet 都旨在压缩参数数量与计算量的情况下尽可能保留较高的准确度,而 Intel 人工智能实验室也在设计这种紧凑型的模型,即提出了一种用于深层 DNN 的无监督结构学习方法,以获得紧凑的网络结构与高准确率。

而另一种降低计算力需求的方法直接从通用且性能优秀的深度网络架构开始,然后通过一些算法过程将其转换为更加短小精悍的网络,这种方法即神经网络压缩。

神经网络压缩是降低计算力、存储空间、能耗、内存和推断时间等需求的过程(至少其一),它同时还需要保持其推断准确性不下降或在可接受的范围内。通常这些资源是相互关联的,减少一种资源的需求同时会降低其它资源的需求。此外,即使我们使用前面几种紧凑的小模型,我们同样可以使用压缩算法进一步减少计算资源的需求。

其实很多研究都表明深度神经网络存在着非常高的参数冗余,虽然这些参数冗余在收敛到更优解时是非常必要的,但在推断过程中可以大量减少参数与计算量。总体而言,绝大多数压缩方法在于将巨大的预训练模型转化为一个精简的小模型,且常用的方法有低秩近似、神经元级别的剪枝、卷积核级别的剪枝、参数量化及知识蒸馏等。

例如在量化这一常见的压缩算法中,我们只需储存 k 个聚类中心 c_j,而原权重矩阵只需要记录各自聚类中心的索引就行。在韩松 ICLR 2016 的最佳论文中,他用如下一张图非常形象地展示了量化的概念与过程。

如上所示权重矩阵的所有参数可以聚类为 4 个类别,不同的类别使用不同的颜色表示。上半部分的权重矩阵可以取聚类中心,并储存在 centroids 向量中,随后原来的权重矩阵只需要很少的空间储存对应的索引。下半部是韩松等研究者利用反向传播的梯度对当前 centroids 向量进行修正的过程。这种量化过程能大量降低内存的需求,因为我们不再需要储存 FP64 或 FP32 的数据,而只需要储存 INT8 或更少占位的数据。

Distiller 简介

Intel 主要根据以下特征和工具构建了 Distiller:

  • 集成了剪枝、正则化和量化算法的框架

  • 分析和评估压缩性能的一组工具

  • 当前最优压缩算法的示例实现

剪枝和正则化是两种可以令深度网络参数张量产生稀疏性的方法,其中稀疏性度量的是参数张量中有多少数值精确为 0。稀疏张量可以更紧凑地储存在内存中,并且可以减少执行 DNN 运算所需要的计算量和能耗。量化是另一种减少 DNN 中数据精度的方法,它同样会减少内存、能耗和计算力需求。Distiller 为量化、剪枝(结构化剪枝和细粒度剪枝)和诱导稀疏性的正则化等方法提供了越来越多的当前最优算法,并支持训练更快、更紧凑和更节能的模型。

为了帮助研究者更专注于它们的任务,Intel 尝试提供一些大多数研究者都需要了解的压缩算法,并同时提供了高级和底层函数以方便使用。例如:

  • 剪枝方法在深度网络经过训练后,动态地从卷积网络层级移除卷积核与通道。Distiller 将在目标层配置中执行这些变化,并且同时对网络的参数张量做剪枝。此外,Distiller 还将分析模型中的数据依赖性,并在需要时修改依赖层。

  • Distiller 可以自动对模型执行量化操作,即使用量化后的层级副本替代具体的层级类型。这将节省手动转换每一个浮点模型为低精度形式的工作,并允许我们专注于开发量化方法,且在多种模型中扩展和测试它。

Intel 已经通过 Jupyter Notebook 介绍并展示如何从网络模型和压缩过程中访问统计信息。例如,如果我们希望移除一些卷积核,那么可以运行用于滤波器剪枝敏感性分析的模块,并得到类似以下的结果:

Jupyter Notebook 地址:https://nervanasystems.github.io/distiller/jupyter/index.html

Distiller 的统计数据可导出为 Pandas DataFrames,它可用于数据选择(索引和截取等)和可视化。

Distiller 还展示了一些示例应用,并使用量化和剪枝等方法压缩图像分类网络和语言模型。Distiller 还实现了一些神经网络压缩的前沿研究论文,它们也可以作为我们尝试新方法的模板。此外,我们也可以在官方 PyTorch 深度预训练模型上使用这些压缩算法,以降低计算资源的需求。

Distiller 压缩示例:https://nervanasystems.github.io/distiller/model_zoo/index.html

这只是个开始

Distiller 是一个用于压缩算法研究的库,它致力于帮助科学家和工程师训练并部署 DL 的解决方案、帮助发布研究论文以及促进算法更新与创新。Intel 目前也在添加更多的算法、特征和应用领域,如果读者对于研究并实现 DNN 压缩算法很感兴趣,也可以帮助改进并提升 Distiller 库。最后,Distiller 非常欢迎新的想法与深度网络压缩算法,同时也希望开发者能多发现该库的 Bug。

以下是在运行github的

python3 compress_classifier.py --arch simplenet_cif
ar ../../../data.cifar10 -p 30 -j=1 --lr=0.01

出现的错误:

1.ModuleNotFoundError: No module named 'distiller'

这是因为我是通过pip install -r requirements.txt来安装各种依赖的,没有运行pip install -e . 导致distiller模块没有导入进去。

2.AttributeError: module ‘tensorboard' has no attribute 'lazy'(谷歌出来的结果是Make sure that you don't have tb-nightly installed in your env.)

我采用pip uninstall tb-nightly指令发现并没有安装,于是卸载了虚拟环境中的tensorboard,这样也解决了错误。

Intel发布神经网络压缩库Distiller:快速利用前沿算法压缩PyTorch模型——AttributeError: module ‘tensorboard' has no attribute 'lazy'的更多相关文章

  1. pycharm 安装第三方库报错:AttributeError: 'module' object has no attribute 'main'

    pip升级到 10.0.1 之后 老版的pycharm 使用pip安装第三方库的时候会报错,报错如上图所示: 其主要原因是 新版的 pip 更改了 部分api 将其中 pip.main() 改为 pi ...

  2. 【神经网络与深度学习】Google Snappy - 一个高速压缩库

    Snappy已经被Google开源,作为一个压缩库,它可以利用单颗Intel Corei7处理器内核处理至少每秒250MB~500MB的数据流. Snappy的前身是Zippy.虽然只是一个数据压缩库 ...

  3. 【我的Android进阶之旅】快速创建和根据不同的版本类型(Dev、Beta、Release)发布Android 开发库到Maven私服

    前言 由于项目越来越多,有很多公共的代码都可以抽取出一个开发库出来传到公司搭建好的Maven私服,以供大家使用. 之前搭建的Maven仓库只有Release和Snapshot两个仓库,最近由于开发库有 ...

  4. 创建/发布cocoapods公共库

    对于大多数iOS开发者而言,cocoapods都是一个非常便捷的第三方库引导工具,该工具可以帮助我们快速导入所需第三方库,并且进行相关配置. 本文即为描述如何发布一个第三方库,提供给所有的开发者使用. ...

  5. MWeb for Mac使用教程-如何在文档库中快速搜索

    使用MWeb for Mac专业的 Markdown 编辑写作软件,可以让你随时记录自己的想法,灵感,创意,为您的工作节省宝贵的时间.本篇文章带来的是MWeb for Mac如何在文档库中快速搜索使用 ...

  6. 3D文件压缩库——Draco简析

    3D文件压缩库——Draco简析 今年1月份时,google发布了名为“Draco”的3D图形开源压缩库,下载了其代码来看了下,感觉虽然暂时用不到,但还是有前途的,故简单做下分析. 注:Draco 代 ...

  7. webpack快速入门——配置JS压缩,打包

    1 .首先在webpack.config.js中引入 const uglify = require('uglifyjs-webpack-plugin'); 2.然后在plugins配置里 plugin ...

  8. 发布Android开源库,看这个文章就够了!

    最近在Flipboard实习期间写了一个轮播工具,技术上没什么难点,不过动画效果还是不错的,决定改改代码写个库开源出去.项目地址:http://github.com/chengdazhi/Decent ...

  9. [转]Snappy压缩库安装和使用之一

    Snappy压缩库安装和使用之一 原文地址:http://blog.csdn.net/luo6620378xu/article/details/8521223 近日需要在毕业设计中引入一个压缩库,要求 ...

随机推荐

  1. [ASP.NET Core 3框架揭秘] Options[2]: 配置选项的正确使用方式[下篇]

    四.直接初始化Options对象 前面演示的几个实例具有一个共同的特征,即都采用配置系统来提供绑定Options对象的原始数据,实际上,Options框架具有一个完全独立的模型,可以称为Options ...

  2. 【Spark 内核】 Spark 内核解析-下

    Spark内核泛指Spark的核心运行机制,包括Spark核心组件的运行机制.Spark任务调度机制.Spark内存管理机制.Spark核心功能的运行原理等,熟练掌握Spark内核原理,能够帮助我们更 ...

  3. Spring Boot从零入门3_创建Hello World及项目剖析

    目录 1 前言 2 名词术语 3 创建Hello World项目 3.1 基于STS4创建项目 3.2 使用Spring Initializr Website创建项目并导入 3.3 基于Spring ...

  4. 【Java编程思想阅读笔记】Java数据存储位置

    Java数据存储位置 P46页有感 一.前置知识 栈是由系统自动分配的,Java程序员对栈没有直接的操作权限, 堆是所有线程共享的内存区域,栈 是每个线程独享的. 堆是由程序员自己申请的,在使用new ...

  5. 【xinsir】webpack实践

    webpack现在是前端必会的技能了,也是在工作中必定用到的.所以,如果我们现在还不会webpack,那么在将来面试中肯定会被扣分的. webpack中文官网:https://www.webpackj ...

  6. String中文字符转码

    如何使用String构造方法和String.getBytes()做好中文字符转码 @Test public void test() { String testStr = "中"; ...

  7. Nginx作为静态web服务器——缓存原理

    浏览器缓存 ​ 客户端无缓存的情况下 ​ 客户端有缓存的情况下 ​ 校验过期机制 ​ 本地客户端会检查Cache-Control(max-age)缓存是否过期,(max-age)为过期时间 Last- ...

  8. Django admin的简单使用

    1.汉化网站 位置:setting.py LANGUAGE_CODE = 'zh-hans' 2.注册站点(添加表) 位置:admin.py from app01 import models admi ...

  9. [bzoj2286] [洛谷P2495] [sdoi2015] 消耗战

    Description 在一场战争中,战场由 \(n\) 个岛屿和 \(n-1\) 个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足 ...

  10. 迈向Angular 2

    目录 序言 XV第1章 Angular 2快速上手 1Web的进化——新框架时代 2ECMAScript的进化 2Web Component 3WebWorker 4从AngularJS 1.x中学到 ...