Моя цель — запустить оптимизированный тензорный тензорный граф в приложении 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)]]
Еще один способ решить проблему с ошибкой «Не найдено: тип операции не зарегистрирован« 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
Для 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",
Как вы упомянули, это должно работать, когда вы добавляете //tensorflow/contrib/tensorrt:trt_engine_op_kernel
в список зависимостей. В настоящее время интеграция Tensorflow-TensorRT все еще продолжается и может работать хорошо только для API Python; для C ++ вам нужно позвонить ConvertGraphDefToTensorRT()
от tensorflow/contrib/tensorrt/convert/convert_graph.h
для преобразования.
Дайте знать, если у вас появятся вопросы.
Вот мои выводы (и какое-то решение) для этой проблемы (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
добавлять //tensorflow/contrib/tensorrt:trt_engine_op_kernel
как зависимость от соответствующего проекта BAZEL, который вы хотите построить
Загрузите библиотеку ops _trt_engine_op.so
в вашем коде с использованием C-API.