https://blog.tensorflowcn.cn/2020/07/tensorflow-operation-fusion-in-tensorflow-lite-converter.html
https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEissIjoB9vu3WmdVTKr384peIUWMj-vsMo2i9lEuKHkjJa4LBcz9DmeGMJr1xrS9Gk7ET7o9end-68OxclfKumyUKHKSHkDI4YAHw6wiwwfmLyu3_SWkZyI8y90adYsv9Z3YQ8uL4UmYj4/s1600/op_fusion_banner.jpg
作者:Ashwin Murthy,Google TensorFlow 团队软件工程师
概述
边缘部署的效率和性能至关重要。TensorFlow Lite 通过将一系列更细粒度的 TensorFlow 操作(本身由复合操作组成,如 LSTM)融合和优化为单个可执行的 TensorFlow Lite 单位来实现这一点。
许多用户要求我们提供更细粒度的控制方式,以便将操作融合在一起以实现更高的性能提升。今天,我们通过为用户提供指定如何融合操作的能力来实现这一点。
此外,此新功能允许无缝转换 TensorFlow Keras LSTM 操作,这是我们最常被请求的功能之一。最重要的是,您现在可以将用户定义的 RNN 转换插入 TensorFlow Lite!
融合操作更高效
如前所述,TensorFlow 操作通常由许多基本、更细粒度的操作组成,例如
tf.add。这对于实现一定程度的可重用性很重要,使用户能够创建由现有单元组成的操作。
tf.einsum 是复合操作的一个例子。执行复合操作等效于执行其所有组成操作。
但是,为了提高效率,通常将一组更细粒度操作的计算“融合”到单个操作中。
融合操作的另一个用途是提供更高层次的接口来定义复杂转换,例如量化,否则在更细粒度的级别上将不可行或非常难以实现。
TensorFlow Lite 中融合操作的具体示例包括各种 RNN 操作,如单向和双向序列 LSTM、卷积 (conv2d、偏置添加、relu)、全连接 (matmul、偏置添加、relu) 等等。
将 TensorFlow 操作融合到 TensorFlow Lite 操作中在过去一直很
具有挑战性,直到现在!
开箱即用的 RNN 转换和其他复合操作支持
开箱即用的 RNN 转换
我们现在支持
Keras LSTM 和
Keras 双向 LSTM 的转换,这两个都是复合 TensorFlow 操作。这是让基于 RNN 的模型利用 TensorFlow Lite 中高效的 LSTM 融合操作的最简单方法。请参见
此笔记本,了解通过 TensorFlow Lite 解释器进行的 Keras LSTM 到 TensorFlow Lite 的端到端转换和执行。
此外,我们通过为转换基础设施提供一个方便的接口,使转换能够转换为任何其他 TensorFlow RNN 实现。您可以看到使用
lingvo 的
LSTMCellSimple 和
LayerNormalizedLSTMCellSimple RNN 实现的几个示例。
有关更多信息,请查看我们的 RNN 转换
文档。
注意:我们正在努力为 TensorFlow Lite 的 LSTM 操作添加量化支持。这将在将来公布。
将转换扩展到其他复合操作
我们扩展了
TensorFlow Lite 转换器 以允许将其他复合 TensorFlow 操作转换为现有的或自定义的 TensorFlow Lite 操作。
要实现 TensorFlow 操作融合到 TensorFlow Lite,需要执行以下步骤
- 将复合操作包装在 tf.function 中。在 TensorFlow 模型源代码中,识别并提取复合操作为带有 experimental_implements 函数注释的 tf.function。
- 编写转换代码。从概念上讲,转换代码将此接口的复合实现替换为融合实现。在准备复合函数传递中,插入您的 转换代码。
- 调用 TensorFlow Lite 转换器。使用 TFLiteConverter.from_saved_model API 转换为 TensorFlow Lite。
有关此基础设施的总体架构,请参见
此处。有关带代码示例的详细步骤,请参见
此处。要了解操作融合在幕后的工作原理,请参见详细的
文档。
反馈
请发送电子邮件至
[email protected] 或创建一个带有“TFLiteConverter”组件标签的
GitHub 问题。
致谢
这项工作离不开自项目启动以来一直是主要合作者的 Renjie Liu 的努力。我们要感谢 Raziel Alvarez 的领导和指导。我们要感谢 Jaesung Chung、Scott Zhu、Sean Silva、Mark Sandler、Andrew Selle、Qiao Liang 和 River Riddle 的重要贡献。我们要感谢 Sarah Sirajuddin、Jared Duke、Lawrence Chan、Tim Davis 和 TensorFlow Lite 团队以及 Tatiana Shpeisman、Jacques Pienaar 和 Google MLIR 团队对这项工作的积极支持。