腾讯PocketFlow模型压缩与加速实现
1. 开发环境:
Ubuntu16.04
Python3.6
tensorflow1.12
2. 安装
PocketFlow github地址:
官网教程:https://pocketflow.github.io/installation/
官网提供了三种PocketFlow部署方法,分别为:本地、docker、seven,这里我使用的是local开发方法。安装步骤:
2.1 拷贝工程到本地
$ git clone https://github.com/Tencent/PocketFlow.git
2.2 创建配置路径
进入PocketFlow主目录,拷贝path.conf.template并重命名为path.conf,修改里面的数据集路径,这里我用的是cifar10来做图片分类。
# data files
data_hdfs_host = None
data_dir_local_cifar10 = /home/liguiyuan/deep_learning/data/cifar-10-batches-bin
data_dir_hdfs_cifar10 = None
data_dir_seven_cifar10 = None
data_dir_docker_cifar10 = /opt/ml/data # DO NOT EDIT
data_dir_local_ilsvrc12 = None
data_dir_hdfs_ilsvrc12 = None
data_dir_seven_ilsvrc12 = None
data_dir_docker_ilsvrc12 = /opt/ml/data # DO NOT EDIT# model files
model_http_url = https://api.ai.tencent.com/pocketflow
2.3 准备预训练模型
下载你需要的预训练模型,可以从PocketFlow的list地址下载,地址为:https://api.ai.tencent.com/pocketflow/list.html
然后把下载好的文件解压为 ./PocketFlow/models子目录。
3. 训练模型
3.1 训练无压缩网络
# local mode with 1 GPU
$ ./scripts/run_local.sh nets/resnet_at_cifar10_run.py# docker mode with 8 GPUs
$ ./scripts/run_docker.sh nets/resnet_at_cifar10_run.py -n=8# seven mode with 8 GPUs
$ ./scripts/run_seven.sh nets/resnet_at_cifar10_run.py -n=8
-n=8 表示GPU的数量,根据自己的配置进行调整,生成的模型在models文件夹了,最后看到loss和acc效果分别如下:
INFO:tensorflow:loss = 4.4453e-01
INFO:tensorflow:accuracy = 9.2500e-01
3.2 训练压缩的模型
- 通用压缩模型
使用的是discrimination-aware channel pruning(DCP)算法。
# local mode with 1 GPU
$ ./scripts/run_local.sh nets/resnet_at_cifar10_run.py \--learner dis-chn-pruned# docker mode with 8 GPUs
$ ./scripts/run_docker.sh nets/resnet_at_cifar10_run.py -n=8 \--learner dis-chn-pruned# seven mode with 8 GPUs
$ ./scripts/run_seven.sh nets/resnet_at_cifar10_run.py -n=8 \--learner dis-chn-pruned
生成的DCP算法压缩模型在models_dcp目录下,默认的dcp_prune_ratio剪枝率为0.5。
- 指定自己的剪枝率来训练
$ ./scripts/run_local.sh nets/resnet_at_cifar10_run.py \--learner dis-chn-pruned \--enbl_dst \--dcp_prune_ratio 0.75
剪去了3/4,即卷积层网络规模变为原来的1/4。剪枝后的模型生成在models_dcp_eval目录下,我们看到loss: 9.63+,acc: 0.846,对比没剪枝之前,发现变换还是挺大的,loss变大很多,acc下降了约8个百分点,毕竟减去了3/4的网络,效果如下:
官网还有很多配置选项,建议去看官方的配置选项详解。
4.导出为TensorFlow Lite模型
转换 checkpoint 文件为 *.tflite 文件,来部署到移动端设备:
# convert checkpoint files into a *.tflite model
$ python tools/conversion/export_pb_tflite_models.py \--model_dir models_dcp_eval
报了一个错误:
INFO:tensorflow:input details: [{'name': 'net_input', 'index': 0, 'shape': array([ 1, 32, 32, 3], dtype=int32), 'dtype': <class 'numpy.float32'>, 'quantization': (0.0, 0)}]
INFO:tensorflow:output details: [{'name': 'net_output', 'index': 1, 'shape': array([ 1, 10], dtype=int32), 'dtype': <class 'numpy.float32'>, 'quantization': (0.0, 0)}]
Traceback (most recent call last):
File "tools/conversion/export_pb_tflite_models.py", line 383, in main
export_pb_tflite_model(net, meta_path, pb_path, tflite_path)
File "tools/conversion/export_pb_tflite_models.py", line 356, in export_pb_tflite_model
test_tflite_model(tflite_path, net['input_data'])
File "tools/conversion/export_pb_tflite_models.py", line 289, in test_tflite_model
interpreter.set_tensor(input_details[0]['index'], net_input_data)
File "/usr/local/lib/python3.6/dist-packages/tensorflow/contrib/lite/python/interpreter.py", line 156, in set_tensor
self._interpreter.SetTensor(tensor_index, value)
File "/usr/local/lib/python3.6/dist-packages/tensorflow/contrib/lite/python/interpreter_wrapper/tensorflow_wrap_interpreter_wrapper.py", line 133, in SetTensor
return _tensorflow_wrap_interpreter_wrapper.InterpreterWrapper_SetTensor(self, i, value)
ValueError: Cannot set tensor: Got tensor of type 0 but expected type 1 for input 0
是net_input的输入数据类型出问题了,把 int32改为np.float32类型就可以了。
修改tools/conversion/export_pb_tflite_models.py 289行
interpreter.set_tensor(input_details[0]['index'], net_input_data)
# 改为:
interpreter.set_tensor(input_details[0]['index'], net_input_data.astype(np.float32))
可以看到在PocketFlow/models_dcp_eval/目录下生成 model.pb model.tflite两个文件,文件都很小,用于部署移动端设备最合适了。
5. 部署到移动端
TODO
腾讯PocketFlow模型压缩与加速实现相关推荐
- 腾讯 AI Lab 正式开源PocketFlow自动化深度学习模型压缩与加速框架
11月1日,腾讯AI Lab在南京举办的腾讯全球合作伙伴论坛上宣布正式开源"PocketFlow"项目, 该项目是一个自动化深度学习模型压缩与加速框架,整合多种模型压缩与加速算法并 ...
- 优秀!腾讯AI Lab开源模型压缩与加速框架PocketFlow!
点击我爱计算机视觉标星,更快获取CVML新技术 PocketFlow,成熟高效的模型压缩与加速框架,经过腾讯内部AI技术商用实践检验,你值得拥有- 以下内容来自腾讯AI实验室(tencent_aila ...
- 深度学习模型压缩与加速综述!
↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:Pikachu5808,编辑:极市平台 来源丨https://zh ...
- 深度学习模型压缩与加速综述
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 导读 本文详细介绍了4种主流的压缩与加速技术:结构优化.剪枝.量化 ...
- 一文看懂深度学习模型压缩和加速
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 1 前言 近年来深度学习模型在计算机视 ...
- 端上智能——深度学习模型压缩与加速
摘要:随着深度学习网络规模的增大,计算复杂度随之增高,严重限制了其在手机等智能设备上的应用.如何使用深度学习来对模型进行压缩和加速,并且保持几乎一样的精度?本文将为大家详细介绍两种模型压缩算法,并展示 ...
- 模型压缩与加速:Octave Convolution
自AlexNet刷新了ImageNet比赛的最佳记录以来,神经网络的又一次高潮猛烈的到来了.一些列各种各样的网络层出不穷,图像/音频/文本等各种任务下都开始了神经网络一统天下的声音.然而神经网络虽 ...
- 深度学习模型压缩与加速技术(三):低秩分解
目录 总结 低秩分解 定义 特点 1.二元分解 2.多元分解 参考文献 深度学习模型的压缩和加速是指利用神经网络参数的冗余性和网络结构的冗余性精简模型,在不影响任务完成度的情况下,得到参数量更少.结构 ...
- CNN 模型压缩与加速算法总结
CNN 模型压缩与加速算法 转载地址:https://blog.csdn.net/QcloudCommunity/article/details/77719498 导语:卷积神经网络日益增长的深度和尺 ...
最新文章
- Pytorch交叉熵损失函数torch.nn.functional as F
- 转载 一个渣硕iOS春招总结 | 掘金技术征文
- zabbix之rpm简单快速安装详解
- 如何解决项目中.a文件中的.o冲突
- 史上最简单的SpringCloud教程 | 第九篇: 服务链路追踪(Spring Cloud Sleuth)
- 什么是套接字?Socket基本介绍
- Object关于属性property的静态方法
- jmeter里的连接数_Jmeter之连接问题
- 二、Nginx 反向代理配置初学个人理解
- pythonsearch方法_python正则表达式(4)--search方法
- pandas获取索引行数据
- 得力计算机无法开机,得力针式打印机常见问题及解决方法
- fcpx插件:去除音频中的回声混响插件 EchoRemover
- Hadoop综合大作业
- php + redis 实现延迟队列
- PaddleOCR windows10下的安装使用
- 区分map和fileter
- 单板嵌入式计算机定义,用于嵌入式控制系统的单板计算机
- FFplay文档解读-5-编解码器选项二
- JAVA常用类之Arrays工具类