系列文章目录
=======================================================
专题-端侧机器学习
第一节 `端侧机器学习框架Tensorlfow Lite
第二节 轻量级网络模型之MobileNet系列
第三节 轻量级网络模型之ShuffleNet
第三节 轻量级网络模型之EfficientNe
=======================================================
端侧机器学习框架 Tensorflow lite
端侧机器学习ODML
端侧机器学习:在边缘设备上运行的机器学习, 英文全称: On-device machine learning, 简称为ODML。
传统的机器学习应用场景:用户的数据在终端采集以后通过网络发送到服务端,然后使用模型进行推理,再将推理结果通过网络发送到终端。
而 端侧机器学习的应用场景是这样的:用户的数据在终端采集以后直接在终端进行推理。
可以看到,端侧机器学习部署有以下几大优点:
(1)低延时: 不涉及数据的传输等待;
(2)不依赖网络: 整个过程直接在终端完成;
(3)隐私保护:用户数据不需要传输到服务端,个人隐私得到了充分的保护;
端侧机器学习的挑战
相比于服务端, 端侧的计算资源(算力)
、内存
和电池
非常有限,因此对模型的大小以及运行效率等提出了更高的要要求, 因此,模型的尺寸应该足够小,运行足够快。相应的,出现了各种机器学习模型端侧部署优化方法,主要有4大类:
(1) 硬件加速:现有的移动设备/嵌入式设备大都有GPU, 如果模型可以在GPU上进行运算推理,则速度会大大提升;
(2)量化:模型参数一般默认都是32位浮点数,通过量化为整型可以成倍地减少模型尺寸;
(3)剪枝:简单来说就是将模型参数张量中较小的参数置零,从而模型变得非常稀疏,再通过压缩,可以大大减小模型尺寸,提高运行效率。
(4)使用针对移动端优化的网络架构:对模型架构进行优化,例如各种移动端网络框架,MobileNet系列,ShuffleNet, EfficientNet等等。
端侧机器学习框架
TensorFlow Lite (TFLite)于2017年底由Google-Tensorflow团队开源,是一个轻量
、快速
、跨平台
的专门针对移动和IoT场景
的开源机器学习框架,作为TensorFlow的一部分,其支持Android、iOS、嵌入式Linux以及MCU 等多个平台部署.它大大降低开发者使用门槛,加速端侧机器学习的发展。
Tensorflow lite系统架构
TF Lite 主要由模型转换器Convertor、解释执行器Interpretor, 算子库Op kernels和硬件加速器 共4大部分组成。 如下图所示。
一句话: 用户首先用model interpretor将训练好的tensorflow模型转换为TFlite文件格式 (具体转换以来算子库Op kernels的支持),然后在设备端, TF interpretor接受优化后的的TF lite模型,并调用不同的硬件加速器进行推理
。
下面对各个组成部分进行介绍。
TF lite模型转换器
Tf lite converter会将训练好的模型(例如: .pb格式)转换为TF lite专用的存储格式(.tflite),示意图如下:
转换过程中主要做了两件事:
(1)算子优化和编译优化:
TF lite实现了一套优化的算子内核, 将模型操作转换成这些算子后能够大幅提升性能
(2)量化的原生支持:
转换模型过程中如果想要使用 训练后量化(post training quantization),只需要对convertor进行假肚腩配置即可:
converteror.optimizations = [tfl.lite.Optimize.DEFAULT]
注: tf lite 专用的存储格式为 Flat buffer, 其支持将文件直接映射到内存,然后直接读取和解释,具有实时性号,内存搞笑的特点。
TF lite解释执行器
即进行模型推理的解释执行器, 提供了多种语言的API, 并且可以在各种硬件平台运行 转换后的模型。
使用解释器的一般步骤为: 加载模型 -> 转换数据 -> 模型推理 -> 解释模型输出.
算子库
之前提到,TF lite实现了一套优化的算子内核, 目前TFLite约有130个算子,大多同时支持浮点和量化类型。TF lite支持的所有算子见: https://www.tensorflow.org/lite/guide/ops_compatibility
尽管如此, 很多tensorflow算子并没有与之相对应的TF lite 算子, 不过TF lite仍会支持。
当遇到不饿能支持的算子时,常见的解决办法是:
(1)复用Tensorflow算子,
称之为:SelectTF Ops, 只需要多加一行转换器参数就可以开启:
converter.target_spec.supported_ops=[tf.lite.OpsSet.TFLITE _BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS]
(2) 自定义算子
可以自定义新的算子,或者提供定制的更优化的算子
(3) 使用其他等价算子
可以替换为其他TFLite能支持的算子
硬件加速器
TF lite硬件加速接口统称为delegate
, 它可以将模型的全部或部分 委托给另一个硬件后台(如CPU,GPU)执行。
常见的硬件加速器包括:
(1) GPU delegate: 可在Andriod和IOS设备上使用;
(2) AndroidNNAPIdelegate: 适用于较新的ANdroid设备;
(3) Hexagondelegate: 适用于较久的Android设备;
(4) oreMLdelegate: 适用于较新的Iphone和Ipad设备;
如果硬件后端不支持TF lite怎么办?
TF lite具有很强的可扩展性, 完全可以为特定的硬件定制delegate, 大致步骤如下:
(1)定义一个新的delegate算子,它负责计算被代理的子图;
(2)创建一个TfLite Delegate 实例,它负责注册新定义的delegate算子,并可以把计算图中的一些子图替换为新的delegate算子;
总结
未完待续。
References
1.TensorFlowLite:端侧机器学习框架