diff --git a/scripts/21_quantize_nvfp4.py b/scripts/21_quantize_nvfp4.py index 9e15c0d..27be137 100644 --- a/scripts/21_quantize_nvfp4.py +++ b/scripts/21_quantize_nvfp4.py @@ -49,9 +49,21 @@ from datasets import Dataset from safetensors import safe_open from transformers import AutoProcessor, Qwen3_5MoeForConditionalGeneration -from compressed_tensors.utils import save_mtp_tensors_to_checkpoint -from llmcompressor import oneshot -from llmcompressor.modifiers.quantization import QuantizationModifier +# Compat shim: llmcompressor 0.12.0 (ultima version en PyPI) importa incondicionalmente +# GraniteMoeParallelExperts al armar su registro de arquitecturas MoE "linearizables" +# (llmcompressor/modeling/moe/granitemoe.py), incluso para modelos que no son GraniteMoe +# (como este Qwen3.5 MoE). transformers 5.14.1 renombro esa clase a GraniteMoeExperts, +# rompiendo ese import y abortando oneshot() para CUALQUIER modelo. Como Qwen3.5 MoE no +# esta en ese registro (solo granitemoe/llama4), el alias nunca se usa realmente -- solo +# hace falta que el nombre exista para que el import no explote. +import transformers.models.granitemoe.modeling_granitemoe as _granitemoe_mod # noqa: E402 + +if not hasattr(_granitemoe_mod, "GraniteMoeParallelExperts"): + _granitemoe_mod.GraniteMoeParallelExperts = _granitemoe_mod.GraniteMoeExperts + +from compressed_tensors.utils import save_mtp_tensors_to_checkpoint # noqa: E402 +from llmcompressor import oneshot # noqa: E402 +from llmcompressor.modifiers.quantization import QuantizationModifier # noqa: E402 REPO_ROOT = Path(__file__).resolve().parent.parent MODEL_PATH = Path(os.environ.get("MODEL_PATH", "/workspace/ft-models/Qwen3.6-35B-A3B-mcp-bf16"))