API C ++ Tensorflow с TensorRT

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

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

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,

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

Обновить:
Использование API C или C ++ для загрузки _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)]]

1

Решение

Еще один способ решить проблему с ошибкой «Не найдено: тип операции не зарегистрирован« 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

1

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

Для 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",
1

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

Дайте знать, если у вас появятся вопросы.

0

Вот мои выводы (и какое-то решение) для этой проблемы (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
По вопросам рекламы [email protected]