NVIDIA / NVIDIA/Model-Optimizer

# [ONNX][Autotune] Integrated quantization does not preserve AutoTune Q/DQ placement on ViT

Open
#2,123 0 comments 0 reactions 1 assignee View on GitHub

@ajrasane is already working on this.

Since Aug 17, 2026.

bug
Dominant language
Python
Stars
3.8k
Forks
604
Avg merge
2d 8h
Merged PRs (30d)
142

Description

[ONNX][Autotune] Integrated quantization does not preserve AutoTune Q/DQ placement on ViT

Description

When using ONNX Integrated AutoTune with:

python -m modelopt.onnx.quantization ... --autotune

I found that the Q/DQ placement selected during the AutoTune search is not preserved in the final calibrated INT8 ONNX model.

This also causes a noticeable TensorRT performance regression.

For autotune_schemes_per_region=50:

Model QPS Speedup P50
FP16 baseline 744.41 1.00x 1.34 ms
Standard INT8 PTQ 1019.40 1.37x 0.98 ms
Integrated AutoTune optimized_final.onnx 1045.54 1.41x 0.95 ms
Integrated final calibrated model 915.37 1.23x 1.09 ms

At the consumer-input edge level:

SAME          = 86
AUTOTUNE ONLY = 48
FINAL ONLY    = 0

So all activation boundaries in the final model are already present in the AutoTune model, but 48 AutoTune-selected boundaries disappear in the final calibrated model.

The missing boundaries follow a regular pattern:

12 x Cast -> Sqrt
12 x Div  -> Sqrt_1
12 x Div  -> Sqrt_2
11 x fc1/Add -> Gelu
 1 x Add -> final LayerNormalization

Because each Div Q/DQ is shared by two Sqrt consumers, these 48 missing consumer edges correspond exactly to the 36 missing activation Q/DQ pairs:

122 - 86 = 36

For example:

/blocks/blocks.0/attn/Cast_output_0_cast_to_fp16
    -> /blocks/blocks.0/attn/Sqrt.input[0]

/blocks/blocks.0/attn/Div_output_0
-> /blocks/blocks.0/attn/Sqrt_1.input[0]

/blocks/blocks.0/attn/Div_output_0
-> /blocks/blocks.0/attn/Sqrt_2.input[0]

/blocks/blocks.0/mlp/fc1/Add_output_0
-> /blocks/blocks.0/mlp/act/Gelu.input[0]

Expected behavior

I expected Integrated AutoTune to preserve the Q/DQ placement selected by AutoTune while using calibration data to compute the final quantization scales.

This also appears consistent with the existing integration test:

tests/gpu/onnx/quantization/test_autotune_quantization_integration.py

which compares DQ-fed (node_name, input_index) sets between standalone AutoTune and Integrated AutoTune and asserts that they are equal.

Could you please check whether the final Integrated AutoTune model is expected to preserve the exact AutoTune Q/DQ placement, and if so, fix the topology preservation for this ViT case?

I can provide the ONNX models, calibration data, topology comparison script, and full AutoTune/TensorRT logs if needed.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.