From c02883dca73be55f34b0eced89a70db8b1bdd08e Mon Sep 17 00:00:00 2001 From: Keval Morabia <28916987+kevalmorabia97@users.noreply.github.com> Date: Wed, 21 Oct 2026 10:19:16 -0700 Subject: [PATCH 1/3] docs: date-prefix announcement filenames Name announcement pages -.rst so they sort by date, and point the index cards and README links at the new paths. Co-Authored-By: Claude Opus 5.5 Signed-off-by: Keval Morabia <28916987+kevalmorabia97@users.noreply.github.com> --- README.md | 8 ++++---- ...-domino.rst => 20260713-dspark-vs-domino.rst} | 0 ...t => 20260813-github-pages-announcements.rst} | 2 +- ...utoquantize.rst => 20260824-autoquantize.rst} | 0 ...al-hessian.rst => 20260909-local-hessian.rst} | 0 ...w4a4-qad.rst => 20260916-qwen36-w4a4-qad.rst} | 0 ...-learning.rst => 20260916-scale-learning.rst} | 0 ...e-gpu-ptq.rst => 20260928-single-gpu-ptq.rst} | 0 ...utoquant-kv.rst => 20261008-autoquant-kv.rst} | 0 docs/source/index.rst | 16 ++++++++-------- 10 files changed, 13 insertions(+), 13 deletions(-) rename docs/source/announcements/{dspark-vs-domino.rst => 20260713-dspark-vs-domino.rst} (100%) rename docs/source/announcements/{github-pages-announcements.rst => 20260813-github-pages-announcements.rst} (66%) rename docs/source/announcements/{autoquantize.rst => 20260824-autoquantize.rst} (100%) rename docs/source/announcements/{local-hessian.rst => 20260909-local-hessian.rst} (100%) rename docs/source/announcements/{qwen36-w4a4-qad.rst => 20260916-qwen36-w4a4-qad.rst} (100%) rename docs/source/announcements/{scale-learning.rst => 20260916-scale-learning.rst} (100%) rename docs/source/announcements/{single-gpu-ptq.rst => 20260928-single-gpu-ptq.rst} (100%) rename docs/source/announcements/{autoquant-kv.rst => 20261008-autoquant-kv.rst} (100%) diff --git a/README.md b/README.md index e2ff25716b3..4de416a95f7 100644 --- a/README.md +++ b/README.md @@ -28,11 +28,11 @@ Model Optimizer is also integrated with [NVIDIA Megatron-Bridge](https://github. ## Latest News - [2026/10/15] [NVIDIA Nemotron 3.5 Super VL 120B-A12B NVFP4 checkpoint](https://huggingface.co/nvidia/NVIDIA-Nemotron-3.5-Super-VL-120B-A12B-NVFP4): Quantized with Model Optimizer using post-training quantization (PTQ) and quantization-aware distillation (QAD). For details, see the Quantization section (Section 4) of the [technical report](https://research.nvidia.com/labs/nemotron/files/NVIDIA-Nemotron-3.5-Super-and-Lightning-Technical-Report.pdf). -- [2026/10/08] [BLOG: AutoQuant KV: Automatic Mixed-Precision KV Cache Quantization](https://nvidia.github.io/Model-Optimizer/announcements/autoquant-kv.html): Per-layer KV format search, GEMM composition, and a Qwen3-8B accuracy case study. -- [2026/09/16] [BLOG: Scale Learning: Training NVFP4 Block Scales to Recover Accuracy](https://nvidia.github.io/Model-Optimizer/announcements/scale-learning.html) +- [2026/10/08] [BLOG: AutoQuant KV: Automatic Mixed-Precision KV Cache Quantization](https://nvidia.github.io/Model-Optimizer/announcements/20261008-autoquant-kv.html): Per-layer KV format search, GEMM composition, and a Qwen3-8B accuracy case study. +- [2026/09/16] [BLOG: Scale Learning: Training NVFP4 Block Scales to Recover Accuracy](https://nvidia.github.io/Model-Optimizer/announcements/20260916-scale-learning.html) - [2026/09/16] [**End-to-end W4A4 NVFP4 + QAD tutorial for Qwen3.6-35B-A3B**](./examples/megatron_bridge/tutorials/Qwen3.6-35B-A3B): NVFP4 W4A4 PTQ plus quantization-aware distillation, reaching up to 1.30x vLLM throughput over BF16 and 3.1x smaller checkpoints while recovering the accuracy W4A4 costs. -- [2026/09/09] [BLOG: Improving NVFP4 Accuracy with Local-Hessian Weight Scales](https://nvidia.github.io/Model-Optimizer/announcements/local-hessian.html) -- [2026/08/24] [BLOG: AutoQuantize: A Fast Automatic Mixed-Precision Assignment](https://nvidia.github.io/Model-Optimizer/announcements/autoquantize.html) +- [2026/09/09] [BLOG: Improving NVFP4 Accuracy with Local-Hessian Weight Scales](https://nvidia.github.io/Model-Optimizer/announcements/20260909-local-hessian.html) +- [2026/08/24] [BLOG: AutoQuantize: A Fast Automatic Mixed-Precision Assignment](https://nvidia.github.io/Model-Optimizer/announcements/20260824-autoquantize.html) - [2026/08/17] [BLOG: Developing Nemotron 3.5 Lightning NVFP4 with QAD Using NVIDIA Model Optimizer](https://developer.nvidia.com/blog/developing-nemotron-3-5-lightning-nvfp4-with-qad-using-nvidia-model-optimizer/): Learn how quantization-aware distillation recovers accuracy from aggressive NVFP4 quantization while reducing model size and increasing throughput. - [2026/06/26] [BLOG: Creating the NVIDIA Nemotron 3 Ultra NVFP4 Checkpoint with NVIDIA Model Optimizer](https://developer.nvidia.com/blog/creating-the-nvidia-nemotron-3-ultra-nvfp4-checkpoint-with-nvidia-model-optimizer/): How we quantized Nemotron 3 Ultra (550B) to NVFP4 with Model Optimizer — up to 5.9× higher decode-heavy inference throughput than GLM-5.1 754B FP4 while matching BF16 accuracy. [NVFP4 Checkpoint](https://huggingface.co/nvidia/NVIDIA-Nemotron-3-Ultra-550B-A55B-NVFP4) on Hugging Face. - [2026/05/27] [**End-to-end Optimization tutorial for Nemotron-3-Nano-30B-A3B**](./examples/megatron_bridge/tutorials/NVIDIA-Nemotron-3-Nano-30B-A3B-BF16): Pruning + two-phase distillation + FP8 quantization achieving 2.6× vLLM throughput and 2.6× memory reduction. diff --git a/docs/source/announcements/dspark-vs-domino.rst b/docs/source/announcements/20260713-dspark-vs-domino.rst similarity index 100% rename from docs/source/announcements/dspark-vs-domino.rst rename to docs/source/announcements/20260713-dspark-vs-domino.rst diff --git a/docs/source/announcements/github-pages-announcements.rst b/docs/source/announcements/20260813-github-pages-announcements.rst similarity index 66% rename from docs/source/announcements/github-pages-announcements.rst rename to docs/source/announcements/20260813-github-pages-announcements.rst index 62915e643fc..903c69a8523 100644 --- a/docs/source/announcements/github-pages-announcements.rst +++ b/docs/source/announcements/20260813-github-pages-announcements.rst @@ -20,4 +20,4 @@ What Changes Authoring Flow ************** -Add a Sphinx page under ``docs/source/announcements/``, add its ``.announcement-card`` metadata and link to ``docs/source/index.rst``, and link it from the announcements toctree when applicable. The GitHub Pages workflow rebuilds the static site from committed source, so every announcement follows the same review path as code and docs. +Add a Sphinx page under ``docs/source/announcements/``, named ``-.rst`` after its publication date so the pages sort by date, add its ``.announcement-card`` metadata and link to ``docs/source/index.rst``, and link it from the announcements toctree when applicable. The GitHub Pages workflow rebuilds the static site from committed source, so every announcement follows the same review path as code and docs. diff --git a/docs/source/announcements/autoquantize.rst b/docs/source/announcements/20260824-autoquantize.rst similarity index 100% rename from docs/source/announcements/autoquantize.rst rename to docs/source/announcements/20260824-autoquantize.rst diff --git a/docs/source/announcements/local-hessian.rst b/docs/source/announcements/20260909-local-hessian.rst similarity index 100% rename from docs/source/announcements/local-hessian.rst rename to docs/source/announcements/20260909-local-hessian.rst diff --git a/docs/source/announcements/qwen36-w4a4-qad.rst b/docs/source/announcements/20260916-qwen36-w4a4-qad.rst similarity index 100% rename from docs/source/announcements/qwen36-w4a4-qad.rst rename to docs/source/announcements/20260916-qwen36-w4a4-qad.rst diff --git a/docs/source/announcements/scale-learning.rst b/docs/source/announcements/20260916-scale-learning.rst similarity index 100% rename from docs/source/announcements/scale-learning.rst rename to docs/source/announcements/20260916-scale-learning.rst diff --git a/docs/source/announcements/single-gpu-ptq.rst b/docs/source/announcements/20260928-single-gpu-ptq.rst similarity index 100% rename from docs/source/announcements/single-gpu-ptq.rst rename to docs/source/announcements/20260928-single-gpu-ptq.rst diff --git a/docs/source/announcements/autoquant-kv.rst b/docs/source/announcements/20261008-autoquant-kv.rst similarity index 100% rename from docs/source/announcements/autoquant-kv.rst rename to docs/source/announcements/20261008-autoquant-kv.rst diff --git a/docs/source/index.rst b/docs/source/index.rst index 0c6532c7f39..e92a53ecd49 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -33,49 +33,49 @@ Release notes, technical updates, examples, and deployment stories from the Mode
From 5e47e2b61d43282f3a8e00f0d356adf38b8b789d Mon Sep 17 00:00:00 2001 From: Keval Morabia <28916987+kevalmorabia97@users.noreply.github.com> Date: Wed, 21 Oct 2026 10:32:58 -0700 Subject: [PATCH 2/3] docs: redirect the old announcement URLs to the date-prefixed pages Co-Authored-By: Claude Opus 5.5 Signed-off-by: Keval Morabia <28916987+kevalmorabia97@users.noreply.github.com> --- docs/source/conf.py | 47 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/docs/source/conf.py b/docs/source/conf.py index bca51fb3698..0ccb9e8ca49 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -217,6 +217,53 @@ def visit_reference(self, node: Element) -> None: self.body.append(("%s" + self.secnumber_suffix) % ".".join(map(str, node["secnumber"]))) +# Pages that moved, as {old path: new path} without ".html"; each old URL gets a redirect page. +# Announcements gained a - prefix so the source tree sorts by date. +redirects = { + f"announcements/{slug}": f"announcements/{date}-{slug}" + for date, slug in [ + ("20260713", "dspark-vs-domino"), + ("20260813", "github-pages-announcements"), + ("20260824", "autoquantize"), + ("20260909", "local-hessian"), + ("20260916", "qwen36-w4a4-qad"), + ("20260916", "scale-learning"), + ("20260928", "single-gpu-ptq"), + ("20261008", "autoquant-kv"), + ] +} + +_REDIRECT_PAGE = """ + + + +Redirecting + + + + +

This page moved to {target}.

+ +""" + + +def _write_redirect_pages(app: sphinx.application.Sphinx, exception: Exception | None) -> None: + """Write an HTML redirect page at each old path in ``redirects``.""" + if exception is not None or app.builder.name != "html": + return + for old, new in redirects.items(): + if os.path.exists(os.path.join(app.srcdir, old + ".rst")): + raise ValueError(f"Redirect source {old!r} is still a page in the docs source") + if not os.path.exists(os.path.join(app.outdir, new + ".html")): + raise ValueError(f"Redirect target {new!r} was not built") + target = os.path.relpath(new + ".html", os.path.dirname(old) or ".") + path = os.path.join(app.outdir, old + ".html") + os.makedirs(os.path.dirname(path), exist_ok=True) + with open(path, "w", encoding="utf-8") as f: + f.write(_REDIRECT_PAGE.format(target=target)) + + def setup(app: sphinx.application.Sphinx) -> None: """Setup according to the Sphinx extension API.""" app.set_translator("html", PatchedHTMLTranslator) + app.connect("build-finished", _write_redirect_pages) From 7af729f580dfe2745a40d7730578e144bcc94849 Mon Sep 17 00:00:00 2001 From: Keval Morabia <28916987+kevalmorabia97@users.noreply.github.com> Date: Wed, 21 Oct 2026 10:51:20 -0700 Subject: [PATCH 3/3] docs: use sphinxext-rediraffe for the old announcement URL redirects Replace the custom build-finished hook with the MIT-licensed rediraffe extension, which writes the same redirect pages and warns on missing targets. Co-Authored-By: Claude Opus 5.5 Signed-off-by: Keval Morabia <28916987+kevalmorabia97@users.noreply.github.com> --- docs/source/conf.py | 37 ++++--------------------------------- pyproject.toml | 1 + 2 files changed, 5 insertions(+), 33 deletions(-) diff --git a/docs/source/conf.py b/docs/source/conf.py index 0ccb9e8ca49..4bbc609cdac 100644 --- a/docs/source/conf.py +++ b/docs/source/conf.py @@ -74,6 +74,7 @@ "sphinx_copybutton", # line numbers getting copied so cannot use `:linenos:` "sphinx_inline_tabs", "sphinx_togglebutton", + "sphinxext.rediraffe", # redirect pages for moved docs, see rediraffe_redirects "sphinxcontrib.autodoc_pydantic", "modelopt_autodoc_pydantic", ] @@ -217,9 +218,9 @@ def visit_reference(self, node: Element) -> None: self.body.append(("%s" + self.secnumber_suffix) % ".".join(map(str, node["secnumber"]))) -# Pages that moved, as {old path: new path} without ".html"; each old URL gets a redirect page. -# Announcements gained a - prefix so the source tree sorts by date. -redirects = { +# Pages that moved, as {old docname: new docname}; sphinxext-rediraffe writes a redirect page at +# each old path. Announcements gained a - prefix so the source tree sorts by date. +rediraffe_redirects = { f"announcements/{slug}": f"announcements/{date}-{slug}" for date, slug in [ ("20260713", "dspark-vs-domino"), @@ -233,37 +234,7 @@ def visit_reference(self, node: Element) -> None: ] } -_REDIRECT_PAGE = """ - - - -Redirecting - - - - -

This page moved to {target}.

- -""" - - -def _write_redirect_pages(app: sphinx.application.Sphinx, exception: Exception | None) -> None: - """Write an HTML redirect page at each old path in ``redirects``.""" - if exception is not None or app.builder.name != "html": - return - for old, new in redirects.items(): - if os.path.exists(os.path.join(app.srcdir, old + ".rst")): - raise ValueError(f"Redirect source {old!r} is still a page in the docs source") - if not os.path.exists(os.path.join(app.outdir, new + ".html")): - raise ValueError(f"Redirect target {new!r} was not built") - target = os.path.relpath(new + ".html", os.path.dirname(old) or ".") - path = os.path.join(app.outdir, old + ".html") - os.makedirs(os.path.dirname(path), exist_ok=True) - with open(path, "w", encoding="utf-8") as f: - f.write(_REDIRECT_PAGE.format(target=target)) - def setup(app: sphinx.application.Sphinx) -> None: """Setup according to the Sphinx extension API.""" app.set_translator("html", PatchedHTMLTranslator) - app.connect("build-finished", _write_redirect_pages) diff --git a/pyproject.toml b/pyproject.toml index 8843bcfc23e..7d7acc80414 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -120,6 +120,7 @@ dev-docs = [ "sphinx-inline-tabs==2025.12.21.14; python_version >= '3.12'", "shibuya~=2026.7.0; python_version >= '3.12'", "sphinx-togglebutton~=0.4.0; python_version >= '3.12'", + "sphinxext-rediraffe~=0.3.0; python_version >= '3.12'", ] dev-test = [ "coverage[toml]~=7.14.0", # a1_coverage.pth for subprocess tracking requires this