Конвертация 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)
Любые идеи, как я должен выполнить преобразование должным образом, чтобы ускорить вывод?
1 ответ
Исходя из моего опыта с попыткой конвертировать модель с глубоким слоем с использованием trt, режим int8 работает не очень хорошо, так как в этой модели есть много неподдерживаемых операций, поэтому граф разбивается на множество маленьких подграфов, и только подмножество их превращается в трт. я был в состоянии преобразовать должным образом и ускорить вывод как-то в режиме fp16.
ps если вы все еще хотите использовать int8, вам не обязательно нужны файлы калибровки, просто некоторые входные изображения, на которых вы можете запустить свою модель для калибровки.
Учитывая, что вы установили режим точности на INT8, я думаю, что вы используете алгоритм калибровки вместо логического вывода. Алгоритм калибровки намного медленнее, чем логический вывод, потому что он собирает статистику и устанавливает диапазоны квантования.
После звонка create_inference_graph
, вам нужно будет позвонить calib_graph_to_infer_graph
,
Смотрите это для примера: https://github.com/tensorflow/tensorrt/blob/master/tftrt/examples/image-classification/image_classification.py
Я преобразовал свою модель deeplabv3+ в оптимизированный для TensorRT график pb, используя руководство разработчика TF-TRT. Я использую комплект разработчика Jetson Nano для запуска своих моделей. По своему опыту считаю, что вам нужно проверить следующее:
Поддерживает ли ваше оборудование (GPU) INT8? В моем случае Jetson nano не поддерживает INT8 (график был преобразован, но вывод занял больше времени) . Во время исследования я обнаружил, что графический процессор должен иметь тензорные ядра FP16/FP32, чтобы модели запускались должным образом. См здесь
Проверить вашу модель тензорного потока на предмет неподдерживаемых операций для точности INT8/FP16/FP32? Для deeplabv3+ я получаю аналогичную производительность (время и IoU) в случае графиков, оптимизированных для FP16 и FP32. Для INT8 калибровка не выполняется. См. Здесь Для проверки поддерживаемых операций см. Здесь