开发者
资源

量化流程

本节介绍全量化场景下支持的层类型,并给出详细接口调用流程和调用示例。

该特性支持的层如下,样例请参见样例列表

本章节根据量化对象不同,分为两个场景,不同场景支持的量化类型及约束不同:

全量化支持的层

原始模型中数据类型为float32(fp32)、float16(fp16)、bfloat16(bf16)时,可以通过本节介绍的内容,量化后转换为HiFloat8(HiF8)、float8(fp8)、MXFP8,float4等数据类型,通过对数据格式的压缩,实现模型轻量化。其中:

HIFloat8(HiF8)、FLOAT8(float8)、MXFP8、MXFP4、FP4_E2M1、FP4_E1M2:仅在Atlas 350 加速卡支持。

该版本仅支持INT8、INT4量化数据类型。

表1 支持量化的层以及约束

支持的层类型

原始数据类型

支持的量化数据类型组合

约束

torch.nn.Linear

float32(fp32)、float16(fp16)、bfloat16(bf16)

act_type: HIFLOAT8 wts_type: HIFLOAT8

act_type: FLOAT8_E4M3FN wts_type: FLOAT8_E4M3FN

激活(数据)支持PER_TENSOR量化,权重支持PER_TENSOR/PER_CHANNEL量化

量化算法为OFMR,config详细配置中必须配置ofmr选项

bfloat16(bf16)

act_type: MXFP8_E4M3FN wts_type: MXFP8_E4M3FN

支持2~6维数据输入、PER_GROUP量化、支持对称量化、cin长度除以32向上取整后是2的整数倍

不使用量化算法,即只做mx数据类型转换,config详细配置中必须配置mxquant选项

bfloat16(bf16)

act_type: FLOAT8_E4M3FN wts_type: FLOAT4_E2M1

支持2~6维数据输入、bias为false

激活(数据)支持shape为(m,k),权重支持shape为(n,k),其中k是64整数倍

激活(数据)支持PER_TENSOR量化,权重支持PER_GROUP量化

激活和权重都仅支持对称量化

支持MIN-MAX量化算法,SmoothQuant算法,config详细配置中必须分别配置minmax、smoothquant选项

float16(fp16)、bfloat16(bf16)

act_type: INT8 wts_type: INT8

  • 支持2~6维数据输入
  • 激活(数据)支持PER_TENSOR量化,支持对称非对称量化,bias量化为INT32;权重支持PER_TENSOR/PER_CHANNEL量化,支持对称量化
  • 激活(数据)支持PER-TOKEN对称量化,bias不量化,k是16的倍数,n是8的倍数;权重支持PER_TENSOR/PER_CHANNEL对称量化
  • 支持MIN-MAX量化算法、SmoothQuant算法,config详细配置中必须分别配置minmax、smoothquant选项

torch.nn.Conv2d

float32(fp32)、float16(fp16)、bfloat16(bf16)

act_type: HIFLOAT8 wts_type: HIFLOAT8

act_type: FLOAT8_E4M3FN wts_type: FLOAT8_E4M3FN

padding_mode为zeros、支持PER_TENSOR/PER_CHANNEL量化

量化算法为OFMR,config详细配置中必须配置ofmr选项

注:act_type和wts_type参数分别指config详细配置中的激活(activation)和权重(weight)量化类型。关于量化数据类型以及PER_TENSOR/PER_CHANNEL等量化概念解释请参见压缩概念

仅权重量化支持的层

本章节介绍仅权重量化特性,以及对应的优化算法:AWQ、GPTQ等权重量化算法。

原始模型中数据类型为float16(fp16)、bfloat16(bf16)时,可以通过本节介绍的内容,仅权重量化后转换为HIFloat8(HiF8)、float8(fp8)、MXFP4、float4数据类型,通过对权重的压缩,实现模型轻量化。

表2 支持量化的层以及约束

支持的层类型

原始数据类型

支持的量化类型组合

约束

torch.nn.Linear

float16(fp16)、bfloat16(bf16)

wts_type: HIFLOAT8

wts_type: FLOAT8_E4M3FN

  • 支持PER_TENSOR/PER_CHANNEL量化,支持对称量化
  • 支持2~6维数据输入

    支持OFMR量化算法、GPTQ量化算法,config详细配置中必须分别配置ofmr、gptq选项

wts_type: MXFP4_E2M1

  • 支持PER_GROUP量化,支持对称量化
  • 支持2~6维数据输入
  • 支持不配置算法,config详细配置中必须配置mxquant选项
  • 支持配置GPTQ量化算法、AWQ量化算法,config详细配置中必须分别配置gptqawq选项

wts_type: FLOAT4_E2M1

  • 支持PER_GROUP量化,支持对称量化
  • 支持2~6维数据输入
  • 支持MIN-MAX量化算法、GPTQ量化算法、AWQ量化算法,config详细配置中必须分别配置minmax、gptq、awq选项

wts_type: INT8

  • 支持PER_TENSOR/PER_CHANNEL/PER_GROUP量化,支持对称量化/非对称量化
  • 支持MIN-MAX量化算法、GPTQ量化算法、AWQ量化算法,config详细配置中必须分别配置minmax、gptqawq选项
  • wts_type为INT8时,原始模型weight需要K、N轴32元素对齐;wts_type为INT4时,需要K、N轴64元素对齐

float32(fp32)、float16(fp16)、bfloat16(bf16)

wts_type: INT4

  • 支持PER_TENSOR/PER_CHANNEL/PER_GROUP量化,支持对称量化/非对称量化
  • 支持MIN-MAX量化算法、GPTQ量化算法、AWQ量化算法,config详细配置中必须分别配置minmax、gptq、awq选项
  • wts_type为INT4时,需要K、N轴64元素对齐

接口调用流程

图1 调用流程
蓝色部分为用户实现,灰色部分为用户调用AMCT提供的API实现,简要流程如下:
  1. 用户首先构造PyTorch的原始模型(请确保原始模型可以正常推理)和量化配置,然后调用quantize接口对原始模型进行修改,生成量化校准模型;修改过程中,使用的数据类别不同,量化算法不同。
    • 全量化场景
      • HIFLOAT8和FLOAT8_E4M3FN:将模型中将待量化算子替换成OFMRQuant量化算子,生成量化校准模型。OFMR量化算法原理请参见OFMR算法
      • MXFP8_E4M3FN和MXFP4_E2M1:不使用量化算法,根据转换公式直接转换。
      • 激活配置FLOAT8_E4M3FN,权重配置FLOAT4_E2M1:未配置SmoothQuant量化算法,则将模型中将待量化算子替换成MinMaxCalibrator量化算子,生成量化校准模型。MIN-MAX量化算法原理请参见MIN-MAX量化算法。若配置SmoothQuant量化算法,则将模型中将待量化算子替换成SmoothQuant量化算子,生成量化校准模型。SmoothQuant量化算法原理请参见SmoothQuant量化算法
      • 激活配置INT8,权重配置INT8:未配置SmoothQuant量化算法,则将模型中将待量化算子替换成MinMaxCalibrator量化算子,生成量化校准模型。若配置SmoothQuant量化算法,则将模型中将待量化算子替换成SmoothQuant量化算子,生成量化校准模型。
    • 仅权重量化场景
      • 仅权重量化配置的是HIFLOAT8、FLOAT8_E4M3FN、MXFP4_E2M1、FLOAT4_E2M1、FLOAT4_E1M2、INT8、INT4量化类型,不配置任何量化算法,则量化时将模型中待量化算子替换成MinMaxCalibrator量化算子,生成量化校准模型。MIN-MAX量化算法原理请参见MIN-MAX量化算法。若配置了GPTQ量化算法,则将模型中待量化Linear算子替换成GPTQuant量化算子,生成量化校准模型。
      • 仅权重量化配置的是MXFP4_E2M1、FLOAT4_E2M1、FLOAT4_E1M2、INT8、INT4量化类型,若配置AWQ量化算法,则将模型中待量化Linear算子替换成LinearAWQuant量化算子,生成量化校准模型。
  2. 用户调用convert接口,将量化校准算子转换为NPU对应的量化部署算子,并输出量化部署模型(类型为torch.nn.Module)。

    生成的部署模型如果要执行推理,需要使用torch_npu,详情请参见《PyTorch图模式使用指南(TorchAir)》

调用示例

以下是关键步骤的代码示例,不能直接拷贝编译运行,仅供参考。

# 1.导入AMCT包
import amct_pytorch as amct

# 2.调用AMCT,量化模型
# 2.1 生成量化校准模型
# 建立待进行量化的网络图结构
ori_model = build_model()
model = copy.deepcopy(ori_model)
# 量化配置
cfg = {
        'batch_num': 1,
        'quant_cfg': {
            'weights': {
                'type': 'int8',
                'symmetric': True,
                'strategy': 'tensor',
            },
        },
        'algorithm': {'minmax'},
        }
# 调用量化接口生成量化校准模型
amct.quantize(model, cfg)

# 2.2 生成量化部署模型
# 调用接口将量化校准模型转换为量化部署模型
amct.convert(model)