BladeLLM模型量化

针对LLM模型量化,BladeLLM提供了高效易用的量化功能,包括仅权重量化(weight_only_quant)和权重激活联合量化(act_and_weight_quant),集成了若干主流有效的量化算法,如GPTQ、 AWQ、 SmoothQuant等,同时支持INT8、INT4、FP8等多种数据类型的量化。本文为您介绍如何进行模型量化操作。

背景信息

  • 存在问题

    随着LLM技术和应用的快速发展,其参数和上下文规模也为推理部署带来了巨大挑战:

    • 显存开销过大:在显存开销方面,加载大模型权重本身就需要大量显存,序列长度叠加隐藏层规模使得计算缓存(KV Cache)也需要额外的显存开销。

    • 服务吞吐和延迟问题:在服务吞吐和延迟方面,上述显存开销也会制约LLM推理计算时的batch大小,进而制约LLM服务整体的吞吐;模型规模和上下文的增长,使得推理计算量相应增长,影响文本生成速度,叠加batch大小的制约,在高并发负载情况下会由于请求排队等待导致更严重的响应延迟问题。

  • 解决方案

    通过压缩模型权重和计算缓存能够有效降低部署的显存开销,并且有助于提升推理计算的batch上限,进而提升服务整体吞吐。此外int8/int4量化能够降低计算时从显存读取的数据大小,缓解LLM推理计算中仿存瓶颈,并且通过利用int8/int4的硬件算力也获取进一步加速效果。

    BladeLLM结合量化算法和系统优化实现,开发了功能完善性能优异的量化优化方案。量化工具提供相对灵活的校正数据传入方式,支持多卡模型量化。此外,BladeLLM提供了CPU offload功能,支持部分显存受限情况下的模型量化;提供自动混合精度功能,通过回退部分量化计算的方式支持量化精度调优。

创建量化任务

通过PAI-EAS部署弹性Job服务,以任务形式运行服务,完成模型的量化校准与转换。具体操作步骤如下:

  1. 登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入EAS

  2. 模型在线服务(EAS)页面,单击部署服务,然后在自定义模型部署区域,单击自定义部署

  3. 自定义部署页面,配置以下关键参数,更多参数配置说明,请参见控制台自定义部署参数说明

    参数

    描述

    基本信息

    服务名称

    自定义服务名称。例如bladellm_quant。

    环境信息

    部署方式

    选择镜像部署

    镜像配置

    官方镜像列表中选择blade-llm > blade-llm:0.11.0

    说明

    由于版本迭代迅速,部署时镜像版本选择最高版本即可。

    模型配置

    挂载待量化模型。以OSS挂载为例,您也可以选择其他挂载方式。单击OSS并配置以下参数:

    • Uri:选择量化模型所在的OSS存储目录。如何创建对象存储OSS目录和上传文件,请参见控制台快速入门

    • 挂载路径:配置挂载到服务实例中的目标路径。例如/mnt/model

    • 是否只读:开关关闭。

    运行命令

    配置模型量化命令:blade_llm_quantize --model /mnt/model/Qwen2-1.5B --output_dir /mnt/model/Qwen2-1.5B-qt/ --quant_algo gptq --calib_data ['hello world!']

    其中:

    • --model:配置量化模型输入路径。

    • --output_dir:配置量化模型输出路径。

    • --quant_algo:用来指定一个量化算法,默认量化算法为MinMax。如果使用默认量化算法,则不需要指定--calib_data

    输入/输出路径需和模型配置中挂载的OSS路径相匹配。支持配置的更多量化参数,请参见模型量化参数配置说明

    端口号

    选择镜像后,系统会自动配置端口号8081,无需手动修改。

    资源信息

    资源类型

    本方案选择公共资源。您可以按需选择其他资源类型。

    部署资源

    选择资源规格,用于运行BladeLLM量化命令。所选规格显存只需略高于量化模型所需的显存即可。模型显存计算公式如下:

    。以7B FP16模型为例,模型占用的显存通常约为

    服务功能

    任务模式

    打开开关,创建EAS弹性Job服务。

  4. 参数配置完成后,单击部署

    服务状态已完成时,表明模型量化完成。您可以前往OSS(您使用的数据源)输出路径中查看已生成的量化模型,并参考BladeLLM快速入门,在EAS上部署该模型。

量化技术介绍

本章节将详细介绍BladeLLM量化工具所涉及的不同量化方式、量化算法及其应用场景,并提供部分参数的具体使用说明。

量化模式

BladeLLM支持weight_only_quantact_and_weight_quant两种量化模式,可通过参数quant_mode指定。

  • weight_only_quant

    • 定义:仅对模型权重进行量化。

    • 特点:相比act-and-weight量化,weight-only量化通常能更容易地保持模型精度。在某些情况下,LLM部署的主要瓶颈在于显存带宽,而weight-only量化则是综合考虑模型性能和精度的更佳方案。

    • 支持的数据类型:支持8 bit4 bit,默认均为有符号的对称量化。

    • 量化粒度:支持per_channel量化和block-wise量化。

    • 支持的算法:包括minmax 、gptq 、awq 、smoothquant+ 。

  • act_and_weight_quant

    • 定义:同时对模型权重和激活值进行量化。

    • 特点:相比weight-only量化,能够真正启用低比特密集计算,明显提升算子执行速度。

    • 支持的数据类型:支持8 bit,默认为有符号的对称量化。

    • 量化粒度:对激活值采用per-token动态量化,对权重则采用per-channel静态量化,暂不支持block-wise量化。

    • 支持的算法:包括minmaxsmoothquantsmoothquant_gptq 。

目前两种量化模式支持的硬件及量化数据类型情况如下:

硬件类型

weight_only_quant

act_and_weight_quant

INT8

INT4

FP8

INT8

FP8

Ampere (SM80/SM86)

GU100/GU30

Y

Y

N

Y

N

Ada Lovelace (SM89)

L20

N

N

N

Y

Y

Hopper (SM90)

GU120/GU108

N

N

N

Y

Y

block_wise_quant

此前模型参数量化一般采用per-channel量化,即每个输出通道共享一组量化参数。目前针对weight_only_quant量化,为进一步减小LLM模型量化损失,很多量化方法均采用更细粒度的量化设置,即进一步在每个输出通道内进行划分,均分为多个小分块,每个小分块采用单独的量化参数,BladeLLM将小分块的大小固定为64,即每64个参数共享一组量化参数。

举例说明:对于参数,输入、输出通道数目分别为​。

  • 若采用per-channel量化,则量化参数 ​。

  • 若采用block-wise量化,则量化参数

上述示例说明:block_wise量化将采用更细粒度的量化参数,理论上将获得更好的量化精度(尤其在4bit weight-only量化时),但同时也会略微降低模型的量化性能。

量化算法

BladeLLM中提供若干量化算法,可通过参数quant_algo指定。

  • MinMax

    MinMax是一种简单直接的量化算法,即就近舍入(round-to-nearest, RTN)。

    该算法同时适用于weight-only量化和act-and-weight量化,无需校准数据,量化过程快。

  • GPTQ

    GPTQ是一种基于近似二阶信息进行量化微调的weight-only量化算法,能够有效保持量化精度,且量化过程相对高效。GPTQ对每个通道(或分块)内的参数按序进行逐个量化,每个参数量化后将根据量化误差,借助由激活值计算得到的海森矩阵的逆矩阵对该通道(或分块)内的参数进行适当调整,以弥补量化造成的精度损失。

    该算法支持block-wise量化,需提供一定数量的校准数据,在大多数情况下量化精度优于MinMax算法。

  • AWQ

    AWQ是一种基于激活值感知的weight-only量化算法,该算法认为不同权重的重要性不同,存在一小部分(0.1%-1%)重要参数(salient weights),取消这部分参数的量化会明显减小量化损失。经实验发现,与规模较大的激活值相关的参数通道更具重要性,故根据激活值的分布确定重要参数通道的选择。具体地,AWQ会在量化前通过对重要参数乘以一个相对较大的缩放因子来减小该部分参数的量化损失。

    该算法支持block-wise量化,需提供一定数量的校准数据,部分情况下其精度优于GPTQ,但量化校准耗时更长。一个量化校准耗时的例子是,Qwen-72B4卡的V100-32G上做量化校准,gptq耗时大约为25min,awq耗时大约为100min。

  • SmoothQuant

    SmoothQuant是一种有效提升LLM模型W8A8量化的后训练量化算法,是一种典型的act-and-weight量化。通常认为模型量化时激活值相比模型权重更难量化,且异常值更是激活值量化的主要难点。而SmoothQuant发现LLM模型中激活的异常值往往相对统一地出现在一部分通道中,不随token发生变化。基于该发现,SmoothQuant通过数学等价变换将量化难度从激活值转移至权重上,实现了对激活中异常值的平滑处理。

    该算法需提供一定数量的校准数据,在大多数情况下量化精度优于MinMax算法,目前暂不支持block-wise量化。

  • SmoothQuant+

    SmoothQuant+是一种通过平滑激活异常值以减小量化损失的weight-only量化算法。该算法认为模型权重的量化误差会被激活的离群点放大,故smoothquant+会先在通道维度对激活的离群点进行平滑处理,同时为实现计算上的等价性将对相应权重进行调整,再进行正常的weight-only量化。

    该算法需提供一定数量的校准数据,支持block-wise量化。

  • SmoothQuant-GPTQ

    SmoothQuant-GPTQ是指在利用SmoothQuant原理对激活中异常值进行平滑处理后,再使用GPTQ算法对模型参数进行量化,该方法能够在一定程度上综合SmoothQuantGPTQ的优势。

几种量化算法的基本支持情况如下表所示:

量化算法

weight_only_quant

(支持blockwise量化)

act_and_weight_quant

(不支持blockwise量化)

校准数据依赖

INT8

INT4

FP8

INT8

FP8

minmax

Y

Y

N

Y

Y

N

gptq

Y

Y

N

N

N

Y

awq

Y

Y

N

N

N

Y

smoothquant

N

N

N

Y

Y

Y

smoothquant+

Y

Y

N

N

N

Y

smoothquant_gptq

N

N

N

Y

Y

Y

关于选择量化算法的建议如下:

  • 若想快速实验,建议尝试MinMax算法,无需校准数据且量化过程快;

  • MinMax量化精度未满足需求:

    • weight-only量化可进一步尝试gptq、awq、smoothquant+。

    • act_and_weight量化可进一步尝试smoothquant、smoothquant_gptq。

    其中awq、smoothquant+相比gptq量化过程耗时更长,但部分情况下量化精度损失更小。gptq、awq、smoothquant、smoothquant+都需要校准数据。

  • 若期望更好地保持量化精度,建议开启block-wise量化。block-wise量化可能会导致量化后模型性能略有下降,但在4bit weight-only量化场景下其量化精度通常会明显提升。

  • 若上述量化精度仍不满足要求,可尝试开启自动混合精度量化,即通过设置fallback_ratio参数指定回退为浮点运算的层数比例,将自动计算每层的量化敏感程度,回退指定比例的计算层以改善量化精度。