Конвертация Deeplab в TensorRT - PullRequest
       31

Конвертация Deeplab в TensorRT

0 голосов
/ 30 января 2019

Преобразование модели 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)

Есть идеи, как правильно выполнить преобразование таким образом, чтобы ускорить вывод?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

из моего опыта с попыткой конвертировать модель с глубоким слоем, используя trt, режим int8 работает не очень хорошо, так как в этой модели много неподдерживаемых операций, поэтому граф разбивается на множество маленьких подграфов и только подмножествоиз них переводится в трт.я смог правильно конвертировать и ускорить вывод как-то в режиме fp16.

ps, если вы все еще хотите использовать int8, вам не обязательно нужны файлы калибровки, только некоторые входные изображения, на которых вы можете запустить свою модельдля калибровки.

0 голосов
/ 03 февраля 2019

Учитывая, что вы установили режим точности на INT8, я думаю, что вы используете алгоритм калибровки вместо логического вывода.Алгоритм калибровки намного медленнее, чем логический вывод, потому что он собирает статистику и устанавливает диапазоны квантования.

После вызова create_inference_graph вам нужно будет позвонить calib_graph_to_infer_graph.

См. Пример: https://github.com/tensorflow/tensorrt/blob/master/tftrt/examples/image-classification/image_classification.py#L500

...