tensorflow/tensorrt

Calibration Fails with (Assertion mIndex >= 0 failed.symbol is not concrete)

lukqw opened this issue · 0 comments

lukqw commented

Description

I am currently trying to 8-bit integer quantize my tensorflow 2.3 SavedModel(s) via TensorRT.
Model in case is a custom yolov3-tiny relu model, which I have successfully split into two separate models with working inference.

When running the below code snippet for both the full yolov3-tiny relu model (yolo_relu) and the first part of yolov3-tiny relu (head_relu) model I am successful in generating a 8bit quantized version with TensorRT.

But, when running quantization for the second part of the yolov3-tiny relu model (tail_relu), I am receiving the error further down below. Please note that I am aware that the second part of my model (tail_relu) has a different input shape of (None,26,26,256) which I have accounted for with a separate calibration_input_tail method.

This is the code I am using:

from tensorflow.python.compiler.tensorrt import trt_convert as trt

import os
import cv2
import tensorflow as tf

#calibration function for second half of model which has input shape of 1,26,26,256
def calibration_input_tail():
    for x in range(500):
        yield [tf.random.normal((1, 26, 26, 256))]

def calibration_input():
    for x in range(500):
        yield [tf.random.normal((1, 416, 416, 3))]


def quantize_model(name):
    conv_params = trt.DEFAULT_TRT_CONVERSION_PARAMS._replace(
            precision_mode=trt.TrtPrecisionMode.INT8,
            max_workspace_size_bytes=4000000000,
            use_calibration=True)

    converter = trt.TrtGraphConverterV2(input_saved_model_dir=f'model_data/SavedModel/{name}_model', conversion_params=conv_params)


    if name == 'tail_relu':
        cali_input = calibration_input_tail
    else:
        cali_input = calibration_input

    converter.convert(calibration_input_fn=cali_input)


    converter.save(f'quantized_{name}_model')

#successful
#quantize_model("yolo_relu")
#successful
#quantize_model("head_relu")

#unsuccessful
quantize_model("tail_relu")

This is the error I am getting

2021-11-22 10:40:30.120420: E tensorflow/compiler/tf2tensorrt/utils/trt_logger.cc:42] DefaultLogger 2: [graph.cpp::getDefinition::336] Error Code 2: Internal Error (Assertion mIndex >= 0 failed.symbol is not concrete)
2021-11-22 10:40:30.257167: E tensorflow/compiler/tf2tensorrt/kernels/trt_engine_op.cc:1185] Calibration failed: Internal: Failed to build TensorRT engine
Traceback (most recent call last):
  File "quantize_trt.py", line 49, in <module>
    quantize_model("tail_relu")
  File "quantize_trt.py", line 37, in quantize_model
    converter.convert(calibration_input_fn=cali_input)
  File "/home/xavier/avdp-edge/lab/venv2/lib/python3.6/site-packages/tensorflow/python/compiler/tensorrt/trt_convert.py", line 1136, in convert
    self._converted_func(*map(ops.convert_to_tensor, inp))
  File "/home/xavier/avdp-edge/lab/venv2/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 1711, in __call__
    return self._call_impl(args, kwargs)
  File "/home/xavier/avdp-edge/lab/venv2/lib/python3.6/site-packages/tensorflow/python/eager/wrap_function.py", line 247, in _call_impl
    args, kwargs, cancellation_manager)
  File "/home/xavier/avdp-edge/lab/venv2/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 1729, in _call_impl
    return self._call_with_flat_signature(args, kwargs, cancellation_manager)
  File "/home/xavier/avdp-edge/lab/venv2/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 1778, in _call_with_flat_signature
    return self._call_flat(args, self.captured_inputs, cancellation_manager)
  File "/home/xavier/avdp-edge/lab/venv2/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 1961, in _call_flat
    ctx, args, cancellation_manager=cancellation_manager))
  File "/home/xavier/avdp-edge/lab/venv2/lib/python3.6/site-packages/tensorflow/python/eager/function.py", line 596, in call
    ctx=ctx)
  File "/home/xavier/avdp-edge/lab/venv2/lib/python3.6/site-packages/tensorflow/python/eager/execute.py", line 60, in quick_execute
    inputs, attrs, num_outputs)
tensorflow.python.framework.errors_impl.InternalError:  Failed to feed calibration data
         [[node TRTEngineOp_0_0 (defined at quantize_trt.py:37) ]] [Op:__inference_pruned_7004]

Function call stack:
pruned

Can someone help me out here? I understand it's a very niche problem, but in theory I am just trying to quantize a model, while supplying correctly shaped calibration data. Additionally this "second half" model is just a part of another model, which i have successfully quantized with the code above.

Environment

Jetson Xavier NX

TensorRT Version: 8.0.1
NVIDIA GPU:
NVIDIA Driver Version:
CUDA Version: 10.2
CUDNN Version: 8.2.1
Operating System: aarch64
Python Version (if applicable): python 3.6.9
Tensorflow Version (if applicable): 2.5.0

Relevant Files

I am including all three models yolo_relu_model, head_relu_model and tail_relu_model:

yolo drive

head drive

tail drive

Steps To Reproduce

After downloading the models you would have to call the script above.