Бенчмаркинг квантования на Android

Я тестировал модели с тензорным потоком на Exynos 7420 с помощью benchmark_model. Я хотел бы ускорить тестирование квантования за Блог Пита Уордена но пока не удалось скомпилировать benchmark_model с глубинами квантования, поскольку они ломают множество вещей.

Я следовал рекомендациям, перечисленным в этом поток переполнения стека:

// tenorflow / tools / benchmark / BUILD cc_binary

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

// tensorflow / вно / квантования / ядра / BUILD:

deps = [
"//tensorflow/contrib/quantization:cc_array_ops",
"//tensorflow/contrib/quantization:cc_math_ops",
"//tensorflow/contrib/quantization:cc_nn_ops",
#"//tensorflow/core",
#"//tensorflow/core:framework",
#"//tensorflow/core:lib",
#"//tensorflow/core/kernels:concat_lib_hdrs",
#"//tensorflow/core/kernels:conv_ops",
#"//tensorflow/core/kernels:eigen_helpers",
#"//tensorflow/core/kernels:ops_util",
#"//tensorflow/core/kernels:pooling_ops",
"//third_party/eigen3",
"@gemmlowp//:eight_bit_int_gemm",
],

Затем запустите:

bazel build -c opt —cxxopt = ‘- std = gnu ++ 11’ — crosstool_top = // внешний: android / crosstool —cpu = armeabi-v7a —host_crosstool_top = @ bazel_tools // tools / cpp: toolchain тензор потока / tools / benchmark: benchmark_model —verbose_failures

Который (следуя всем другим инструкциям в связанном посте) успешен, за исключением того, что он не может связать с pthread.

Я попытался удалить -lpthread в тензорном потоке / tenorflow.bzl tfcopts (), а также аналогично в тензорном потоке / tools / proto_text / BUILD и тензор потока / cc / BUILD.

def tf_copts():
return (["-fno-exceptions", "-DEIGEN_AVOID_STL_ARRAY"] +
if_cuda(["-DGOOGLE_CUDA=1"]) +
if_android_arm(["-mfpu=neon"]) +
select({"//tensorflow:android": [
"-std=c++11",
"-DMIN_LOG_LEVEL=0",
"-DTF_LEAN_BINARY",
"-O2",
],
"//tensorflow:darwin": [],
"//tensorflow:ios": ["-std=c++11",],
#"//conditions:default": ["-lpthread"]}))
"//conditions:default": []}))

Все еще получаю ошибку ссылки.

external/androidndk/ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.9/../../../../arm-linux-androideabi/bin/ld: error: cannot find -lpthread
collect2: error: ld returned 1 exit status

Любая помощь высоко ценится, я застрял.

Env:

  • Убунту 14.04
  • Тензорный поток # 4462
  • android_ndk_r11c
  • Android-SDK-Linux R24.4.1
  • Python 2.7.12 :: Continuum Analytics, Inc.
  • ./ настроить без поддержки GCP, HDFS или GPU

1

Решение

Конвертирующий GitHub ответ от Эндрю Арфы в команде TF. Спасибо!!!

Все вышеперечисленные изменения были ненужными. Вы можете заставить квантование работать для benchmark_model (или любой цели, зависящей от android_tensorflow_lib) с помощью следующего:

  1. git pull —recurse-submodules (чтобы получить библиотеки @gemmlowp, также можно использовать git clone —recursive)
  2. Следующее редактирование в // tenorflow / core / BUILD

`

diff --git a/tensorflow/core/BUILD b/tensorflow/core/BUILD
--- a/tensorflow/core/BUILD
+++ b/tensorflow/core/BUILD
@@ -713,8 +713,11 @@ cc_library(
# binary size (by packaging a reduced operator set) is a concern.
cc_library(
name = "android_tensorflow_lib",
-    srcs = if_android([":android_op_registrations_and_gradients"]),
-    copts = tf_copts(),
+    srcs = if_android([":android_op_registrations_and_gradients",
+                       "//tensorflow/contrib/quantization:android_ops",
+                       "//tensorflow/contrib/quantization/kernels:android_ops",
+                       "@gemmlowp//:eight_bit_int_gemm_sources"]),
+    copts = tf_copts() + ["-Iexternal/gemmlowp"],
linkopts = ["-lz"],
tags = [
"manual",

Только что проверил, отлично работает. Интересно, что квантование дает графики 1/4 размера, но выполнение вывода в 4-5 раз медленнее, чем неквантованных графов — кажется, что квантованные операции все еще оптимизируются.

2

Другие решения

Других решений пока нет …