0

将 Deeplab Tensorflow 模型转换为 TensorRT 模型会显着增加推理时间,我在代码中做错了什么?

在这里,我正在将 Tensorflow 图转换为 TensorRT 图并保存这个新的 TRT 模型:

OUTPUT_NAME = ["SemanticPredictions"]

# read Tensorflow frozen graph
with gfile.FastGFile('/frozen_inference_graph.pb', 'rb') as tf_model:
   tf_graphf = tensorflow.GraphDef()
   tf_graphf.ParseFromString(tf_model.read())

# convert (optimize) frozen model to TensorRT model
trt_graph = trt.create_inference_graph(input_graph_def=tf_graphf, outputs=OUTPUT_NAME, max_batch_size=2, max_workspace_size_bytes=2 * (10 ** 9), precision_mode="INT8")

# write the TensorRT model to be used later for inference
with gfile.FastGFile("TensorRT_model.pb", 'wb') as f:
   f.write(trt_graph.SerializeToString())
print("TensorRT model is successfully stored!")

在另一个脚本中,我再次加载这个 TRT 模型并用它进行语义分割预测,但它慢了大约 7 到 8 倍!这是第二个脚本:

with tensorflow.Session(config=tensorflow.ConfigProto(gpu_options=tensorflow.GPUOptions(per_process_gpu_memory_fraction=0.50))) as sess:
   img_array = cv2.imread('test.png',1)

   # read TensorRT frozen graph
   with gfile.FastGFile('TensorRT_model.pb', 'rb') as trt_model:
      trt_graph = tensorflow.GraphDef()
      trt_graph.ParseFromString(trt_model.read())

   # obtain the corresponding input-output tensor
   tensorflow.import_graph_def(trt_graph, name='')
   input = sess.graph.get_tensor_by_name('ImageTensor:0')
   output = sess.graph.get_tensor_by_name('SemanticPredictions:0')

   # perform inference
   batch_seg_map = sess.run(output, feed_dict={input: [img_array]})
   seg_map = batch_seg_map[0]
   seg_img = label_to_color_image(seg_map).astype(np.uint8)

任何想法我应该如何以加快推理的方式正确执行转换?

4

3 回答 3

2

根据我尝试使用 trt 转换 deeplab 模型的经验,int8 模式表现不佳,因为该模型中有许多不受支持的操作,因此该图被“分解”为许多小的子图,其中只有一个子集是正在转换为trt。我能够以某种方式在 fp16 模式下正确转换并加快推理速度。

ps 如果您仍然想使用 int8,则不一定需要校准文件,只需一些输入图像即可运行模型进行校准。

于 2019-04-18T11:34:31.793 回答
1

鉴于您将精度模式设置为 INT8,我认为您正在运行校准算法而不是推理。校准算法比推理慢得多,因为它收集统计数据并设置量化范围。

打电话后create_inference_graph,你需要打电话calib_graph_to_infer_graph

请参阅此示例:https ://github.com/tensorflow/tensorrt/blob/master/tftrt/examples/image-classification/image_classification.py#L500

于 2019-02-03T05:10:44.110 回答
0

我已使用 TF-TRT 开发人员指南将我的 deeplabv3+ 模型转换为 TensorRT 优化的 pb 图。我正在使用 Jetson Nano 开发工具包来运行我的模型。以我的经验,我认为您需要检查以下内容:

  1. 您的硬件 (GPU) 是否支持 INT8?就我而言,Jetson nano 不支持 INT8(图表已转换,但推理时间更长)。在研究过程中,我发现 GPU 应该具有 FP16/FP32 张量核心才能按预期运行模型。参考这里

  2. 检查您的 tensorflow 模型以获取 INT8/FP16/FP32 精度的不受支持的操作?对于 deeplabv3+,在 FP16 和 FP32 优化图的情况下,我得到了相似的性能(时间和 IoU)。对于 INT8,校准失败。参考这里 检查支持的操作参考这里

于 2020-01-24T10:29:17.237 回答