[BUG] MSE histogram calibration: wrong amax for INT, TypeError for FP8 (args passed in the bias slot)
Los mantenedores suelen responder en 1 día
Nadie ha tomado este issue todavía.
Evaluación
- Dificultad
- 2/5
- Tiempo estimado
- 1-3 horas
- Aptitud para principiantes
- 82/100
- Tipo de issue
- Error
- Claridad
- Bien especificado
- Estado de actividad
- Activo
- Área
- machine-learning, testing-qa
Línea de trabajo
Empieza en modelopt/torch/quantization/calib/histogram.py e inspecciona _compute_amax_mse junto con las firmas de fake_tensor_quant y scaled_e4m3. Reproduce los ejemplos de CPU del issue para INT8 y FP8 y después añade pruebas de regresión para ambos formatos. Se considera terminado cuando ambos devuelvan valores de amax razonables sin lanzar una excepción, también a través de la ruta compartida de calibración MSE.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Describe the bug
HistogramCalibrator.compute_amax("mse") returns an amax that is far too small for INT formats. For FP8 (E4M3) it raises a TypeError. calibrate_weights(method="mse") goes through the same code, so it has the same problem.
The cause is in _compute_amax_mse in modelopt/torch/quantization/calib/histogram.py:
quant_centers = fake_tensor_quant(centers, amax, num_bits, unsigned)
...
quant_centers = scaled_e4m3(centers, amax, num_bits[0], num_bits[1])
Both functions now take bias as their third argument (fake_tensor_quant(inputs, amax, bias=None, num_bits=8, unsigned=False, ...), scaled_e4m3(inputs, amax, bias=None, E=4, M=3, ...)).
- INT path: the call passes
bias=8andnum_bits=False, so every candidate amax gives the same constant output and the same MSE.argminthen returns the first candidate,centers[start_bin]. - FP8 path:
Mis missing, so the call raises.
Steps to reproduce
Main at 86bd9b78425a23a45b329c7c9b86ea772d7a9e77, CPU.
import torch
from modelopt.torch.quantization import calib
torch.manual_seed(0)
x = torch.randn(100_000)
print("max|x|:", x.abs().max().item())
for num_bits in (8, (4, 3)):
cal = calib.HistogramCalibrator(num_bits, None, False, num_bins=2048)
cal.collect(x)
try:
print(num_bits, "mse amax:", cal.compute_amax("mse").item())
except Exception as e:
print(num_bits, type(e).__name__, e)
Actual:
max|x|: 4.562695503234863
8 mse amax: 0.28628242015838623
(4, 3) TypeError ScaledE4M3Function.forward() missing 1 required positional argument: 'M'
Expected: an amax a bit below max|x| for both formats. With the arguments passed correctly the same script prints 4.0603 (INT8) and 4.3811 (FP8).
With CUDA available the histogram moves to the GPU and the quantizers go through the CUDA extension. The same script on B300 prints 4.5616 for INT8 (the amax lands at max|x|, not at the MSE optimum 4.0603) and the same TypeError for FP8.
Same effect through the public API on CPU: calibrate_weights(model, method="mse", perchannel=True) on an INT8 per-channel Linear(256, 4) sets every channel's amax to 0.0039 while max|w| is about 0.0625. The relative weight error after quantization is 0.908. With the fix it is 0.0039.
The existing TestMSECalibrator tests still pass on main. They only check that amax is closer to the bulk value than to the outlier, and the first candidate bin also satisfies that.
Proposed fix
Pass None for bias in both calls, plus a Gaussian regression test for INT8 and FP8.
Could a maintainer confirm this is a bug and not already fixed internally? I have the fix and tests ready and can open a PR after your reply.
- Lenguaje dominante
- Python
- Estrellas
- 5.5k
- Forks
- 800
- Merge medio
- 3 d 6 h
- PR fusionados (30 d)
- 267
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de NVIDIA/Model-Optimizer
-
[Bug] modelopt-mcp: all launcher subprocesses hang when the server runs as a stdio MCP server — missing stdin=DEVNULLPosiblemente ocupada @ChenhanYu la tomó hace 38 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
NVIDIA/Model-Optimizer#2551 · 1 comentario · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
Puzzletron Progress 6/8 (calculating one block scores) takes 10 to 20 times more than in tutorialQuizá libre de nuevo @tejasng053 la tomó hace 45 días y no hay ningún pull request abierto. Abiertobug
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
NVIDIA/Model-Optimizer#1667 ·
Los mantenedores suelen responder en 1 día
-
Dificultad 3/5 1-2 días Aptitud para principiantes 72/100
NVIDIA/Model-Optimizer#3262 ·
Los mantenedores suelen responder en 1 día
-
[ONNX] graph_surgery / llm_export compute head_dim as hidden_size // num_attention_heads, ignoring config.head_dim (breaks Qwen3, Gemma, Mistral-Small)Posiblemente ocupada @sylvesterkaczmarek la tomó hace 4 días. Abiertobug
Dificultad 3/5 1-2 días Aptitud para principiantes 71/100
NVIDIA/Model-Optimizer#3245 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
Alpamayo quantized model doesn't run and cannot be converted to TensorRTPosiblemente ocupada @rohansjoshi la tomó hace 4 días. Abiertobug torch.quantization waiting for feedback
NVIDIA/Model-Optimizer#3227 · 1 asignado ·
Los mantenedores suelen responder en 1 día
Todos los issues de NVIDIA/Model-Optimizer
Issues similares
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
Project-N-E-K-O/N.E.K.O#3670 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
type:docs
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
jejjohnson/xtremax#123 ·
-
bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
Los mantenedores suelen responder en 1 día
-
triage
Dificultad 1/5 Menos de una hora Aptitud para principiantes 78/100
microsoft/agent-framework#10218 ·
Los mantenedores suelen responder en 1 día
-
fidelity
Dificultad 2/5 Medio día Aptitud para principiantes 66/100
Los mantenedores suelen responder en 1 día