从Deeplab到TensorRT的转换

时间:2019-01-30 13:17:15

标签: tensorflow deep-learning semantic-segmentation tensorrt deeplab

将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)

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

  1. 您的硬件(GPU)是否支持INT8? 在我的情况下,Jetson nano不支持INT8(图形已转换,但推理花费了更长的时间)。在研究期间,我发现GPU应该具有FP16 / FP32张量内核以按预期运行模型。请参阅here

  2. 是否检查您的张量流模型以获取不支持的INT8 / FP16 / FP32精度运算 对于deeplabv3 +,在FP16和FP32优化图的情况下,我获得类似的性能(时间和IoU)。对于INT8,校准失败。请参阅here 有关检查支持的操作的信息,请参见here