[BUG] MSE histogram calibration: wrong amax for INT, TypeError for FP8 (args passed in the bias slot)

Abierto Apto para principiantes
#3,261 0 comentarios 0 reacciones 0 asignados Ver en GitHub

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
Stack tecnológico
python, pytorch

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=8 and num_bits=False, so every candidate amax gives the same constant output and the same MSE. argmin then returns the first candidate, centers[start_bin].
  • FP8 path: M is 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

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de NVIDIA/Model-Optimizer

Todos los issues de NVIDIA/Model-Optimizer

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.