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

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

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


person Pedram    schedule 30.01.2019    source источник


Ответы (3)


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

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

person iariav    schedule 18.04.2019
comment
Подскажите, пожалуйста, как правильно конвертировать и ускорить вывод. Я также преобразовал grapf в tftrt в режиме fp16, но он дает точно такую ​​же производительность. - person sahil makandar; 30.10.2020

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

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

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

person Pooya Davoodi    schedule 03.02.2019
comment
Большое спасибо за вашу помощь, но мне также нужны файлы калибровки для этой цели. Вы знаете, как я могу получить их для предтренировочной модели? - person Pedram; 19.02.2019

Я преобразовал свою модель deeplabv3 + в оптимизированный для TensorRT график pb, используя руководство разработчика TF-TRT. Я использую комплект разработчика Jetson Nano для запуска своих моделей. По своему опыту считаю, что вам нужно проверить следующее:

  1. Поддерживает ли ваше оборудование (GPU) INT8? В моем случае Jetson nano не поддерживает INT8 (график был преобразован, но вывод занял больше времени). В ходе исследования я обнаружил, что графический процессор должен иметь тензорные ядра FP16 / FP32, чтобы модели запускались должным образом. Обратитесь к здесь

  2. Проверить вашу модель тензорного потока на предмет неподдерживаемых операций для точности INT8 / FP16 / FP32? Для deeplabv3 + я получаю аналогичную производительность (время и IoU) в случае графиков, оптимизированных для FP16 и FP32. Для INT8 калибровка не выполняется. См. здесь для проверки поддерживаемых операций см. здесь

person aniket    schedule 24.01.2020