量化#
SGLang 支持多种量化方法,包括离线量化和在线动态量化。
离线量化在推理期间直接加载预量化的模型权重。这对于 GPTQ 和 AWQ 等量化方法是必需的,这些方法使用校准数据集收集和预计算原始权重的各种统计信息。
在线量化在运行时动态计算缩放参数,例如模型权重的最大/最小值。类似于 NVIDIA FP8 训练的 延迟缩放 机制,在线量化会实时计算适当的缩放因子,将高精度权重转换为低精度格式。
注意:为了获得更好的性能、可用性和便利性,建议优先使用离线量化而不是在线量化。
如果您使用预量化模型,请勿同时添加 --quantization
参数来启用在线量化。对于流行的预量化模型,请访问 HF 上的 ModelCloud 或 NeuralMagic 集合,以获取一些经过质量验证的流行量化模型。量化模型在量化后必须通过基准测试进行验证,以防止出现异常的量化损失衰退。
离线量化#
要加载已量化模型,只需加载模型权重和配置文件。再次强调,如果模型已离线量化,启动引擎时无需添加 --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