目录
一、背景介绍
二、keras转tensorflow后,再用tensorflow tool:graph_transforms优化
2.1 keras转tensorflow
2.2 tensorflow tool:graph_transforms使用步骤
2.3 转换和压缩前后模型速度结果对比
三、Pocketflow
3.1 背景介绍
3.2 学习模块
3.3 超参数优化模块
3.4 性能
3.5 结论
四、keras压缩工具
4.1 压缩keras模型的工具
4.2 结论
待优化模型介绍:xception,keras模型,200ms左右
目标:优化速度
尝试了如下三种方法进行优化:
(1)针对tensorflow框架的pocketflow
(2)keras-compress工具
(3)tensorflow工具:graph_transforms
经过实验和对比,最终采用第3种方法:tensorflow工具graph_transforms进行速度优化。
接下来3个章节,先介绍最终采用的第三种方法的介绍和结果;最后,再介绍一下另外两种方法,尤其是pocketflow,对于tensorflow的压缩优化功能很强大,可作为之后模型优化的备选方案。
(1)转换代码:https://github.com/amir-abdi/keras_to_tensorflow
(2)转换方法:
python keras_to_tensorflow.py --input_model="path/to/keras/model.h5" --output_model="path/to/save/model.pb"
(1)安装bazel
官网安装指南:
https://docs.bazel.build/versions/master/install-ubuntu.html#install-with-installer-ubuntu
发布版本:
https://github.com/bazelbuild/bazel/releases
安装步骤:
sudo apt-get install pkg-config zip g++ zlib1g-dev unzip python
wget https://github.com/bazelbuild/bazel/releases/download/0.21.0/bazel-0.21.0-installer-linux-x86_64.sh
sudo chmod +x bazel-0.21.0-installer-linux-x86_64.sh
export PATH="$PATH:$HOME/bin"
注意:一定要安装最新版本的bazel,否则在编译代码时可能会报错
(2)编译tensorflow最新代码
git clone https://github.com/tensorflow/tensorflow.git
cd ./tensorflow
编译graph_transforms模块,需要等待一段时间,编译很耗费CPU资源和时间
bazel build tensorflow/tools/graph_transforms:transform_graph
(3)速度优化主要采用github官方资源的“Optimizing for Deployment”部分
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/tools/graph_transforms
如下是测试了1000张图片的平均速度:
序号 |
模型 |
平均速度 |
速度相对keras模型提升 |
说明 |
1 |
Xception_keras |
180ms |
|
原xcpeion的keras模型 |
2 |
Xception_tf |
120ms |
33% |
keras转tensorflow |
3 |
Xception_tfc |
110ms |
40% |
tensorflow进行bn合并,去除无用点,无用op |
测试结论:
(1)Keras-tensorflow:可加速。
(2)量化:不仅不加速,还降低速度。
(3)BN合并,去掉没用到的节点,去除一些无用的op:可加速。
(4)最终keras-tensorflow,再进行BN合并以及去除无用部分后,可加速40%。
官方文档地址:https://pocketflow.github.io/
针对tensorflow的模型压缩和优化框架。由两部分组成:学习模块和超参数优化模块。初始模型,经过学习模块后,使用一些随机选择的超参数来产生候选的压缩模型。候选模型的精度和计算效率作为超参数优化模块的输入,来决定下一次学习模块的超参数选择。经过多次上述迭代,最优的候选模型作为最终输出的压缩模型。
学习模块是指一些模型压缩方法。pocketflow目前支持的模型压缩算法如下:
压缩方法 |
描述 |
通道剪枝(2种) |
2017/2018 |
权重稀疏 |
2018 |
权重量化(3种) |
2018/TF/2016 |
网络蒸馏 |
为进一步降低精度损失,将压缩前模型的输出作为参考,来指导压缩模型的训练。 |
多GPU训练 |
加快训练速度 |
剪枝、权重稀疏和量化,通过剪枝mask或者量化函数实现。生成的模型可以通过小数据集进行部分迭代即可快速finetune。也可以通过完整的训练集进行finetune,这样精度更高,但耗时更长。
压缩算法的超参数很难人工设定,尤其是对于不熟悉算法细节的开发者。Pocketflow介绍一种迭代获取最优超参数的方法。首先提供一些基于GP/TPE/DDPG等模型的超参数优化器,然后通过迭代的方式进行超参数优化。
每一个迭代:
超参数优化模块选择一些超参数的组合
学习模块通过快速tune的方式产生一个候选的压缩模型
候选模型被用来评估当前超参数的选择,超参数模块更新模型,产生更好的超参数
多个迭代后,选出最优模型。
这个模型可以通过使用全部的训练数据训练,从而降低损失。
列举了剪枝和权重稀疏前后的精度对比,没有说速度。
如下是权重量化的对比结果:
看小模型mobilenet表现,8bit量化前后,精度不仅无损失还有所提高;同时速度提升2倍多。
以后针对tensorflow模型的优化,可以对比tensorlfow的trans_graph工具以及pocket_flow。
https://github.com/DwangoMediaVillage/keras_compressor
压缩后,模型大小减少,但是模型速度没有提升。
如果以后涉及到keras模型压缩,如果只考虑模型大小的减少,可以看下该工具的压缩效果。