tensorflow lite RUY

RUY:

在旧版本的tensorflow lite中,支持了不同的GEMM库来加速计算,比如EigenGEMMLOWP,其中对于float32的模型调用的是Eigen库,对于8bit量化的模型会走GEMMLOWP库;这些库在 Arm 平台上性能表现较差,因此在tensorflow 2.3的版本引入了 Ruy 矩阵乘法库。

在Arm平台上Ruy 表现得更好,因此在对于 Arm 平台编译的时候默认的选项就是 Ruy,当然也可以加上编译选项使用 Eigen 和 Gemmlowp 库。对于一些其它平台,默认使用的可能还是GEMMLOWP,同样可以在编译的时候加上Ruy的选项。

#/tensorflow/lite/tools/make/Makefile#L186
BUILD_WITH_RUY ?= false
ifeq ($(TARGET_ARCH),aarch64)
    BUILD_WITH_RUY=true
endif
ifeq ($(BUILD_WITH_RUY),true)
  CXXFLAGS += -DTFLITE_WITH_RUY
endif

通过加上编译选项就可以使用Ruy库

  • 如果使用bazel编译: 添加如下的命令行参数到编译命令中
--define=tflite_with_ruy=true
  • 如果使用Makefile进行编译,将一下命令添加到CXXFLAGS中
 CXXFLAGS += -DTFLITE_WITH_RUY 

谷歌开源小型独立低精度通用矩阵乘法(General Matrix to Matrix Multiplication,GEMM)库 gemmlowp。即低精度矩阵乘法库, 所谓低精度LOWP,是指输入8位、相乘后输出8位,但中间运算过程会按32位计算,然后输出结果取32位的高8位,否则中间运算若直接按8位算则会溢出而损失精度,gemmlowp足够的灵活来支持多种低精度的案例,并且可以通过多种方式将含义附加到8bit值上,以便计算可以依赖gemmlowp提供的8bit gemm。

在进行模型推理的时候,也有一些第三方底层计算库,如XNNPACK ,它的性能甚至比 Ruy 更好,但它只专注于浮点操作,可以通过delegate来使用。

如果想在python的推理代码中使用ruy,需要通过源码安装tensorflow,使用ruy进行编译。

python环境源码安装tensorflow(RUY)

  • conda 创建一个新的python环境
  • 在python环境中安装一些tensorflow的编译依赖库
conda install numpy

pip install keras_preprocessing

  • 安装bazel
#如果系统环境中未配置的有bazel  可以使用conda安装bazel

conda install bazel
  • 下载tensorflow源代码进行编译
#tensorflow-2.5.3.zip

cd tensorflow-2.5.3

bazel build --config=opt  --define=tflite_with_ruy=true //tensorflow/tools/pip_package:build_pip_package   #会很慢


bazel-bin/tensorflow/tools/pip_package/build_pip_package ~/    #会生成一个tensorflow-2.5.3-cp39-cp39-linux_x86_64.whl文件
  • 使用pip安装
pip install tensorflow-2.5.3-cp39-cp39-linux_x86_64.whl

安装完成后就可以使用了,可能在使用的时候numpy或者其他包会报一些错,把报错的包卸载,再重新安装一下就可以。

参考链接:

https://github.com/tensorflow/tensorflow/issues/39812

你可能感兴趣的:(tensorflow lite RUY)