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
无法在 tensorflow r1.14 中导入“tensorflow.contrib.tensorrt”
TensorFlow:使用 Python 确定 tensorRT 功耗