作者:殇者残雪_270 | 来源:互联网 | 2024-11-05 17:00
近期在探索如何将服务器端的模型迁移到移动设备上,并记录了一些关键问题和解决方案。本文假设读者具备以下基础知识:了解TensorFlow的计算图(Graph)、图定义(GraphDef)和元图定义(MetaGraphDef)。此外,文中还详细介绍了模型转换、性能优化和资源管理等方面的实践经验,为开发者提供有价值的参考。
最近在研究怎么将服务器跑的模型移植到手机端,需要一些问题记录下~
前提知识:
1)熟悉 Graph、GraphDef和MetaGraphDef的含义和区别
2)熟悉tf lite官网上的文档,包括python api和命令行CLI的使用方法(lite converter和lite interpreter)
3)熟悉quantization_aware traning的官网示例(区别于post quantization)
4)熟悉mobilenet_v1官方的train和eval示例
如果熟悉了上面的前提知识,那么手机端lite移植也就不难了~
步骤:
1)使用quantization_aware的方式训练模型(quant delay延迟加载)得到checkpoint文件。(包含模型变量的参数值)
2)将train graph转为eval graph。(模型图的前向传播图,只包含结果,不包含参数值)
3)基于eval graph,得到frozen graph(freeze_graph命令行工具),将变量转为常量~。(将ckpt文件中变量值附加到前向传播图中,作为参数常量存在,也就是“frozen”的意思[将变量冻结为常量]~)
4)调用toco命令行工具,将frozen graph转为lite graph(指定输入和输出的name、输入的大小、inference的输入和输出类型、GraphDef或其他包含GraphDef的格式文件等等)。
采坑:
1)量化的graph目标不是train graph,而是eval graph
2)python api方式转为lite一直报错,转为freeze_graph+toco解决
3)freeze_graph和toco命令行的参数说明
4)input_shape要前后始终统一
5)要熟悉Graph、GraphDef、MetaGraphDef等区别
6)熟悉summary.save、savedModel、save_graph_def和export_meta_graph等api的区别
7)熟悉tf的整个流程,深刻理解tensor和operation的作用和地位
8)post quantization和quantization-aware训练模型,量化处理的方式不一样(详情见tf官方文档)
如何保证量化之后的精度:
待定~
更多学习笔记可以关注我的微信公众号「kelly学挖掘」,欢迎交流。
-- over --