适用于Android的Tensorflow量化图

时间:2016-06-21 19:50:14

标签: android c++ tensorflow

我正在尝试将量化图加载到Android应用中。 我的BUILD文件包含

deps = ["//tensorflow/core:android_tensorflow_lib",
      "//tensorflow/contrib/quantization:cc_array_ops",
      "//tensorflow/contrib/quantization:cc_math_ops",
      "//tensorflow/contrib/quantization:cc_nn_ops",
      "//tensorflow/contrib/quantization/kernels:quantized_ops"]

额外的量化代表适用于独立的C ++构建。

由于GEMMLOWP中存在大量错误,我无法使用Bazel进行编译。在Android中包含gemmlowp和量化操作的正确方法是什么?

以下是一个示例错误:

external/gemmlowp/eight_bit_int_gemm/eight_bit_int_gemm.cc:125:13: error: 'int32_t' is not a member of 'std'
   MatrixMap<std::int32_t, ResultOrder> result(c, m, n, ldc);

这是在Ubuntu 16.04上使用Bazel 0.3.0。

这里有一个要点,它有两次连续尝试构建包的输出 - 第一次在highwayhash上失败,第二次在gemlowp上失败。 https://gist.github.com/ericdanz/81b799f2e0bbb3cc462aa3c90468c71b

最终让它在build文件中为gemmlowp和highwayhash自由添加“-std = c ++ 11”进行编译和运行,并将android框架替换为量化ops中的框架依赖项。它产生了相当不同的结果,并且运行速度慢了约4倍(26-3200ms对6-800 ms)。我会尝试做一些更深入的调查。

1 个答案:

答案 0 :(得分:0)

这对我有用 - 它基本上是上面Eric D的所有评论的组合,但我想把它放在一个地方,让遇到这个问题的新人:

quantized_ops中的deps添加到Android应用的BUILD文件中的libtensorflow_demo.so

deps = ["//tensorflow/core:android_tensorflow_lib",
        "//tensorflow/contrib/quantization/kernels:quantized_ops",]

在tensorflow / contrib / quantization / kernels / BUILD中修改deps的{​​{1}}:

quantized_ops

删除/注释tensorflow / contrib / quantization / ops / array_ops.cc,math_ops.cc和nn_ops.cc中的deps = [ "//tensorflow/contrib/quantization:cc_array_ops", "//tensorflow/contrib/quantization:cc_math_ops", "//tensorflow/contrib/quantization:cc_nn_ops", "//tensorflow/core:android_tensorflow_lib", #"//tensorflow/core", #"//tensorflow/core:framework", #"//tensorflow/core:lib", #"//tensorflow/core/kernels:concat_lib_hdrs", #"//tensorflow/core/kernels:conv_ops", #"//tensorflow/core/kernels:ops_util_hdrs", #"//tensorflow/core/kernels:pooling_ops_hdrs", #"//tensorflow/core/kernels:eigen_helpers", #"//tensorflow/core/kernels:ops_util", #"//tensorflow/core/kernels:pooling_ops", "//third_party/eigen3", "@gemmlowp//:eight_bit_int_gemm", ], 部分

修改tensorflow / contrib / quantization / BUILD中.Doc()depscc_array_ops的{​​{1}}:

cc_math_ops

使用cc_nn_ops标志为Android应用运行bazel build命令。