去年TensorFlow官方推出了模型优化工具,最多能将模型尺寸减小4倍,运行速度提高3倍。

最近现又有一款新工具加入模型优化“豪华套餐”,这就是基于Keras的剪枝优化工具。

训练AI模型有时需要大量硬件资源,但不是每个人都有4个GPU的豪华配置,剪枝优化可以帮你缩小模型尺寸,以较小的代价进行推理。

什么是权重剪枝?

权重剪枝(Weight Pruning)优化,就是消除权重张量中不必要的值,减少神经网络层之间的连接数量,减少计算中涉及的参数,从而降低操作次数。

这样做的好处是压缩了网络的存储空间,尤其是稀疏张量特别适合压缩。例如,经过处理可以将MNIST的90%稀疏度模型从12MB压缩到2MB。

此外,权重剪枝与量化(quantization)兼容,从而产生复合效益。通过训练后量化(post-training quantization),还能将剪枝后的模型从2MB进一步压缩到仅0.5MB 。

TensorFlow官方承诺,将来TensorFlow Lite会增加对稀疏表示和计算的支持,从而扩展运行内存的压缩优势,并释放性能提升。

优化效果

权重剪枝优化可以用于不同任务、不同类型的模型,从图像处理的CNN用于语音处理的RNN。下表显示了其中一些实验结果。

以GNMT从德语翻译到英语的模型为例,原模型的BLEU为29.47。指定80%的稀疏度,经优化后,张量中的非零参数可以从211M压缩到44M,准确度基本没有损失。

使用方法

现在的权重剪枝API建立在Keras之上,因此开发者可以非常方便地将此技术应用于任何现有的Keras训练模型中。

开发者可以指定最终目标稀疏度(比如50%),以及执行剪枝的计划(比如2000步开始剪枝,在4000步时停止,并且每100步进行一次),以及剪枝结构的可选配置。


 
import tensorflow_model_optimization as tfmotmodel = build_your_model()pruning_schedule = tfmot.sparsity.keras.PolynomialDecay(initial_sparsity=0.0, final_sparsity=0.5,begin_step=2000, end_step=4000)model_for_pruning = tfmot.sparsity.keras.prune_low_magnitude(model, pruning_schedule=pruning_schedule)…model_for_pruning.fit(…) tensorflow_model_optimization as tfmot

model = build_your_model()

pruning_schedule = tfmot.sparsity.keras.PolynomialDecay(
initial_sparsity=0.0, final_sparsity=0.5,
begin_step=2000, end_step=4000) model_for_pruning = tfmot.sparsity.keras.prune_low_magnitude(model, pruning_schedule=pruning_schedule) … model_for_pruning.fit(…)

 三个不同张量,左边的没有稀疏度,中心的有多个单独0值,右边的有1x2的稀疏块。

随着训练的进行,剪枝过程开始被执行。在这个过程中,它会消除消除张量中最接近零的权重,直到达到当前稀疏度目标。

每次计划执行剪枝程序时,都会重新计算当前稀疏度目标,根据平滑上升函数逐渐增加稀疏度来达到最终目标稀疏度,从0%开始直到结束。

用户也可以根据需要调整这个上升函数。在某些情况下,可以安排训练过程在某个步骤达到一定收敛级别之后才开始优化,或者在训练总步数之前结束剪枝,以便在达到最终目标稀疏度时进一步微调系统。

权重张量剪枝动画,黑色的点表示非零权重,随着训练的进行,稀疏度逐渐增加

GitHub地址:

https://github.com/tensorflow/model-optimization

官方教程:

https://www.tensorflow.org/model_optimization/guide/pruning/pruning_with_keras

欢迎关注磐创博客资源汇总站:http://docs.panchuang.net/

欢迎关注PyTorch官方中文教程站:http://pytorch.panchuang.net/

TensorFlow官方发布剪枝优化工具:参数减少80%,精度几乎不变的更多相关文章

  1. Qt程序打包发布方法(使用官方提供的windeployqt工具)

    Qt程序打包发布方法(使用官方提供的windeployqt工具) 转自:http://tieba.baidu.com/p/3730103947?qq-pf-to=pcqq.group Qt 官方开发环 ...

  2. PyTorch官方中文文档:torch.optim 优化器参数

    内容预览: step(closure) 进行单次优化 (参数更新). 参数: closure (callable) –...~ 参数: params (iterable) – 待优化参数的iterab ...

  3. 进程优化工具Process Lasso Pro 8.4官方版+激活破解方法

    Process Lasso是一款来自美国的系统进程优化工具,基于特殊算法动态调整进程的优先级别,通过合理的设置进程优先级来实现降低系统负担的功能.可有效避免蓝 屏.假死.进程停止响应.进程占用 CPU ...

  4. 发布《Linux工具快速教程》

    发布<Linux工具快速教程> 阶段性的完成了这本书开源书籍,发布出来给有需要的朋友,同时也欢迎更多的朋友加入进来,完善这本书: 本书Github地址:https://github.com ...

  5. SQLSERVER复制优化之一《减少包大小》

    原文:SQLSERVER复制优化之一<减少包大小> SQLSERVER复制优化之一<减少包大小> 自从搭了复制之后以为可以安枕无忧了,谁不知问题接踵而来 这次遇到的问题是丢包, ...

  6. 教你使用Android SDK布局优化工具layoutopt

    创建好看的Android布局是个不小的挑战,当你花了数小时调整好它们适应多种设备后,你通常不想再重新调整,但笨重的嵌套布局效率往往非常低下,幸运的是,在Android SDK中有一个工具可以帮助你优化 ...

  7. 解析Tensorflow官方English-Franch翻译器demo

    今天我们来解析下Tensorflow的Seq2Seq的demo.继上篇博客的PTM模型之后,Tensorflow官方也开放了名为translate的demo,这个demo对比之前的PTM要大了很多(首 ...

  8. 解析Tensorflow官方PTB模型的demo

    RNN 模型作为一个可以学习时间序列的模型被认为是深度学习中比较重要的一类模型.在Tensorflow的官方教程中,有两个与之相关的模型被实现出来.第一个模型是围绕着Zaremba的论文Recurre ...

  9. mysql优化———第二篇:数据库优化调整参数

    摘要 参数调优内容: 1. 内存利用方面 2. 日志控制方面 3.文件IO分配,空间占用方面 4. 其它相关参数 一  摘要 通过参数提高MYSQL的性能.核心思想如下:         1 提高my ...

随机推荐

  1. PyCharm使用技巧及常用快捷键

    Ctrl + Shift + F--------------------------------------------->>>>>>>高级查找 Ctrl + ...

  2. javascript输入用户名,在服务器中显示出了

    ## 第一个文件 pageEncoding="UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Tra ...

  3. js中的0就是false,非0就是true。

    在处理js代码判断真假时经常会这么写. var vale = fun();//从某个地方获取的值. if(!value){ 进入这里表示value为false或不存在 }但fun()可能得到的是数字0 ...

  4. 一步步打造自己的纯CSS单标签图标库

    图标作为网页设计中的一部分,其在凸显网页重要元素特性,视觉交互.引导以及网页装饰等充当的角色作用举足轻重.由于图标普遍具有尺寸小的特点,在项目实践时不宜将每个图标作为单个图片元素进行加载,这会增加Ht ...

  5. 如何在普通的元素上实现enter键的绑定

    在做登录页面时候,通常当用户输入账号密码后直接按enter键就触发登录按钮了. 如果是input标签,vue中可以绑定按键修饰符,但是如果是其它标签呢.我的做法如下: document.querySe ...

  6. 网络|Trojan 网络代理服务搭建

    Trojan 网络代理服务搭建 前言 本文目的在于帮助相同困惑的网友,让使用更加简单. Trojan为Trojan-GFW开源的一款新思路网络代理软件, 前期准备 [x] 服务器:系统CentOS 7 ...

  7. Hibernage错误:Could not open Hibernate Session for transaction

    今天客户发来的错误,是SSH框架做的项目,是用户在登陆时候出现的错误,但刷新之后就没问题. 提示错误:Could not open Hibernate Session for transaction. ...

  8. 必备技能五、router路由钩子

    在路由跳转的时候,我们需要一些权限判断或者其他操作.这个时候就需要使用路由的钩子函数. 定义:路由钩子主要是给使用者在路由发生变化时进行一些特殊的处理而定义的函数. 总体来讲vue里面提供了三大类钩子 ...

  9. 前端AES加密解密

    最开始使用的aes-js的npm包,后来发现npm上面那个包只能加密16个长度的字节,非16个长度的字符串就会报错,后来使用的是crypto-js, AES总共有四种加密方式,我们使用的CBC方式: ...

  10. Gnome 究极无死角美化!!!不要再说gnome丑啦!!!

    一.本文针对的美化部分包括:主题.图标.锁屏.开关机画面.gurb.插件.鼠标.终端及其配色方案. 二.资源下载: 1.请先下载好资源再继续进行.下列两个网址的内容一样,请根据下载体验自行选择. 超星 ...