量化#

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

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

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

注意:为了获得更好的性能、可用性和便利性,建议优先使用离线量化而不是在线量化。

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

离线量化#

要加载已量化模型,只需加载模型权重和配置文件。再次强调,如果模型已离线量化,启动引擎时无需添加 --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

请注意,如果您的模型是按通道量化(INT8 或 FP8)并带有按 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 kernels 的 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

离线模型量化示例#

使用 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

在线量化#

要启用在线量化,您只需在命令行中指定 --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"]

注意:根据 此问题"int8dq" 方法目前与 CUDA 图捕获(cuda graph capture)一起使用时存在一些错误。因此,建议在使用 "int8dq" 方法时禁用 CUDA 图捕获。即,请使用以下命令

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

参考#