Sglang量化推理#
Sglang 是一个快速服务的大型语言模型和视觉语言模型框架。通过共同设计后端运行时和前端语言,它可以使你与模型的交互更加快速和可控。
1.1 环境准备#
要使用 Sglang 进行量化推理,首先需要安装并配置 Sglang 环境:
pip install --upgrade pip
pip install "sglang[all]"
# Install FlashInfer CUDA kernels
pip install flashinfer -i https://flashinfer.ai/whl/cu121/torch2.4/
1.2 量化格式#
与 VLLM 相同。
1.3 使用LLMC量化模型#
1.3.1 校准数据#
在本章节中,我们使用Plieval和Wikitext两个学术数据集作为校准数据,有关于校准数据的下载和预处理请参考章节。
在实际使用中,建议应使用真实部署场景的数据进行离线量化校准。
1.3.2 量化算法的选择#
W8A16
在 W8A16 的量化设置下,大语言模型的精度通常不会出现明显问题。在这种情况下,我们建议使用最简单的 RTN(Round to Nearest)算法,该算法不需要额外的校准步骤,运行速度较快。
具体实现可以参考 RTN W8A16 的权重量化 配置文件
# configs/quantization/backend/sglang/rtn_w8a16.yml
quant:
method: RTN
weight:
bit: 8
symmetric: True
granularity: per_group
group_size: 128
need_pack: True
请注意,在此步骤中需要将 need_pack 参数设置为 True, 这会将8-bit的权重打包为torch.int32的格式供Sglang直接加载推理。
W4A16
在 W4A16 的量化设置下,RTN(Round to Nearest)不能保证精度无问题,因此需要使用一些高阶量化算法来维持模型的精度。在这种情况下,我们建议使用 LLMC 中的 AWQ 算法.
具体实现可以参考 AWQ W4A16 的权重量化 配置文件
# configs/quantization/backend/sglang/awq_w4a16.yml
quant:
method: Awq
weight:
bit: 4
symmetric: True
granularity: per_group
group_size: 128
need_pack: True
special:
trans: True
trans_version: v2
weight_clip: True
quant_out: True
请注意,在此步骤中需要将 need_pack 参数设置为 True, 这会将4-bit的权重打包为torch.int32的格式存储,供SGlang直接加载推理。
此外,如果 AWQ 无法满足精度需求,我们建议使用 章节介绍的 AWQ+OmniQuant 组合算法 来进一步提升精度。在此也给出相应的配置文件
W8A8
在 W8A8 的量化设置下,我们同样建议使用 AWQ 算法。AWQ 在大多数情况下的表现优于 SmoothQuant 和 OS+,能够提供更好的量化精度。
具体的实现可以参考 AWQ W8A8 的 配置文件。
# configs/quantization/backend/sglang/awq_w8a8.yml
quant:
method: Awq
weight:
bit: 8
symmetric: True
granularity: per_channel
group_size: -1
act:
bit: 8
symmetric: True
granularity: per_token
special:
trans: True
trans_version: v2
weight_clip: True
quant_out: True
此外,如果 AWQ 无法满足精度需求,我们建议使用 章节 介绍的 Quarot+GPTQ 组合算法 来进一步提升精度。在此也给出相应的配置文件
FP8-Dynamic
在 FP8 的量化中,LLMC 支持权重per-channel,激活动态per-token的量化,在这种情况下,使用RTN(Round to Nearest)算法就足够了。然而,我们仍然建议使用AWQ算法以获得更好的量化精度。具体的实现可以参考AWQ FP8的配置文件。
# configs/quantization/backend/vllm/fp8/awq_fp8.yml
quant:
method: Awq
quant_type: float_quant
weight:
# Support ["e4m3", "e5m2"]
bit: e4m3
symmetric: True
granularity: per_channel
use_qtorch: True
act:
# Support ["e4m3", "e5m2"]
bit: e4m3
symmetric: True
granularity: per_token
use_qtorch: True
special:
trans: True
trans_version: v2
weight_clip: True
quant_out: True
请确保将 quant_type 设置为 float_quant,表示浮点量化。同时,将 use_qtorch 设置为 True,因为 LLMC 的浮点量化实现依赖 QPyTorch 库中的部分功能。
您可以使用以下命令来安装 QPyTorch:
pip install qtorch
FP8-Static
在 FP8 的量化中,LLMC 同时也支持权重per-tensor,激活静态per-tensor的量化,在这种情况下,我们建议使用AWQ算法,调整下激活的范围,可以参考AWQ FP8静态量化的配置文件。
# configs/quantization/backend/vllm/fp8/awq_fp8_static.yml
quant:
method: Awq
quant_type: float-quant
weight:
# Support ["e4m3", "e5m2"]
bit: e4m3
symmetric: True
granularity: per_tensor
use_qtorch: True
act:
# Support ["e4m3", "e5m2"]
bit: e4m3
symmetric: True
granularity: per_tensor
use_qtorch: True
static: True
1.3.3 真实量化模型导出#
save:
save_sgl: True
save_path: /path/to/save_for_sglang_rtn_w8a16/
请注意,务必将 save_sgl 设置为 True。对于 W4A16 和 W8A16 的量化设置,LLMC 会将权重打包为 torch.int32 形式导出,便于 SGlang 直接加载,并且会同时导出量化参数。
对于 W8A8 的量化设置,LLMC 会将权重量化为 torch.int8 形式导出,便于 SGlang 直接加载,同时也会导出相关的量化参数。
1.3.4 运行LLMC#
修改运行脚本中的配置文件路径并运行:
# scripts/run_llmc.sh
llmc=llmc_path
export PYTHONPATH=$llmc:$PYTHONPATH
task_name=rtn_for_sglang
config=${llmc}/configs/quantization/backend/sglang/rtn_w8a16.yml
等LLMC运行结束后,真实量化的模型就会存储在save.save_path路径
1.4 使用Sglang推理模型#
1.4.1 推理服务#
默认情况下,它会在 http://localhost:10000 启动服务器。model_path替换成save.save_path路径下保存的量化模型即可。
启动服务:
python -m sglang.launch_server --model-path model_path
调用服务:
curl http://localhost:10000/generate \
-H "Content-Type: application/json" \
-d '{
"text": "Once upon a time,",
"sampling_params": {
"max_new_tokens": 16,
"temperature": 0
}
}'
同时,我们构建了一个使用 Sglang 进行推理的示例。
cd examples/backend/sglang
python infer_with_sglang.py