RUY:
在旧版本的tensorflow lite中,支持了不同的GEMM库来加速计算,比如Eigen和GEMMLOWP,其中对于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或者其他包会报一些错,把报错的包卸载,再重新安装一下就可以。
参考链接:
网友评论