TensorRT 和 TensorFlow 2

Posted

技术标签:

【中文标题】TensorRT 和 TensorFlow 2【英文标题】:TensorRT and Tensorflow 2 【发布时间】:2019-07-19 17:47:13 【问题描述】:

我正在尝试使用 TensorRT 加速 yolov3 TF2 的推理。 我在tensorflow 2中使用TrtGraphConverter函数。

我的代码基本上是这样的:

from tensorflow.python.compiler.tensorrt import trt_convert as trt

tf.keras.backend.set_learning_phase(0)
converter = trt.TrtGraphConverter(
    input_saved_model_dir="./tmp/yolosaved/",
    precision_mode="FP16",
    is_dynamic_op=True)
converter.convert()


saved_model_dir_trt = "./tmp/yolov3.trt"
converter.save(saved_model_dir_trt)

这会产生以下错误:

Traceback (most recent call last):
  File "/home/pierre/Programs/anaconda3/envs/Deep2/lib/python3.6/site-packages/tensorflow/python/framework/importer.py", line 427, in import_graph_def
    graph._c_graph, serialized, options)  # pylint: disable=protected-access
tensorflow.python.framework.errors_impl.InvalidArgumentError: Input 1 of node StatefulPartitionedCall was passed float from conv2d/kernel:0 incompatible with expected resource.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/pierre/Documents/GitHub/yolov3-tf2/tensorrt.py", line 23, in <module>
    converter.save(saved_model_dir_trt)
  File "/home/pierre/Programs/anaconda3/envs/Deep2/lib/python3.6/site-packages/tensorflow/python/compiler/tensorrt/trt_convert.py", line 822, in save
    super(TrtGraphConverter, self).save(output_saved_model_dir)
  File "/home/pierre/Programs/anaconda3/envs/Deep2/lib/python3.6/site-packages/tensorflow/python/compiler/tensorrt/trt_convert.py", line 432, in save
    importer.import_graph_def(self._converted_graph_def, name="")
  File "/home/pierre/Programs/anaconda3/envs/Deep2/lib/python3.6/site-packages/tensorflow/python/util/deprecation.py", line 507, in new_func
    return func(*args, **kwargs)
  File "/home/pierre/Programs/anaconda3/envs/Deep2/lib/python3.6/site-packages/tensorflow/python/framework/importer.py", line 431, in import_graph_def
    raise ValueError(str(e))
ValueError: Input 1 of node StatefulPartitionedCall was passed float from conv2d/kernel:0 incompatible with expected resource.

这是否意味着我的某些节点无法转换?在这种情况下,为什么我的代码在 .save 步骤中会出错?

【问题讨论】:

我找到了一个 GitHub issue,你说它适用于你的夜间版本的 TF。您能否将软件包的确切版本和使其工作所需的其他步骤(如果有)作为答案发布?这对我很有帮助,因为我遇到了同样的问题,并且可能对从 Google 来到这里的其他人有帮助。 试试precision_mode="FP32" 【参考方案1】:

我最终用以下代码解决了这个问题。我也从 tf 2.0.-beta0 切换到 tf-nightly-gpu-2.0-preview

params = trt.DEFAULT_TRT_CONVERSION_PARAMS._replace(
    precision_mode='FP16',
    is_dynamic_op=True)
    
converter = trt.TrtGraphConverterV2(
    input_saved_model_dir=saved_model_dir,
    conversion_params=params)
converter.convert()
saved_model_dir_trt = "/tmp/model.trt"
converter.save(saved_model_dir_trt)

感谢您的帮助

【讨论】:

谢谢!您能否使用您使用的 TensorFlow 版本更新答案,因为在 this issue 中您说您使用了 2.0.0-beta0 并切换到 tf-nightly-gpu-2.0-preview 有助于解决此问题。 使用的是什么 TensortRT 版本? 这个转换器和你的转换器有什么区别?从 tensorflow.contrib.tensorrt 作为 trt trt_graph = trt.create_inference_graph( input_graph_def = freeze_graph_def, outputs = output_node_name, max_batch_size=batch_size, max_workspace_size_bytes=workspace_size,precision_mode=precision, minimum_segment_size=3) 完成转换需要多长时间?【参考方案2】:

当您使用 TensorRT 时,请记住您的模型架构中可能存在不受支持的层。有TensorRT support matrix 供您参考。 YOLO 包含许多未实现的自定义层,例如“yolo 层”。

所以,如果你想将 YOLO 转换为 TensorRT 优化模型,你需要从替代方式中进行选择。

    试试TF-TRT,它会优化并执行兼容的子图,让 TensorFlow 执行剩余的图。虽然您仍然可以使用 TensorFlow 广泛而灵活的功能集,但 TensorRT 将解析模型并尽可能将优化应用于图形的各个部分。 使用插件 API 实现您的 custom layers,例如 this 示例。

【讨论】:

我不明白你的意思。那么,在这两种情况下,TF-TRT 和 TensorRT 两种方法都将优化应用于子图,对吧?如果是这样,两种方法有什么区别? @DeeeepNet 使用 TensorRT 转换整个模型意味着它会尝试转换所有层/操作。这意味着如果 TensorRT 不支持该层/操作,它将失败。您可以为那些实现自定义层以使其工作。或者,使用 TF-TRT,优化器只转换与 TensorRT 兼容的层,并使用 Tensorflow 运行其他层。【参考方案3】:

可能有点远,但您使用的是哪个 gpu?我知道 precision_mode="FP16" 仅在某些架构中受支持,例如 Pascal(tx2 系列)和 Turing(~2080 系列)。使用 fp16 从 TF2 移植到 trt 取得了不错的效果。

【讨论】:

【参考方案4】:

有点晚了,但我现在正在使用基于 Keras 的 YoloV4 执行此操作。我已设法将其转换为 TRT,但您如何使用转换后的模型从中推断?我用过:

saved_model_loaded = tf.saved_model.load(input_saved_model, tags=[tag_constants.SERVING])
signature_keys = list(saved_model_loaded.signatures.keys())
print(signature_keys)

infer = saved_model_loaded.signatures['serving_default']
print(infer.structured_outputs)

根据 NVIDIA 的 colab,但它不适用于 infer(X)。

【讨论】:

以上是关于TensorRT 和 TensorFlow 2的主要内容,如果未能解决你的问题,请参考以下文章

带有 TensorRT 的 C++ Tensorflow API

TensorRT 与 TensorFlow 1.7 集成

无法在 tensorflow r1.14 中导入“tensorflow.contrib.tensorrt”

TensorFlow:使用 Python 确定 tensorRT 功耗

转换后的 Tensorrt 模型与 Tensorflow 模型的输出形状不同?

使用 NVIDIA TensorRT 推理引擎运行 TensorFlow