带有 TensorRT 的 C++ Tensorflow API

标签 c++ tensorflow tensorrt

我的目标是在 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.solibtensorflow_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/

相关文章:

c++ - 使用 iomanip 自动间距

c++ - 为什么我得到输出 'b(1) dc dvfunc' ?

c++ - 如何在C++上安全地访问 vector ?

python - 在运行 fit_generator 时,可以在training_data_generator 中运行 "With tf.Session as sess:"吗?

python - 从 .pb 文件加载经过 TensorRT 优化的 TensorFlow 图的时间非常长(超过 10 分钟)

curl - 无法通过身份验证使用 wget 或 curl 下载

c++ - 在 Qt 中获取父布局

python-3.x - Tensorflow 命令 tf.test.is_gpu_available() 返回 False

c++ - 来自tensorrt的 "nvinfer.h"位于哪里?

android - 在移动设备上运行递归神经网络(推理)的最快方法