Я пытаюсь загрузить квантованный график в приложение для 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 ++.
Я не могу скомпилировать с Bazel из-за большого количества ошибок в GEMMLOWP. Как правильно включить gemmlowp и операции квантования в Android?
Вот пример ошибки:
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.
Вот суть, которая дает результаты двух последовательных попыток собрать пакет — он завершается неудачно при хешировании в первый раз и gemmlowp во второй.
https://gist.github.com/ericdanz/81b799f2e0bbb3cc462aa3c90468c71b
В конечном итоге он был скомпилирован и запущен с либеральным добавлением «-std = c ++ 11» в файлах BUILD для gemmlowp и highwayhash и заменой платформы Android на зависимости платформы в квантованных операциях. Тем не менее, он дает довольно разные результаты и работает примерно в 4 раза медленнее (26–3200 мс против 6–800 мс). Я постараюсь сделать немного более глубокое расследование.
Вот что сработало для меня — это в основном комбинация всех комментариев Эрика Д. выше, но я хотел поместить все это в одном месте для кого-то нового, кто сталкивается с этой проблемой:
добавлять quantized_ops
в deps
в libtensorflow_demo.so
в файле BUILD для приложения Android:
deps = ["//tensorflow/core:android_tensorflow_lib",
"//tensorflow/contrib/quantization/kernels:quantized_ops",]
Изменить deps
за quantized_ops
в тензорном потоке / contrib / квантовании / ядрах / BUILD:
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",
],
Удалить / закомментировать .Doc()
части в тензорном потоке / contrib / quanization / ops / array_ops.cc, math_ops.cc и nn_ops.cc
Изменить deps
за cc_array_ops
, cc_math_ops
а также cc_nn_ops
в тензорном потоке / вклад / квантование / СТРОИТЬ:
deps = [
#"//tensorflow/core:framework",
"//tensorflow/core:android_tensorflow_lib",
],
Запустите команду bazel build для приложения Android с --cxxopt="-std=c++11"
флаг.
Других решений пока нет …