我的目标是在 C++ 应用程序中运行经过tensorrt优化的 tensorflow 图。我正在使用tensorflow 1.8和tensorrt 4。使用python api,我能够优化图形并看到性能的良好提升。
尝试在 C++ 中运行该图失败,并出现以下错误:
未找到:操作类型未在 e15ff5301262 上运行的二进制文件中注册“TRTEngineOp”。确保 Op 和 Kernel 已在此进程中运行的二进制文件中注册。
其他非张量图也可以。我在使用 python api 时遇到了类似的错误,但通过导入tensorflow.contrib.tensorrt 解决了它。从错误中我相当确定内核和操作没有注册,但我不知道在构建 tensorflow 后如何在应用程序中注册。附带说明一下,我不能使用 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)]]
最佳答案
另一种解决 Tensorflow 1.8 上出现“未找到:Op 类型未注册‘TRTEngineOp’”错误问题的方法:
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:无需使用 TF_LoadLibrary 加载库_trt_engine_op.so
关于带有 TensorRT 的 C++ Tensorflow API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50125889/