API C ++ Tensorflow с TensorRT - PullRequest
       27

API C ++ Tensorflow с TensorRT

0 голосов
/ 02 мая 2018

Моя цель - запустить оптимизированный тензорный тензорный граф в приложении C ++. Я использую TensorFlow 1.8 с TENSORRT 4. Используя API Python, я могу оптимизировать график и вижу хорошее повышение производительности.

Попытка запустить граф в c ++ завершается неудачно со следующей ошибкой:

Not found: Op type not registered 'TRTEngineOp' in binary running on e15ff5301262. Make sure the Op and Kernel are registered in the binary running in this process.

Другие, не тензорные графы работают. У меня была похожая ошибка с API-интерфейсом Python, но она была решена путем импорта tenorflow.contrib.tensorrt. Исходя из ошибки, я уверен, что ядро ​​и операционная система не зарегистрированы, но я не знаю, как это сделать в приложении после того, как тензор потока был построен. С другой стороны, я не могу использовать bazel, но я обязан использовать cmake. Пока я связываюсь с libtensorflow_cc.so и libtensorflow_framework.so.

Может кто-нибудь помочь мне здесь? спасибо!

Обновление: Использование c или c ++ api для загрузки _trt_engine_op.so не выдает ошибку при загрузке, но не запускается с

Invalid argument: No OpKernel was registered to support Op 'TRTEngineOp' with these attrs.  Registered devices: [CPU,GPU], Registered kernels:
  <no registered kernels>

     [[Node: my_trt_op3 = TRTEngineOp[InT=[DT_FLOAT, DT_FLOAT], OutT=[DT_FLOAT, DT_FLOAT, DT_FLOAT, DT_FLOAT], input_nodes=["tower_0/down_0/conv_0/Conv2D-0-TransposeNHWCToNCHW-LayoutOptimizer", "tower_0/down_0/conv_skip/Conv2D-0-TransposeNHWCToNCHW-LayoutOptimizer"], output_nodes=["tower_0/down_0/conv_skip/Relu", "tower_0/down_1/conv_skip/Relu", "tower_0/down_2/conv_skip/Relu", "tower_0/down_3/conv_skip/Relu"], serialized_engine="\220{I\000...00\000\000"](tower_0/down_0/conv_0/Conv2D-0-TransposeNHWCToNCHW-LayoutOptimizer, tower_0/down_0/conv_skip/Conv2D-0-TransposeNHWCToNCHW-LayoutOptimizer)]]

Ответы [ 4 ]

0 голосов
/ 08 июля 2018

Для Tensorflow r1.8 у меня работали дополнения, показанные ниже в двух файлах BUILD и сборке libtensorflow_cc.so с монолитной опцией.

diff --git a/tensorflow/BUILD b/tensorflow/BUILD
index cfafffd..fb8eb31 100644
--- a/tensorflow/BUILD
+++ b/tensorflow/BUILD
@@ -525,6 +525,8 @@ tf_cc_shared_object(
         "//tensorflow/cc:scope",
         "//tensorflow/cc/profiler",
         "//tensorflow/core:tensorflow",
+        "//tensorflow/contrib/tensorrt:trt_conversion",
+        "//tensorflow/contrib/tensorrt:trt_engine_op_kernel",
     ],
 )

diff --git a/tensorflow/contrib/tensorrt/BUILD b/tensorflow/contrib/tensorrt/BUILD
index fd3582e..a6566b9 100644
--- a/tensorflow/contrib/tensorrt/BUILD
+++ b/tensorflow/contrib/tensorrt/BUILD
@@ -76,6 +76,8 @@ cc_library(
     srcs = [
         "kernels/trt_calib_op.cc",
         "kernels/trt_engine_op.cc",
+        "ops/trt_calib_op.cc",
+        "ops/trt_engine_op.cc",
     ],
     hdrs = [
         "kernels/trt_calib_op.h",
@@ -86,6 +88,7 @@ cc_library(
     deps = [
         ":trt_logging",
         ":trt_resources",
+        ":trt_shape_function",
         "//tensorflow/core:gpu_headers_lib",
         "//tensorflow/core:lib_proto_parsing",
         "//tensorflow/core:stream_executor_headers_lib",
0 голосов
/ 21 мая 2018

Вот мои выводы (и какое-то решение) для этой проблемы (Tensorflow 1.8.0, TensorRT 3.0.4):

Я хотел включить поддержку tenorrt в библиотеку, которая загружает график из данного файла *.pb.

Просто добавление //tensorflow/contrib/tensorrt:trt_engine_op_kernel в мой файл Bazel BUILD не помогло мне. Я все еще получил сообщение о том, что Ops где не зарегистрирован:

2018-05-21 12:22:07.286665: E tensorflow/core/framework/op_kernel.cc:1242] OpKernel ('op: "TRTCalibOp" device_type: "GPU"') for unknown op: TRTCalibOp
2018-05-21 12:22:07.286856: E tensorflow/core/framework/op_kernel.cc:1242] OpKernel ('op: "TRTEngineOp" device_type: "GPU"') for unknown op: TRTEngineOp
2018-05-21 12:22:07.296024: E tensorflow/examples/tf_inference_lib/cTfInference.cpp:56] Not found: Op type not registered 'TRTEngineOp' in binary running on ***. 
Make sure the Op and Kernel are registered in the binary running in this process.

Решение состояло в том, что мне пришлось загрузить библиотеку Ops (tf_custom_op_library) в моем коде C ++ с использованием C_API:

#include "tensorflow/c/c_api.h"
...
TF_Status status = TF_NewStatus();
TF_LoadLibrary("_trt_engine_op.so", status);

Общий объект _trt_engine_op.so создан для цели Bazel //tensorflow/contrib/tensorrt:python/ops/_trt_engine_op.so:

bazel build --config=opt --config=cuda --config=monolithic \
     //tensorflow/contrib/tensorrt:python/ops/_trt_engine_op.so

Теперь мне нужно только убедиться, что _trt_engine_op.so доступен, когда это необходимо, например, LD_LIBRARY_PATH.

Если у кого-то есть идея, как сделать это более изящным способом (почему у нас есть 2 артефакта, которые нужно построить? Разве у нас не может быть одного?), Я рад каждому предложению.

tldr

  1. добавьте //tensorflow/contrib/tensorrt:trt_engine_op_kernel в качестве зависимости от соответствующего проекта BAZEL, который вы хотите построить

  2. Загрузите библиотеку ops _trt_engine_op.so в свой код с помощью C-API.

0 голосов
/ 22 мая 2018

Другой способ решения проблемы с ошибкой «Не найдено: тип операции не зарегистрирован« TRTEngineOp »» в Tensorflow 1.8:

1) В файл tensorflow/contrib/tensorrt/BUILD добавить новый раздел следующего содержания:

cc_library(
name = "trt_engine_op_kernel_cc",
srcs = [
    "kernels/trt_calib_op.cc",
    "kernels/trt_engine_op.cc",
    "ops/trt_calib_op.cc",
    "ops/trt_engine_op.cc",
    "shape_fn/trt_shfn.cc",
],
hdrs = [
    "kernels/trt_calib_op.h",
    "kernels/trt_engine_op.h",
    "shape_fn/trt_shfn.h",
],
copts = tf_copts(),
visibility = ["//visibility:public"],
deps = [
    ":trt_logging",
    ":trt_plugins",
    ":trt_resources",
    "//tensorflow/core:gpu_headers_lib",
    "//tensorflow/core:lib_proto_parsing",
    "//tensorflow/core:stream_executor_headers_lib",
] + if_tensorrt([
    "@local_config_tensorrt//:nv_infer",
]) + tf_custom_op_library_additional_deps(),
alwayslink = 1,  # buildozer: disable=alwayslink-with-hdrs
)

2) Добавьте //tensorflow/contrib/tensorrt:trt_engine_op_kernel_cc в качестве зависимости к соответствующему проекту BAZEL, который вы хотите построить

PS: нет необходимости загружать библиотеку _trt_engine_op.so с TF_LoadLibrary

0 голосов
/ 10 мая 2018

Как вы упомянули, это должно работать, когда вы добавляете //tensorflow/contrib/tensorrt:trt_engine_op_kernel в список зависимостей. В настоящее время интеграция Tensorflow-TensorRT все еще продолжается и может работать хорошо только для API Python; для C ++ вам нужно вызвать ConvertGraphDefToTensorRT() из tensorflow/contrib/tensorrt/convert/convert_graph.h для преобразования.

Дайте мне знать, если у вас есть какие-либо вопросы.

...