量化#

SGLang 支持多种量化方法,包括离线量化和在线动态量化。

离线量化在推理过程中直接加载预量化的模型权重。这对于 GPTQ 和 AWQ 等量化方法是必需的,这些方法需要使用校准数据集从原始权重中收集并预计算各种统计信息。

在线量化在运行时动态计算缩放参数(例如模型权重的最大值/最小值)。类似于 NVIDIA FP8 训练的 延迟缩放 (delayed scaling) 机制,在线量化实时计算适当的缩放因子,将高精度权重转换为低精度格式。

注意:为了获得更好的性能、易用性和便利性,推荐使用离线量化而非在线量化。

如果您使用预量化模型,请勿同时添加 --quantization 来启用在线量化。对于常用的预量化模型,请访问 HF 上的 UnslothNVIDIA ModelOptNeuralMagic 合集,以获取经过质量验证的热门量化模型。量化后的模型必须通过基准测试进行验证,以防止异常的量化损失回退。

离线量化#

要加载已量化的模型,只需加载模型权重和配置即可。再次强调,如果模型已经过离线量化,启动引擎时无需添加 --quantization 参数。量化方法将从下载的 Hugging Face 配置中解析。例如,DeepSeek V3/R1 模型已经是 FP8 格式,因此请勿添加冗余参数。

python3 -m sglang.launch_server \
    --model-path hugging-quants/Meta-Llama-3.1-8B-Instruct-AWQ-INT4 \
    --port 30000 --host 0.0.0.0

请注意,如果您的模型是 per-channel 量化(INT8 或 FP8)且带有 per-token 动态量化激活,您可以选择添加 --quantization w8a8_int8--quantization w8a8_fp8,以调用 sgl-kernel 中相应的 CUTLASS int8_kernel 或 fp8_kernel。此操作将忽略 Hugging Face 配置中的量化设置。例如,对于 neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8-dynamic,如果您使用 --quantization w8a8_fp8 执行,系统将使用 SGLang 的 W8A8Fp8Config 来调用 sgl-kernel,而不是使用 vLLM kernel 的 CompressedTensorsConfig

python3 -m sglang.launch_server \
    --model-path neuralmagic/Meta-Llama-3.1-8B-Instruct-FP8-dynamic \
    --quantization w8a8_fp8 \
    --port 30000 --host 0.0.0.0

离线模型量化示例#

使用 Unsloth#

我们强烈建议使用 Unsloth 进行模型量化和加载。请参考 Unsloth 的 SGLang 部署与推理指南

使用 auto-round#

# Install
pip install auto-round
  • LLM 量化

# for LLM
from auto_round import AutoRound
model_id = "meta-llama/Llama-3.2-1B-Instruct"
quant_path = "Llama-3.2-1B-Instruct-autoround-4bit"
# Scheme examples: "W2A16", "W3A16", "W4A16", "W8A16", "NVFP4", "MXFP4" (no real kernels), "GGUF:Q4_K_M", etc.
scheme = "W4A16"
format = "auto_round"
autoround = AutoRound(model_id, scheme=scheme)
autoround.quantize_and_save(quant_path, format=format) # quantize and save

  • VLM 量化

# for VLMs
from auto_round import AutoRoundMLLM
model_name = "Qwen/Qwen2-VL-2B-Instruct"
quant_path = "Qwen2-VL-2B-Instruct-autoround-4bit"
scheme = "W4A16"
format = "auto_round"
autoround = AutoRoundMLLM(model_name, scheme)
autoround.quantize_and_save(quant_path, format=format) # quantize and save

  • 命令行用法 (Gaudi/CPU/Intel GPU/CUDA)

auto-round \
    --model meta-llama/Llama-3.2-1B-Instruct \
    --bits 4 \
    --group_size 128 \
    --format "auto_round" \
    --output_dir ./tmp_autoround
  • 已知问题

目前 sglang 在加载离线量化模型时受到一些限制,这些问题可能会在 sglang 的未来更新中得到解决。如果您遇到任何问题,可以考虑使用 Hugging Face Transformers 作为替代方案。

  1. 混合比特量化限制

    目前尚未完全支持混合比特量化。由于 vLLM 的层融合(例如 QKV 融合),对同一融合层内的组件应用不同的比特宽度可能会导致兼容性问题。

  2. 对量化 MoE 模型的支持有限

    由于算子 (kernel) 限制(例如不支持 mlp.gate 层量化),量化 MoE 模型可能会遇到推理问题。请尝试跳过这些层的量化以避免此类错误。

  3. 对量化 VLM 的支持有限

    VLM 失败案例

    Qwen2.5-VL-7B

    auto_round:auto_gptq 格式:准确率接近于零。

    GPTQ 格式:运行失败并报错

    The output size is not aligned with the quantized weight shape
    

    auto_round:auto_awq 和 AWQ 格式:运行正常。

使用 GPTQModel#

# install
pip install gptqmodel --no-build-isolation -v
from datasets import load_dataset
from gptqmodel import GPTQModel, QuantizeConfig

model_id = "meta-llama/Llama-3.2-1B-Instruct"
quant_path = "Llama-3.2-1B-Instruct-gptqmodel-4bit"

calibration_dataset = load_dataset(
    "allenai/c4", data_files="en/c4-train.00001-of-01024.json.gz",
    split="train"
  ).select(range(1024))["text"]

quant_config = QuantizeConfig(bits=4, group_size=128) # quantization config
model = GPTQModel.load(model_id, quant_config) # load model

model.quantize(calibration_dataset, batch_size=2) # quantize
model.save(quant_path) # save model

使用 LLM Compressor#

# install
pip install llmcompressor

在此,我们以将 meta-llama/Meta-Llama-3-8B-Instruct 量化为 FP8 为例,详细说明如何进行离线量化。

from transformers import AutoTokenizer
from llmcompressor.transformers import SparseAutoModelForCausalLM
from llmcompressor.transformers import oneshot
from llmcompressor.modifiers.quantization import QuantizationModifier

# Step 1: Load the original model.
MODEL_ID = "meta-llama/Meta-Llama-3-8B-Instruct"

model = SparseAutoModelForCausalLM.from_pretrained(
  MODEL_ID, device_map="auto", torch_dtype="auto")
tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)

# Step 2: Perform offline quantization.
# Step 2.1: Configure the simple PTQ quantization.
recipe = QuantizationModifier(
  targets="Linear", scheme="FP8_DYNAMIC", ignore=["lm_head"])

# Step 2.2: Apply the quantization algorithm.
oneshot(model=model, recipe=recipe)

# Step 3: Save the model.
SAVE_DIR = MODEL_ID.split("/")[1] + "-FP8-Dynamic"
model.save_pretrained(SAVE_DIR)
tokenizer.save_pretrained(SAVE_DIR)

然后,您可以通过以下命令直接在 SGLang 中使用该量化模型

python3 -m sglang.launch_server \
    --model-path $PWD/Meta-Llama-3-8B-Instruct-FP8-Dynamic \
    --port 30000 --host 0.0.0.0

使用 NVIDIA ModelOpt#

NVIDIA Model Optimizer (ModelOpt) 提供了针对 NVIDIA 硬件优化的先进量化技术。SGLang 包含了一个精简的工作流,用于使用 ModelOpt 量化模型并自动导出以供部署。

安装#

首先,安装 ModelOpt。您可以直接安装,也可以将其作为 SGLang 的可选依赖项安装

# Option 1: Install ModelOpt directly
pip install nvidia-modelopt

# Option 2: Install SGLang with ModelOpt support (recommended)
pip install sglang[modelopt]
量化与导出工作流#

SGLang 提供了一个示例脚本,演示了完整的 ModelOpt 量化和导出工作流

# Quantize and export a model using ModelOpt FP8 quantization
python examples/usage/modelopt_quantize_and_export.py quantize \
    --model-path TinyLlama/TinyLlama-1.1B-Chat-v1.0 \
    --export-dir ./quantized_tinyllama_fp8 \
    --quantization-method modelopt_fp8

# For FP4 quantization
python examples/usage/modelopt_quantize_and_export.py quantize \
    --model-path TinyLlama/TinyLlama-1.1B-Chat-v1.0 \
    --export-dir ./quantized_tinyllama_fp4 \
    --quantization-method modelopt_fp4
可用的量化方法#
  • modelopt_fp8:在 NVIDIA Hopper 和 Blackwell GPU 上具有最佳性能的 FP8 量化

  • modelopt_fp4:在 NVIDIA Blackwell GPU 上具有最佳性能的 FP4 量化

Python API 用法#

您也可以通过编程方式使用 ModelOpt 量化

import sglang as sgl
from sglang.srt.configs.device_config import DeviceConfig
from sglang.srt.configs.load_config import LoadConfig
from sglang.srt.configs.model_config import ModelConfig
from sglang.srt.model_loader.loader import get_model_loader

# Configure model with ModelOpt quantization and export
model_config = ModelConfig(
    model_path="TinyLlama/TinyLlama-1.1B-Chat-v1.0",
    quantization="modelopt_fp8",  # or "modelopt_fp4"
    trust_remote_code=True,
)

load_config = LoadConfig(
    modelopt_export_path="./exported_model",
    modelopt_checkpoint_save_path="./checkpoint.pth",  # optional, fake quantized checkpoint
)
device_config = DeviceConfig(device="cuda")

# Load and quantize the model (export happens automatically)
model_loader = get_model_loader(load_config, model_config)
quantized_model = model_loader.load_model(
    model_config=model_config,
    device_config=device_config,
)
部署量化模型#

量化并导出后,您可以使用 SGLang 部署该模型

# Deploy the exported quantized model
python -m sglang.launch_server \
    --model-path ./quantized_tinyllama_fp8 \
    --quantization modelopt \
    --port 30000 --host 0.0.0.0

或使用 Python API

import sglang as sgl

# Deploy exported ModelOpt quantized model
llm = sgl.Engine(
    model_path="./quantized_tinyllama_fp8",
    quantization="modelopt"
)

# Run inference
prompts = ["Hello, how are you?", "What is the capital of France?"]
sampling_params = {"temperature": 0.8, "top_p": 0.95, "max_new_tokens": 100}
outputs = llm.generate(prompts, sampling_params)

for i, output in enumerate(outputs):
    print(f"Prompt: {prompts[i]}")
    print(f"Output: {output.outputs[0].text}")
高级功能#

检查点管理:保存并恢复伪量化 (fake quantized) 检查点以便重复使用

# Save the fake quantized checkpoint during quantization
python examples/usage/modelopt_quantize_and_export.py quantize \
    --model-path meta-llama/Llama-3.2-1B-Instruct \
    --export-dir ./quantized_model \
    --quantization-method modelopt_fp8 \
    --checkpoint-save-path ./my_checkpoint.pth

# The checkpoint can be reused for future quantization runs and skip calibration

仅导出工作流:如果您已有现成的伪量化 ModelOpt 检查点,可以直接将其导出

from sglang.srt.configs.device_config import DeviceConfig
from sglang.srt.configs.load_config import LoadConfig
from sglang.srt.configs.model_config import ModelConfig
from sglang.srt.model_loader.loader import get_model_loader

model_config = ModelConfig(
    model_path="meta-llama/Llama-3.2-1B-Instruct",
    quantization="modelopt_fp8",
    trust_remote_code=True,
)

load_config = LoadConfig(
    modelopt_checkpoint_restore_path="./my_checkpoint.pth",
    modelopt_export_path="./exported_model",
)

# Load and export the model
model_loader = get_model_loader(load_config, model_config)
model_loader.load_model(model_config=model_config, device_config=DeviceConfig())
ModelOpt 的优势#
  • 硬件优化:专门针对 NVIDIA GPU 架构进行了优化

  • 先进量化:支持前沿的 FP8 和 FP4 量化技术

  • 无缝集成:自动导出为 HuggingFace 格式,方便部署

  • 基于校准:使用校准数据集以获得最佳量化质量

  • 生产就绪:由 NVIDIA 支持的企业级量化方案

在线量化#

要启用在线量化,只需在命令行中指定 --quantization 即可。例如,您可以使用以下命令启动服务器,为 meta-llama/Meta-Llama-3.1-8B-Instruct 模型启用 FP8 量化

python3 -m sglang.launch_server \
    --model-path meta-llama/Meta-Llama-3.1-8B-Instruct \
    --quantization fp8 \
    --port 30000 --host 0.0.0.0

我们的团队正在努力支持更多在线量化方法。SGLang 很快将支持包括但不限于 ["awq", "gptq", "marlin", "gptq_marlin", "awq_marlin", "bitsandbytes", "gguf"] 在内的方法。

SGLang 还支持基于 torchao 的量化方法。您只需在命令行中指定 --torchao-config 即可支持此功能。例如,如果您想为 meta-llama/Meta-Llama-3.1-8B-Instruct 模型启用 int4wo-128,可以使用以下命令启动服务器

python3 -m sglang.launch_server \
    --model-path meta-llama/Meta-Llama-3.1-8B-Instruct \
    --torchao-config int4wo-128 \
    --port 30000 --host 0.0.0.0

SGLang 支持以下基于 torchao 的量化方法:["int8dq", "int8wo", "fp8wo", "fp8dq-per_tensor", "fp8dq-per_row", "int4wo-32", "int4wo-64", "int4wo-128", "int4wo-256"]

注意:根据此 issue,使用 "int8dq" 方法与 cuda graph capture 配合时目前存在一些 bug。因此我们建议在使用 "int8dq" 方法时禁用 cuda graph capture。即请使用以下命令

python3 -m sglang.launch_server \
    --model-path meta-llama/Meta-Llama-3.1-8B-Instruct \
    --torchao-config int8dq \
    --disable-cuda-graph \
    --port 30000 --host 0.0.0.0

参考资料#