D-FINE engine with fp16 has a degraded performance with TensorRT > 10.4

Aperta
#7 8 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
38/100
Tipo di issue
Bug
Chiarezza
Da chiarire
Stato di attività
Tranquilla
Stack tecnologico
python

Direzione di ricerca

Inizia riproducendo l’esportazione D-FINE fp16 con TensorRT 10.4 e 10.6 utilizzando la funzione build_engine mostrata. Esamina la gestione della precisione di NORMALIZATION, STRICT_TYPES e i flag di precisione, quindi confronta la precisione e le prestazioni dell’engine. Il lavoro è completato quando viene identificata la regressione tra le versioni di TensorRT e viene documentato o implementato un fix validato.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Hi,

Thanks for the great library.
I wanted to test DEIMv2 and Edgecrafter, but I need to use tensorrt >= 10.6.
So, I installed this repo with tensorrt==10.6, but D-FINE precision drops significantly.
Do you have any idea why this is happening? I read that I had to export the layernorms on FP32 and the other layers in FP16 to make D-FINE work, but it didn't work.

Here is my exportation code


from importlib.metadata import version
from packaging.version import Version

required_version = Version('10.4')
installed_version = Version(version('tensorrt'))

def build_engine(model_path, engine_path, use_fp16=False):
    logger = trt.Logger([trt.Logger.INFO](http://trt.logger.info/))
    builder = trt.Builder(logger)

    EXPLICIT_BATCH = 1 << (int)(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)
    network = builder.create_network(EXPLICIT_BATCH)


    config = builder.create_builder_config()
    if use_fp16:
        config.set_flag(trt.BuilderFlag.FP16)
        # MY ADDITION
        if installed_version > required_version:
            config.clear_flag(trt.BuilderFlag.OBEY_PRECISION_CONSTRAINTS)
            config.set_flag(trt.BuilderFlag.PREFER_PRECISION_CONSTRAINTS)
            for layer_idx in range(network.num_layers):
                layer = network[layer_idx]
                if layer.type == trt.LayerType.NORMALIZATION:
                    layer.precision = trt.float32
                    layer.set_output_type(0, trt.float32)

    parser = trt.OnnxParser(network, logger)
    config.set_flag(trt.BuilderFlag.STRICT_TYPES)

    with open(model_path, "rb") as f:
        model_data = f.read()
   
    if not parser.parse(model_data):
        print("Failed to parse ONNX model")
        for error in range(parser.num_errors):
            print(parser.get_error(error))
        return None

    # Create optimization profile to fix dynamic batch dimensions
    profile = builder.create_optimization_profile()
   
    # Handle dynamic input shapes - fix batch size to 1
    for i in range(network.num_inputs):
        input_tensor = network.get_input(i)
        input_shape = input_tensor.shape
        print(f"Input {i} ({[input_tensor.name](http://input_tensor.name/)}): {input_shape}")
       
        # Check if batch dimension is dynamic (typically -1)
        if input_shape[0] == -1:
            # Fix batch size to 1
            fixed_shape = (1,) + tuple(input_shape[1:])
            print(f"  Setting fixed batch shape: {fixed_shape}")
           
            # Set min, optimal, and max shapes all to batch size 1
            profile.set_shape([input_tensor.name](http://input_tensor.name/), fixed_shape, fixed_shape, fixed_shape)

    # Add the optimization profile to the configuration
    config.add_optimization_profile(profile)
    config.set_flag(trt.BuilderFlag.STRICT_TYPES)

    print(f"Building engine from {model_path} to {engine_path}")
    engine = builder.build_serialized_network(network, config)
   
    if engine is None:
        print("Failed to build engine")
        return None
       
    print(f"Engine built successfully")

    with open(engine_path, "wb") as f:
        f.write(engine)

    return engine

Lingua principale
Python
Stelle
45
Fork
3
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di roboflow/single_artifact_benchmarking

Tutte le issue di roboflow/single_artifact_benchmarking

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.