如何仅使用所需的运算符来减少TensorFlow Lite二进制大小

时间:2018-05-21 07:20:07

标签: tensorflow tensorflow-lite

TensorFlow Lite二进制文件大小约为900KB,对我来说仍然很大。我想知道如何只使用支持模型所需的运算符来缩小尺寸?

1 个答案:

答案 0 :(得分:1)

Tensorflow Lite

如果您使用的是Tensorflow Lite,the only solution I have found将在Interpreter级别工作并自定义内核库(OpResolver)。我不认为有这样做的自动方式,the available only example (here the header)并不是那么容易理解恕我直言。我认为下一版本中将包含有关此主题的更多改进。另外,我不确定这会减少最终库的大小。在API说明中,此方法被认为等同于选择性注册,这在Tensorflow Mobile的答案的下一部分中进行了解释。

Tensorflow Mobile

作为问题的答案"我如何只启用我的模型"使用的操作,答案在Tensorflow Mobile Documentation(在二进制大小子部分)。

Tensorflow Mobile的通常大小似乎是12MB,但可以通过仅包含模型所需的操作来减少它。显然,这需要使用Bazel将Tensorflow Lite构建为框架。

您可以使用ops_to_register.h工具here创建所需操作的标头(print_selective_registration_header.py)。生成的标头应放在Tensorflow源目录的根目录中。 您现在已准备好编译库,将SELECTIVE_REGISTRATION定义传递给编译器(使用Bazel构建,您应该添加选项:--copts=”-DSELECTIVE_REGISTRATION”)。

我认为这个程序会为库提供最少的操作。其他一些编译器优化标志可能会帮助您确定大小(有时会影响性能)。

编译选项

我实际上并不知道你是如何编译你的代码(静态库或动态库),这是你在性能方面的需求,以及Tensorflow bazelfile中的默认选项,但你可以试试:< / p>

  • 将优化级别降低到-O1-Os(有时会对二进制文件大小有所帮助,我认为Tensorflow的默认值为框架-O2-O3单个内核,虽然我不知道Lite版本。
  • 使用标记-fdata-section--gc-sections:引用gcc文档:&#34; [-fdata-sections]与链接器垃圾收集(链接器--gc-sections一起使用选项)这些选项可能会导致较小的静态链接可执行文件(剥离后)。&#34; (似乎linker options for Raspberry Pi
  • 中至少使用--gc-sections
  • -fvisibility-inlines-hidden应该影响内联函数的性能,但会减小共享对象的导出表的大小。此选项可能打破库。可以阅读一些解释here
  • 更危险的是-fvisibility=hidden。看看它here