94057c3d3e
PR Test (NPU) / check-changes (push) Has been cancelled
PR Test (NPU) / pr-gate (push) Has been cancelled
PR Test (NPU) / set-image-config (push) Has been cancelled
PR Test (NPU) / stage-b-test-1-npu-a2 (0) (push) Has been cancelled
PR Test (NPU) / stage-b-test-1-npu-a2 (1) (push) Has been cancelled
PR Test (NPU) / stage-b-test-2-npu-a2 (0) (push) Has been cancelled
PR Test (NPU) / stage-b-test-2-npu-a2 (1) (push) Has been cancelled
PR Test (NPU) / stage-b-test-4-npu-a3 (push) Has been cancelled
PR Test (NPU) / stage-b-test-16-npu-a3 (push) Has been cancelled
PR Test (NPU) / multimodal-gen-test-1-npu-a3 (push) Has been cancelled
PR Test (NPU) / multimodal-gen-test-2-npu-a3 (push) Has been cancelled
PR Test (Arm64) / pr-gate (push) Has been cancelled
PR Test (Arm64) / check-changes (push) Has been cancelled
PR Test (Arm64) / build-test (push) Has been cancelled
PR Test (sgl-router) / gate (push) Has been cancelled
PR Test (sgl-router) / tier-1 — lint (push) Has been cancelled
PR Test (sgl-router) / tier-2 — build + test (push) Has been cancelled
PR Test (sgl-router) / tier-3 — docker (placeholder) (push) Has been cancelled
PR Test (sgl-router) / tier-3 — k8s integration (push) Has been cancelled
PR Test (sgl-router) / tier-3 — e2e (push) Has been cancelled
PR Test (sgl-router) / finish (push) Has been cancelled
PR Test (NPU) / single-node-poc (map[name:qwen3_6_27b_w8a8_1p_in64k_out1k_50ms runner:linux-aarch64-a3-2 test_case:test/registered/ascend/performance/qwen3_6_27b/test_npu_qwen3_6_27b_w8a8_1p_in64k_out1k_50ms.py test_type:perf]) (push) Has been cancelled
PR Test (NPU) / pr-test-npu-finish (push) Has been cancelled
PR Test (Xeon) / pr-gate (push) Has been cancelled
PR Test (Xeon) / check-changes (push) Has been cancelled
PR Test (Xeon) / build-test (, xeon-gnr, base-b-test-cpu) (push) Has been cancelled
PR Test (XPU) / check-changes (push) Has been cancelled
PR Test (XPU) / pr-gate (push) Has been cancelled
PR Test (XPU) / stage-a-test-1-gpu-xpu (push) Has been cancelled
PR Test (XPU) / wait-for-stage-a (push) Has been cancelled
PR Test (XPU) / stage-b-test-1-gpu-xpu (push) Has been cancelled
PR Test (XPU) / finish (push) Has been cancelled
CI Model Inventory / build-inventory (push) Has been cancelled
Lint / lint (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark Compilation Check (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark - Manual Policy (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark - Request Processing (push) Has been cancelled
PR Benchmark (SMG Components) / Benchmark Summary (push) Has been cancelled
PR Test (SMG) / build-wheel (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on windows (x86_64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on macos (x86_64 - auto) (push) Has been cancelled
PR Test (SMG) / python-unit-tests (push) Has been cancelled
PR Test (SMG) / unit-tests (push) Has been cancelled
PR Test (SMG) / benchmarks (push) Has been cancelled
PR Test (SMG) / chat-completions (push) Has been cancelled
PR Test (SMG) / chat-completions-4gpu (push) Has been cancelled
PR Test (SMG) / e2e (push) Has been cancelled
PR Test (SMG) / docker-build-test (push) Has been cancelled
PR Test (SMG) / k8s-integration (push) Has been cancelled
PR Test (SMG) / finish (push) Has been cancelled
PR Test (SMG) / summarize-benchmarks (push) Has been cancelled
Release SGLang Model Gateway Docker Image / publish (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on macos (aarch64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (aarch64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (x86_64 - auto) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (aarch64 - musllinux_1_1) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / build on linux (x86_64 - musllinux_1_1) (push) Has been cancelled
Release SGLang Model Gateway to PyPI / Build SDist (push) Has been cancelled
Release SGLang Model Gateway to PyPI / Upload to PyPI (push) Has been cancelled
Release SGLang Kernels / build-cu129-matrix (aarch64, 12.9, 3.10, arm-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / build-cu129-matrix (x86_64, 12.9, 3.10, x64-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / release-cu129 (push) Has been cancelled
Release SGLang Kernels / build-cu130-matrix (aarch64, 13.0, 3.10, arm-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / build-cu130-matrix (x86_64, 13.0, 3.10, x64-kernel-build-node) (push) Has been cancelled
Release SGLang Kernels / release-cu130 (push) Has been cancelled
Release SGLang Kernels / build-rocm-matrix (3.10, 700) (push) Has been cancelled
Release SGLang Kernels / build-rocm-matrix (3.10, 720) (push) Has been cancelled
Release SGLang Kernels / release-rocm700 (push) Has been cancelled
Release SGLang Kernels / release-rocm720 (push) Has been cancelled
Release SGLang Kernels / build-musa43 (43, 3.10) (push) Has been cancelled
Release SGLang Kernels / release-musa43 (push) Has been cancelled
801 lines
31 KiB
Plaintext
801 lines
31 KiB
Plaintext
---
|
|
title: "Quantization"
|
|
tag: "approx"
|
|
metatags:
|
|
description: "SGLang-Diffusion supports quantized transformer checkpoints. In most cases, keep the base model and the quantized transformer override separate."
|
|
---
|
|
|
|
SGLang-Diffusion supports quantized transformer checkpoints. In most cases, keep
|
|
the base model and the quantized transformer override separate.
|
|
|
|
## Quick Reference
|
|
|
|
Use these paths:
|
|
|
|
- `--model-path`: the base or original model
|
|
- `--transformer-path`: a quantized transformers-style transformer component directory that already contains its own `config.json`
|
|
- `--transformer-weights-path`: quantized transformer weights provided as a single safetensors file, a sharded safetensors directory, a local path, or a Hugging Face repo ID
|
|
- `--quantization`: apply online quantization to unquantized models at load time (activations are quantized dynamically)
|
|
- `--quantization-ignored-layers` layer name patterns to keep unquantized (e.g. `attention.to_`)
|
|
|
|
Recommended example for pre-quantized checkpoints:
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path black-forest-labs/FLUX.2-dev \
|
|
--transformer-weights-path black-forest-labs/FLUX.2-dev-NVFP4 \
|
|
--prompt "a curious pikachu"
|
|
```
|
|
|
|
For quantized transformers-style transformer component folders:
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path /path/to/base-model \
|
|
--transformer-path /path/to/quantized-transformer \
|
|
--prompt "A Logo With Bold Large Text: SGL Diffusion"
|
|
```
|
|
|
|
NOTE: Some model-specific integrations also accept a quantized repo or local
|
|
directory directly as `--model-path`, but that is a compatibility path. If a
|
|
repo contains multiple candidate checkpoints, pass
|
|
`--transformer-weights-path` explicitly.
|
|
|
|
## Quant Families
|
|
|
|
Here, `quant_family` means a checkpoint and loading family with shared CLI
|
|
usage and loader behavior. It is not just the numeric precision or a kernel
|
|
backend.
|
|
|
|
<table style={{width: "100%", borderCollapse: "collapse", tableLayout: "fixed"}}>
|
|
<colgroup>
|
|
<col style={{width: "16.67%"}} />
|
|
<col style={{width: "16.67%"}} />
|
|
<col style={{width: "16.67%"}} />
|
|
<col style={{width: "16.67%"}} />
|
|
<col style={{width: "16.67%"}} />
|
|
<col style={{width: "16.67%"}} />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th>quant_family</th>
|
|
<th>checkpoint form</th>
|
|
<th>canonical CLI</th>
|
|
<th>supported models</th>
|
|
<th>extra dependency</th>
|
|
<th>platform / notes</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>fp8</code> / <code>mxfp4</code> (online quantization)</td>
|
|
<td>Unquantized checkpoint (offline via AMD Quark coming soon)</td>
|
|
<td><code>--quantization {fp8,mxfp4}</code></td>
|
|
<td>Z-Image-Turbo (validated), others likely work. More support coming soon.</td>
|
|
<td>MXFP4: <code>aiter</code> on ROCm</td>
|
|
<td>MXFP4 requires ROCm and MI350+ (gfx95x). Weights quantized at load time, activations quantized to <code>fp8</code> / <code>mxfp4</code> dynamically.</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>fp8</code> (offline quantization)</td>
|
|
<td>Quantized transformer component folder, or safetensors with <code>quantization_config</code> metadata</td>
|
|
<td><code>--transformer-path</code> or <code>--transformer-weights-path</code></td>
|
|
<td>ALL</td>
|
|
<td>None</td>
|
|
<td>Component-folder and single-file flows are both supported</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>modelopt-fp8</code></td>
|
|
<td>Converted ModelOpt FP8 transformer directory or repo with <code>config.json</code></td>
|
|
<td><code>--transformer-path</code></td>
|
|
<td>FLUX.1, FLUX.2, Wan2.2, HunyuanVideo, Qwen Image, Qwen Image Edit</td>
|
|
<td>None</td>
|
|
<td>Serialized config stays <code>quant_method=modelopt</code> with <code>quant_algo=FP8</code>; <code>dit_layerwise_offload</code> is supported and <code>dit_cpu_offload</code> stays disabled</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>modelopt-nvfp4</code></td>
|
|
<td>Mixed transformer directory/repo with <code>config.json</code>, raw NVFP4 safetensors export/repo, or full ModelOpt Diffusers repo</td>
|
|
<td><code>--transformer-path</code> for mixed overrides; <code>--transformer-weights-path</code> for raw exports; <code>--model-path</code> for full repos</td>
|
|
<td>FLUX.1, FLUX.2, Wan2.2, Qwen Image, Qwen Image 2512, Qwen Image Edit, Qwen Image Edit 2511</td>
|
|
<td>None</td>
|
|
<td>Mixed override repos keep the base model separate; full Qwen Image exports can be loaded directly as <code>--model-path</code>; raw exports such as <code>black-forest-labs/FLUX.2-dev-NVFP4</code> still use the weights-path flow</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>nunchaku-svdq</code></td>
|
|
<td>Pre-quantized Nunchaku transformer weights, usually named <code>svdq-{int4\|fp4}_r{rank}-...</code></td>
|
|
<td><code>--transformer-weights-path</code></td>
|
|
<td>Model-specific support such as Qwen-Image, FLUX, and Z-Image</td>
|
|
<td><code>nunchaku</code></td>
|
|
<td>SGLang can infer precision and rank from the filename and supports both <code>int4</code> and <code>nvfp4</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>msmodelslim</code></td>
|
|
<td>Pre-quantized msmodelslim transformer weights</td>
|
|
<td><code>--model-path</code></td>
|
|
<td>Wan2.2 family</td>
|
|
<td>None</td>
|
|
<td>Currently only compatible with the Ascend NPU family and supports <code>mxfp8</code>, <code>mxfp4</code>, <code>w8a8</code>, and <code>w4a4</code></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
## Online Quantization
|
|
|
|
Online quantization applies quantization to unquantized models at load time. This is useful for when pre-quantized checkpoints are not available.
|
|
|
|
### FP8 Online Quantization
|
|
|
|
Apply FP8 quantization to any unquantized model:
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path Tongyi-MAI/Z-Image-Turbo \
|
|
--quantization fp8 \
|
|
--prompt "a beautiful sunset" \
|
|
--save-output
|
|
```
|
|
|
|
### MXFP4 Online Quantization
|
|
|
|
MXFP4 provides aggressive 4-bit compression with online quantization. **Note: Requires ROCm and MI350+ (gfx95x) GPU.**
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path Tongyi-MAI/Z-Image-Turbo \
|
|
--quantization mxfp4 \
|
|
--prompt "a beautiful sunset" \
|
|
--save-output
|
|
```
|
|
**Note:** Requires `aiter` package with MXFP4 kernel support
|
|
|
|
### Skipping Layers
|
|
|
|
By default, online quantization quantizes every linear layer in
|
|
the transformer. However, `--quantization-ignored-layers` can be used to keep specific layers in their original precision:
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path Tongyi-MAI/Z-Image-Turbo \
|
|
--quantization fp8 \
|
|
--quantization-ignored-layers attention.to_ \
|
|
--prompt "a beautiful sunset" \
|
|
--save-output
|
|
|
|
sglang generate \
|
|
--model-path Tongyi-MAI/Z-Image-Turbo \
|
|
--quantization mxfp4 \
|
|
--quantization-ignored-layers attention.to_ \
|
|
--prompt "a beautiful sunset" \
|
|
--save-output
|
|
```
|
|
|
|
Each pattern is matched against the full layer prefix (e.g. `layers.0.attention.to_q`). A layer is skipped and left unquantizd if its prefix contains any of the given patterns.
|
|
|
|
## Validated ModelOpt Checkpoints
|
|
|
|
This section is the canonical support matrix for the thirteen published
|
|
diffusion ModelOpt checkpoints currently wired up in SGLang docs and validation
|
|
coverage.
|
|
|
|
Published checkpoints keep the serialized quantization config as
|
|
`quant_method=modelopt`; the FP8 vs NVFP4 split below is a documentation label
|
|
derived from `quant_algo`.
|
|
|
|
Twelve of the thirteen repos live under `lmsys/*`. The FLUX.2 NVFP4 entry keeps
|
|
the official `black-forest-labs/FLUX.2-dev-NVFP4` repo.
|
|
|
|
<table style={{width: "100%", borderCollapse: "collapse", tableLayout: "fixed"}}>
|
|
<colgroup>
|
|
<col style={{width: "16.67%"}} />
|
|
<col style={{width: "16.67%"}} />
|
|
<col style={{width: "16.67%"}} />
|
|
<col style={{width: "16.67%"}} />
|
|
<col style={{width: "16.67%"}} />
|
|
<col style={{width: "16.67%"}} />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th>Quant Algo</th>
|
|
<th>Base Model</th>
|
|
<th>Preferred CLI</th>
|
|
<th>HF Repo</th>
|
|
<th>Current Scope</th>
|
|
<th>Notes</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>FP8</code></td>
|
|
<td><code>black-forest-labs/FLUX.1-dev</code></td>
|
|
<td><code>--transformer-path</code></td>
|
|
<td><code>lmsys/flux1-dev-modelopt-fp8-sglang-transformer</code></td>
|
|
<td>single-transformer override, deterministic latent/image comparison, H100 benchmark, torch-profiler trace</td>
|
|
<td>SGLang converter keeps a validated BF16 fallback set for modulation and FF projection layers; use <code>--model-id FLUX.1-dev</code> for local mirrors</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>FP8</code></td>
|
|
<td><code>black-forest-labs/FLUX.2-dev</code></td>
|
|
<td><code>--transformer-path</code></td>
|
|
<td><code>lmsys/flux2-dev-modelopt-fp8-sglang-transformer</code></td>
|
|
<td>single-transformer override load and generation path</td>
|
|
<td>published SGLang-ready transformer override</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>FP8</code></td>
|
|
<td><code>Wan-AI/Wan2.2-T2V-A14B-Diffusers</code></td>
|
|
<td><code>--transformer-path</code></td>
|
|
<td><code>lmsys/wan22-t2v-a14b-modelopt-fp8-sglang-transformer</code></td>
|
|
<td>primary <code>transformer</code> quantized, <code>transformer_2</code> kept BF16</td>
|
|
<td>primary-transformer-only path; keep <code>transformer_2</code> on the base checkpoint, and do not describe this as dual-transformer full-model FP8 unless that path is validated separately</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>FP8</code></td>
|
|
<td><code>hunyuanvideo-community/HunyuanVideo</code></td>
|
|
<td><code>--transformer-path</code></td>
|
|
<td><code>lmsys/hunyuanvideo-modelopt-fp8-sglang-transformer</code></td>
|
|
<td>single-transformer override, BF16-vs-FP8 video comparison, H100 benchmark, torch-profiler trace</td>
|
|
<td>HunyuanVideo uses different ModelOpt/diffusers and SGLang runtime module names; the converter maps those names before writing FP8 scale tensors and BF16 fallback ignores</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>FP8</code></td>
|
|
<td><code>Qwen/Qwen-Image</code></td>
|
|
<td><code>--transformer-path</code></td>
|
|
<td><code>lmsys/qwen-image-modelopt-fp8-sglang-transformer</code></td>
|
|
<td>single-transformer override, BF16-vs-FP8 image comparison, H100 benchmark, torch-profiler trace</td>
|
|
<td>shares the Qwen Image FP8 fallback preset; keep <code>img_in</code>, <code>txt_in</code>, timestep embedder, <code>norm_out.linear</code>, <code>proj_out</code>, <code>img_mod</code>/<code>txt_mod</code>, and <code>img_mlp.net.2</code> in BF16</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>FP8</code></td>
|
|
<td><code>Qwen/Qwen-Image-Edit-2511</code></td>
|
|
<td><code>--transformer-path</code></td>
|
|
<td><code>lmsys/qwen-image-edit-modelopt-fp8-sglang-transformer</code></td>
|
|
<td>TI2I edit path, BF16-vs-FP8 image comparison, H100 benchmark</td>
|
|
<td>shares <code>QwenImageTransformer2DModel</code> with Qwen Image and uses the same Qwen Image FP8 fallback preset</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>NVFP4</code></td>
|
|
<td><code>black-forest-labs/FLUX.1-dev</code></td>
|
|
<td><code>--transformer-path</code></td>
|
|
<td><code>lmsys/flux1-dev-modelopt-nvfp4-sglang-transformer</code></td>
|
|
<td>mixed BF16+NVFP4 transformer override, correctness validation, 4x RTX 5090 benchmark, torch-profiler trace</td>
|
|
<td>use <code>build_modelopt_nvfp4_transformer.py</code>; validated builder keeps selected FLUX.1 modules in BF16 and sets <code>swap_weight_nibbles=false</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>NVFP4</code></td>
|
|
<td><code>black-forest-labs/FLUX.2-dev</code></td>
|
|
<td><code>--transformer-weights-path</code></td>
|
|
<td><code>black-forest-labs/FLUX.2-dev-NVFP4</code></td>
|
|
<td>packed-QKV load path</td>
|
|
<td>official raw export repo; validated packed export detection and runtime layout handling</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>NVFP4</code></td>
|
|
<td><code>Wan-AI/Wan2.2-T2V-A14B-Diffusers</code></td>
|
|
<td><code>--transformer-path</code></td>
|
|
<td><code>lmsys/wan22-t2v-a14b-modelopt-nvfp4-sglang-transformer</code></td>
|
|
<td>primary <code>transformer</code> quantized with ModelOpt NVFP4, <code>transformer_2</code> kept BF16</td>
|
|
<td>primary-transformer-only path; keep <code>transformer_2</code> on the base checkpoint; the default FP4 GEMM backend is <code>flashinfer_trtllm</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>NVFP4</code></td>
|
|
<td><code>Qwen/Qwen-Image</code></td>
|
|
<td><code>--model-path</code></td>
|
|
<td><code>lmsys/qwen-image-modelopt-nvfp4-sglang</code></td>
|
|
<td>full ModelOpt NVFP4 Diffusers repo, BF16-vs-NVFP4 B200 image comparison</td>
|
|
<td>full repo loaded directly; exported with ModelOpt PR #1706 SVDQuant NVFP4 (<code>--format fp4</code>, max calibration, block size 16) and BF16 fallbacks for attention-sensitive modules plus first/last transformer blocks</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>NVFP4</code></td>
|
|
<td><code>Qwen/Qwen-Image-2512</code></td>
|
|
<td><code>--model-path</code></td>
|
|
<td><code>lmsys/qwen-image-2512-modelopt-nvfp4-sglang</code></td>
|
|
<td>full ModelOpt NVFP4 Diffusers repo, BF16-vs-NVFP4 B200 image comparison, B200 CI case</td>
|
|
<td>same full-repo loader path as Qwen Image; this is the Qwen Image NVFP4 representative in <code>multimodal-gen-test-1-b200</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>NVFP4</code></td>
|
|
<td><code>Qwen/Qwen-Image-Edit</code></td>
|
|
<td><code>--model-path</code></td>
|
|
<td><code>lmsys/qwen-image-edit-modelopt-nvfp4-sglang</code></td>
|
|
<td>TI2I edit full ModelOpt NVFP4 Diffusers repo, BF16-vs-NVFP4 B200 image comparison</td>
|
|
<td>full repo loaded directly with normal image-edit inputs; exported with the same ModelOpt PR #1706 NVFP4 recipe</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>NVFP4</code></td>
|
|
<td><code>Qwen/Qwen-Image-Edit-2511</code></td>
|
|
<td><code>--model-path</code></td>
|
|
<td><code>lmsys/qwen-image-edit-2511-modelopt-nvfp4-sglang</code></td>
|
|
<td>TI2I edit full ModelOpt NVFP4 Diffusers repo, BF16-vs-NVFP4 B200 image comparison</td>
|
|
<td>full repo loaded directly with normal image-edit inputs; exported with the same ModelOpt PR #1706 NVFP4 recipe</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
These thirteen checkpoints are the intended ModelOpt documentation support
|
|
set. The B200 diffusion CI job (`multimodal-gen-test-1-b200`) uses a
|
|
representative NVFP4 subset and includes
|
|
`lmsys/qwen-image-2512-modelopt-nvfp4-sglang` for Qwen Image coverage.
|
|
|
|
## ModelOpt FP8
|
|
|
|
### Usage Examples
|
|
|
|
Converted ModelOpt FP8 transformer repos should be loaded as transformer
|
|
component overrides. If the repo or local directory already contains
|
|
`config.json`, use `--transformer-path`. Full Diffusers repos such as the
|
|
NVIDIA Wan2.2 FP8 checkpoint can be passed directly with `--model-path`.
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path black-forest-labs/FLUX.2-dev \
|
|
--transformer-path lmsys/flux2-dev-modelopt-fp8-sglang-transformer \
|
|
--prompt "A Logo With Bold Large Text: SGL Diffusion" \
|
|
--save-output
|
|
```
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path Wan-AI/Wan2.2-T2V-A14B-Diffusers \
|
|
--transformer-path lmsys/wan22-t2v-a14b-modelopt-fp8-sglang-transformer \
|
|
--prompt "a fox walking through neon rain" \
|
|
--save-output
|
|
```
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path hunyuanvideo-community/HunyuanVideo \
|
|
--transformer-path lmsys/hunyuanvideo-modelopt-fp8-sglang-transformer \
|
|
--height 544 --width 960 --num-frames 17 \
|
|
--prompt "A cinematic shot of a red sports car driving through rain at night" \
|
|
--save-output
|
|
```
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path Qwen/Qwen-Image \
|
|
--transformer-path lmsys/qwen-image-modelopt-fp8-sglang-transformer \
|
|
--prompt "A tiny astronaut reading a book under a glass greenhouse" \
|
|
--save-output
|
|
```
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path Qwen/Qwen-Image-Edit-2511 \
|
|
--transformer-path lmsys/qwen-image-edit-modelopt-fp8-sglang-transformer \
|
|
--image-path /path/to/input.png \
|
|
--prompt "Turn the scene into a warm watercolor illustration" \
|
|
--save-output
|
|
```
|
|
|
|
### Notes
|
|
|
|
- `--transformer-path` is the canonical flag for converted ModelOpt FP8
|
|
transformer component repos or directories that already carry `config.json`.
|
|
- If the override repo or local directory contains its own `config.json`,
|
|
SGLang reads the quantization config from that override instead of relying on
|
|
the base model config.
|
|
- `--transformer-weights-path` still works when you intentionally point at raw
|
|
weight files or a directory that should be metadata-probed as weights first.
|
|
- `dit_layerwise_offload` is supported for ModelOpt FP8 checkpoints.
|
|
- `dit_cpu_offload` still stays disabled for ModelOpt FP8 checkpoints.
|
|
- The layerwise offload path now preserves the non-contiguous FP8 weight stride
|
|
expected by the runtime FP8 GEMM path.
|
|
- On disk, the quantization config stays `quant_method=modelopt` with
|
|
`quant_algo=FP8`; the `modelopt-fp8` label in this document is a support
|
|
family name, not a serialized config key.
|
|
- To build the converted checkpoint yourself from a ModelOpt diffusers export,
|
|
use `python -m sglang.multimodal_gen.tools.build_modelopt_fp8_transformer`.
|
|
|
|
## ModelOpt NVFP4
|
|
|
|
### Usage Examples
|
|
|
|
For mixed ModelOpt NVFP4 transformer overrides that already contain
|
|
`config.json`, keep the base model and quantized transformer separate and use
|
|
`--transformer-path`:
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path black-forest-labs/FLUX.1-dev \
|
|
--transformer-path lmsys/flux1-dev-modelopt-nvfp4-sglang-transformer \
|
|
--prompt "A Logo With Bold Large Text: SGL Diffusion" \
|
|
--save-output
|
|
```
|
|
|
|
For raw NVFP4 exports such as the official FLUX.2 release, use
|
|
`--transformer-weights-path`:
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path black-forest-labs/FLUX.2-dev \
|
|
--transformer-weights-path black-forest-labs/FLUX.2-dev-NVFP4 \
|
|
--prompt "A Logo With Bold Large Text: SGL Diffusion" \
|
|
--save-output
|
|
```
|
|
|
|
SGLang also supports passing the NVFP4 repo or local directory directly as
|
|
`--model-path`:
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path black-forest-labs/FLUX.2-dev-NVFP4 \
|
|
--prompt "A Logo With Bold Large Text: SGL Diffusion" \
|
|
--save-output
|
|
```
|
|
|
|
For a dual-transformer Wan2.2 export where only the primary `transformer`
|
|
was quantized:
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path Wan-AI/Wan2.2-T2V-A14B-Diffusers \
|
|
--transformer-path lmsys/wan22-t2v-a14b-modelopt-nvfp4-sglang-transformer \
|
|
--prompt "a fox walking through neon rain" \
|
|
--save-output
|
|
```
|
|
|
|
For full Qwen Image NVFP4 exports, load the published repo directly:
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path lmsys/qwen-image-2512-modelopt-nvfp4-sglang \
|
|
--prompt "A tiny astronaut reading a book under a glass greenhouse" \
|
|
--save-output
|
|
```
|
|
|
|
For high-resolution Qwen-Image-family generations on B200, the FlashInfer
|
|
CUTLASS FP4 GEMM backend can be faster than the default TensorRT-LLM backend:
|
|
|
|
```bash
|
|
SGLANG_DIFFUSION_FLASHINFER_FP4_GEMM_BACKEND=cutlass \
|
|
sglang generate \
|
|
--model-path lmsys/qwen-image-2512-modelopt-nvfp4-sglang \
|
|
--width 2048 --height 2048 \
|
|
--prompt "A tiny astronaut reading a book under a glass greenhouse" \
|
|
--save-output
|
|
```
|
|
|
|
### Notes
|
|
|
|
- Use `--transformer-path` for mixed ModelOpt NVFP4 transformer repos or local
|
|
directories that already include `config.json`.
|
|
- Use `--transformer-weights-path` for raw NVFP4 exports, individual
|
|
safetensors files, or repo layouts that should be treated as weights first.
|
|
- For dual-transformer pipelines such as `Wan2.2-T2V-A14B-Diffusers`, the
|
|
primary `--transformer-path` override targets only `transformer`. Use a
|
|
per-component override such as `--transformer-2-path` only when you
|
|
intentionally want a non-default `transformer_2`.
|
|
- On Blackwell, the diffusion ModelOpt NVFP4 path defaults to FlashInfer
|
|
TensorRT-LLM FP4 GEMM (`flashinfer_trtllm`).
|
|
- The published Qwen Image NVFP4 exports keep the `img_mod`/`txt_mod`
|
|
modulation projections and first/last transformer blocks in BF16.
|
|
- Qwen-Image NVFP4 does not always improve latency at 1024x1024. On B200, the
|
|
validated ModelOpt exports were faster than BF16 at 2048x2048 with
|
|
`SGLANG_DIFFUSION_FLASHINFER_FP4_GEMM_BACKEND=cutlass`, while 1024x1024
|
|
remained BF16-faster.
|
|
- Direct `--model-path` loading is the canonical path for full Qwen Image
|
|
ModelOpt NVFP4 repos and a compatibility path for FLUX.2 NVFP4-style repos
|
|
or local directories.
|
|
- If `--transformer-weights-path` is provided explicitly, it takes precedence
|
|
over the compatibility `--model-path` flow.
|
|
- For local directories, SGLang first looks for `*-mixed.safetensors`, then
|
|
falls back to loading from the directory.
|
|
- To force the diffusion ModelOpt FP4 path onto a different FlashInfer
|
|
backend, set `SGLANG_DIFFUSION_FLASHINFER_FP4_GEMM_BACKEND`. Supported values
|
|
include `flashinfer_cudnn`, `flashinfer_cutlass`, and `flashinfer_trtllm`.
|
|
- On disk, the quantization config stays `quant_method=modelopt` with
|
|
`quant_algo=NVFP4`; the `modelopt-nvfp4` label here is again a documentation
|
|
family name rather than a serialized config key.
|
|
|
|
## Nunchaku (SVDQuant)
|
|
|
|
### Install
|
|
|
|
Install the runtime dependency first:
|
|
|
|
```bash
|
|
pip install nunchaku
|
|
```
|
|
|
|
For platform-specific installation methods and troubleshooting, see the
|
|
[Nunchaku installation guide](https://nunchaku.tech/docs/nunchaku/installation/installation.html).
|
|
|
|
### File Naming and Auto-Detection
|
|
|
|
For Nunchaku checkpoints, `--model-path` should still point to the original
|
|
base model, while `--transformer-weights-path` points to the quantized
|
|
transformer weights.
|
|
|
|
If the basename of `--transformer-weights-path` contains the pattern
|
|
`svdq-(int4|fp4)_r{rank}`, SGLang will automatically:
|
|
- enable SVDQuant
|
|
- infer `--quantization-precision`
|
|
- infer `--quantization-rank`
|
|
|
|
Examples:
|
|
|
|
<table style={{width: "100%", borderCollapse: "collapse", tableLayout: "fixed"}}>
|
|
<colgroup>
|
|
<col style={{width: "25%"}} />
|
|
<col style={{width: "25%"}} />
|
|
<col style={{width: "25%"}} />
|
|
<col style={{width: "25%"}} />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th>checkpoint name fragment</th>
|
|
<th>inferred precision</th>
|
|
<th>inferred rank</th>
|
|
<th>notes</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>svdq-int4_r32</code></td>
|
|
<td><code>int4</code></td>
|
|
<td><code>32</code></td>
|
|
<td>Standard INT4 checkpoint</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>svdq-int4_r128</code></td>
|
|
<td><code>int4</code></td>
|
|
<td><code>128</code></td>
|
|
<td>Higher-quality INT4 checkpoint</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>svdq-fp4_r32</code></td>
|
|
<td><code>nvfp4</code></td>
|
|
<td><code>32</code></td>
|
|
<td><code>fp4</code> in the filename maps to CLI value <code>nvfp4</code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>svdq-fp4_r128</code></td>
|
|
<td><code>nvfp4</code></td>
|
|
<td><code>128</code></td>
|
|
<td>Higher-quality NVFP4 checkpoint</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
Common filenames:
|
|
|
|
<table style={{width: "100%", borderCollapse: "collapse", tableLayout: "fixed"}}>
|
|
<colgroup>
|
|
<col style={{width: "25%"}} />
|
|
<col style={{width: "25%"}} />
|
|
<col style={{width: "25%"}} />
|
|
<col style={{width: "25%"}} />
|
|
</colgroup>
|
|
<thead>
|
|
<tr>
|
|
<th>filename</th>
|
|
<th>precision</th>
|
|
<th>rank</th>
|
|
<th>typical use</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td><code>svdq-int4_r32-qwen-image.safetensors</code></td>
|
|
<td><code>int4</code></td>
|
|
<td><code>32</code></td>
|
|
<td>Balanced default</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>svdq-int4_r128-qwen-image.safetensors</code></td>
|
|
<td><code>int4</code></td>
|
|
<td><code>128</code></td>
|
|
<td>Quality-focused</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>svdq-fp4_r32-qwen-image.safetensors</code></td>
|
|
<td><code>nvfp4</code></td>
|
|
<td><code>32</code></td>
|
|
<td>RTX 50-series / NVFP4 path</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>svdq-fp4_r128-qwen-image.safetensors</code></td>
|
|
<td><code>nvfp4</code></td>
|
|
<td><code>128</code></td>
|
|
<td>Quality-focused NVFP4</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>svdq-int4_r32-qwen-image-lightningv1.0-4steps.safetensors</code></td>
|
|
<td><code>int4</code></td>
|
|
<td><code>32</code></td>
|
|
<td>Lightning 4-step</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>svdq-int4_r128-qwen-image-lightningv1.1-8steps.safetensors</code></td>
|
|
<td><code>int4</code></td>
|
|
<td><code>128</code></td>
|
|
<td>Lightning 8-step</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
|
|
If your checkpoint name does not follow this convention, pass
|
|
`--enable-svdquant`, `--quantization-precision`, and `--quantization-rank`
|
|
explicitly.
|
|
|
|
### Usage Examples
|
|
|
|
Recommended auto-detected flow:
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path Qwen/Qwen-Image \
|
|
--transformer-weights-path /path/to/svdq-int4_r32-qwen-image.safetensors \
|
|
--prompt "a beautiful sunset" \
|
|
--save-output
|
|
```
|
|
|
|
Manual override when the filename does not encode the quant settings:
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path Qwen/Qwen-Image \
|
|
--transformer-weights-path /path/to/custom_nunchaku_checkpoint.safetensors \
|
|
--enable-svdquant \
|
|
--quantization-precision int4 \
|
|
--quantization-rank 128 \
|
|
--prompt "a beautiful sunset" \
|
|
--save-output
|
|
```
|
|
|
|
### Notes
|
|
|
|
- `--transformer-weights-path` is the canonical flag for Nunchaku checkpoints.
|
|
Older config names such as `quantized_model_path` are treated as
|
|
compatibility aliases.
|
|
- Auto-detection only happens when the checkpoint basename matches
|
|
`svdq-(int4|fp4)_r{rank}`.
|
|
- The CLI values are `int4` and `nvfp4`. In filenames, the NVFP4 variant is
|
|
written as `fp4`.
|
|
- Lightning checkpoints usually expect matching `--num-inference-steps`, such
|
|
as `4` or `8`.
|
|
- Current runtime validation only allows Nunchaku on NVIDIA CUDA Ampere (SM8x)
|
|
or SM12x GPUs. Hopper (SM90) is currently rejected.
|
|
|
|
## [ModelSlim](https://gitcode.com/Ascend/msmodelslim)
|
|
MindStudio-ModelSlim (msModelSlim) is a model offline quantization compression tool launched by MindStudio and optimized for Ascend hardware.
|
|
|
|
- **Installation**
|
|
|
|
```bash
|
|
# Clone repo and install msmodelslim:
|
|
git clone https://gitcode.com/Ascend/msmodelslim.git
|
|
cd msmodelslim
|
|
bash install.sh
|
|
```
|
|
|
|
- **Multimodal_sd quantization**
|
|
|
|
Download the original floating-point weights of the large model. Taking Wan2.2-T2V-A14B as an example, you can go to [Wan2.2-T2V-A14B](https://modelscope.cn/models/Wan-AI/Wan2.2-T2V-A14B) to obtain the original model weights. Then install other dependencies (related to the model, refer to the modelscope model card).
|
|
> Note: You can find pre-quantized validated models on [modelscope/Eco-Tech](https://modelscope.cn/models/Eco-Tech).
|
|
|
|
Run quantization using one-click quantization (recommended):
|
|
|
|
```bash
|
|
msmodelslim quant \
|
|
--model_path /path/to/wan2_2_float_weights \
|
|
--save_path /path/to/wan2_2_quantized_weights \
|
|
--device npu \
|
|
--model_type Wan2_2 \
|
|
--quant_type w8a8 \
|
|
--trust_remote_code True
|
|
```
|
|
|
|
For more detailed examples of quantization of models, as well as information about their support, see the [examples](https://gitcode.com/Ascend/msmodelslim/blob/master/example/multimodal_sd/README.md) section in ModelSLim repo.
|
|
|
|
> Note: SGLang does not support quantized embeddings, please disable this option when quantizing using msmodelslim.
|
|
|
|
- **Auto-Detection and different formats**
|
|
|
|
For msmodelslim checkpoints, it's enough to specify only ```--model-path```, the detection of quantization occurs automatically for each layer using parsing of `quant_model_description.json` config.
|
|
|
|
In the case of `Wan2.2` only `Diffusers` weights storage format are supported, whereas modelslim saves the quantized model in the original `Wan2.2` format.
|
|
For conversion, use the one-step `wan_repack.py` script:
|
|
|
|
```bash
|
|
python wan_repack.py \
|
|
--model-type Wan2.2-TI2V-5B \
|
|
--original-model-path {path_to_original_diffusers_model} \
|
|
--quant-path {path_to_quantized_model} \
|
|
--output-path {path_to_converted_model}
|
|
```
|
|
|
|
Supported `--model-type` values: `Wan2.2-TI2V-5B` (single-transformer), `Wan2.2-T2V-A14B` and `Wan2.2-I2V-A14B` (Cascade dual-transformer).
|
|
The script automatically handles: copying the base model, converting quantized weights to Diffusers format, and restoring `config.json`.
|
|
|
|
- **Usage Example**
|
|
|
|
With auto-detected flow:
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path Eco-Tech/Wan2.2-T2V-A14B-Diffusers-w8a8 \
|
|
--prompt "a beautiful sunset" \
|
|
--save-output
|
|
```
|
|
|
|
- **Available Quantization Methods**:
|
|
- [x] ```W4A4_DYNAMIC``` linear with online quantization of activations
|
|
- [x] ```W8A8``` linear with offline quantization of activations
|
|
- [x] ```W8A8_DYNAMIC``` linear with online quantization of activations
|
|
- [x] ```W8A8_MXFP8``` linear with offline quantization (msmodelslim pre-quantized weights)
|
|
- [x] ```mxfp8``` linear with online quantization (`--quantization mxfp8`)
|
|
- [x] ```W4A4_MXFP4``` / ```W4A4_MXFP4_DUALSCALE``` linear with offline quantization (msmodelslim pre-quantized weights)
|
|
- [x] ```mxfp4_npu``` linear with online quantization (`--quantization mxfp4_npu`)
|
|
|
|
## MXFP8 Online Quantization
|
|
|
|
For online MXFP8 quantization, load the original FP16/BF16 model and add `--quantization mxfp8`.
|
|
Weights are quantized at load time via `npu_dynamic_mx_quant`, and activations are quantized per-token
|
|
during inference with `npu_quant_matmul` (block_size=32).
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path Wan-AI/Wan2.2-T2V-A14B-Diffusers \
|
|
--quantization mxfp8 \
|
|
--prompt "a fox walking through neon rain" \
|
|
--save-output
|
|
```
|
|
|
|
> **Hardware requirement:** Ascend A5 series or newer. `npu_dynamic_mx_quant` is not available on A2/A3.
|
|
|
|
## MXFP8 Offline Quantization (msmodelslim)
|
|
|
|
Pre-quantized MXFP8 weights exported by msmodelslim are auto-detected via `quant_model_description.json`
|
|
(`W8A8_MXFP8` scheme). Use `wan_repack.py` to convert the quantized weights to Diffusers format,
|
|
then load the converted model with `--model-path`:
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path Eco-Tech/Wan2.2-T2V-A14B-Diffusers-mxfp8 \
|
|
--prompt "a beautiful sunset" \
|
|
--save-output
|
|
```
|
|
|
|
## MXFP4 Online Quantization
|
|
|
|
For online MXFP4 quantization on Ascend NPU, load the original FP16/BF16 model and add
|
|
`--quantization mxfp4_npu`. The `mxfp4_npu` key is used for Ascend because `mxfp4`
|
|
is reserved for the ROCm/aiter backend.
|
|
|
|
Weights are quantized at load time via `npu_dynamic_dual_level_mx_quant`, and activations
|
|
are quantized per-token during inference before `npu_dual_level_quant_matmul`. MXFP4 uses
|
|
dual-level block scales with an L1 block size of 32 and an L0 block size of 512.
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path Wan-AI/Wan2.2-T2V-A14B-Diffusers \
|
|
--quantization mxfp4_npu \
|
|
--prompt "a fox walking through neon rain" \
|
|
--save-output
|
|
```
|
|
|
|
> **Hardware requirement:** Ascend A5 series or newer. `npu_dynamic_dual_level_mx_quant`
|
|
> and `npu_dual_level_quant_matmul` are not available on A2/A3.
|
|
>
|
|
> **Note:** Online MXFP4 weight quantization is experimental. The offline msmodelslim
|
|
> flow uses pre-quantized weights and may produce different numerical results.
|
|
|
|
## MXFP4 Offline Quantization (msmodelslim)
|
|
|
|
Pre-quantized MXFP4 weights exported by msmodelslim are auto-detected via
|
|
`quant_model_description.json` (`W4A4_MXFP4` / `W4A4_MXFP4_DUALSCALE` scheme).
|
|
Use `wan_repack.py` to convert the quantized weights to Diffusers format, then load
|
|
the converted model with `--model-path`:
|
|
|
|
```bash
|
|
sglang generate \
|
|
--model-path {path_to_converted_mxfp4_model} \
|
|
--prompt "a beautiful sunset" \
|
|
--save-output
|
|
```
|
|
|
|
The offline MXFP4 checkpoint stores weights in an FP8 container and includes dual-level
|
|
scales (`weight_scale`, `weight_dual_scale`). If exported with smooth quantization,
|
|
`mul_scale` is loaded and applied before activation quantization to keep activations
|
|
aligned with the calibrated weights.
|