MindIE量化介绍(w8a8、w8a16、w8a8s、w8a8sc)

ATB Models公共能力支持以下量化方式:

W8A8、W8A16、W8A8SC稀疏量化、KV Cache int8、Anti-Outlier离群值处理、Attention量化

量化脚本说明

MindIE LLM中提供统一的脚本${ATB_SPEED_HOME_PATH}/examples/convert/model_slim/quantifier.py供用户生成量化权重。

使用说明

由于不同模型量化特性参数配置不同,模型基于公共脚本编写各自的量化脚本。具体使用方式见模型Readme文件(${ATB_SPEED_HOME_PATH}/examples/models/{模型名称}/README.md)。

不同量化方式下的参数配置方法见后续章节。

参数说明

说明

详情可参考《msModelSlim工具》的“介绍”章节。

表1 量化脚本参数说明

参数名称

是否为必选

类型

默认值

描述

--save_

directory

string

-

量化权重保存路径。

--part_file

_size

int

None

量化权重保存文件切分大小,单位GB,默认不切分。

--calib_texts

string

None

量化时的校准数据,多条数据间使用空格分割。

说明

脚本基于calib_texts进行推理,若用户传入数值过大,会出现由out of memory导致的报错信息。

--calib_file

string

${ATB_SPEED_HOME_PATH}

/examples/convert/model_slim

/teacher_qualification.jsonl

包含校准数据的文件。

--w_bit

int

8

权重量化bit。

  • 可配置为4或8

  • per_group的场景下需配置为4。

  • 稀疏量化场景下,需配置为4。

--a_bit

int

8

激活值量化bit。

可选值为8和16

  • 大模型量化场景下,可配置为8或16。

    • per_group的场景下需配置为16。

    • is_dynamic参数配置为True,使用per-token动态量化场景下,需配置为8。

  • 大模型稀疏量化场景下,需配置为8。

--disable_names

string

None

需排除量化的节点名称,即手动回退的量化层名称。如精度太差,推荐回退量化敏感层,如分类层、输入层、检测head层等。

--device_type

string

"cpu"

量化时的硬件类型,仅支持"cpu"或"npu"

--fraction

float

0.01

稀疏量化精度控制。

--act_method

int

1

激活值量化方法,仅支持1或2或3。

  • 1代表Label-Free场景的min-max量化方式。

  • 2代表Label-Free场景的histogram量化方式。

  • 3代表Label-Free场景的自动混合量化方式。

  • 开启lowbit稀疏量化功能时不支持选择值3。

--co_sparse

bool

False

是否开启稀疏量化功能。 大模型稀疏量化场景下,优先使用lowbit稀疏量化功能,开启lowbit稀疏量化后,co_sparse参数自动失效。

--anti_method

string

""

离群值抑制算法,默认不开启。

  • "m1": Smooth Quant算法。

  • "m2": Outlier Suppression算法。

  • "m3": AWQ算法。

  • "m4": Smooth Quant优化算法 。

  • "m5": CBQ量化算法。

--disable_level

string

"L0"

自动回退等级。

  • "L0":不执行回退

  • "L1":回退1层

  • "L2":回退2层

  • "L3":回退3层

  • "L4":回退4层

  • "L5":回退5层

--do_smooth

bool

False

是否开启smooth功能。启用do_smooth功能后,平滑激活值。默认为"False",不开启smooth功能。

--use_sigma

bool

False

是否启动sigma功能。启用use_sigma功能后,可根据正态分布数值特点进行异常值保护。默认为"False",不开启sigma功能。

--use_reduce

_quant

bool

False

是否使用lccl reduce量化功能,默认不开启。

--tp_size

int

1

lccl reduce量化时需要用到的卡数,默认为1。

--sigma_factor

float

3.0

启用sigma功能后sigma_factor的值,用于限制异常值的保护范围。默认为3.0,取值范围为[3.0, 4.0]。

--is_lowbit

bool

False

是否开启lowbit量化功能。 默认为"False",不开启lowbit量化功能。

--mm_tensor

bool

True

选择进行per-channel量化或per-tensor量化。

  • True: per-tensor量化。

  • False: per-channel量化。

--w_sym

bool

True

权重量化是否为对称量化,默认开启对称量化。

--use_kvcache

_quant

bool

False

是否使用KV Cache量化功能,默认不开启KV Cache量化功能。

--use_fa_quant

bool

False

是否使用Attention量化功能,默认不开启Attention量化功能。

--fa_amp

int

0

Attention量化的自动回退层数,以整个Attention为单位进行回退。

默认值为0。

--open_outlier

bool

True

是否开启权重异常值划分。

  • True:开启权重异常值划分。

  • False:关闭权重异常值划分。

  • 仅在lowbit设置为True时生效。

--group_size

int

64

per_group量化中group的大小。 默认值为64,支持配置为64或128。

--is_dynamic

bool

False

是否开启per token量化,当前仅W8A8支持per token量化。

  • True:开启。

  • False:不开启。

--input_ids_

name

string

"input_ids"

tokenize后input_ids对应的键名。

--attention_

mask_name

string

"attention_mask"

tokenize后attention_mask对应的键名。

--tokenizer

_args

符合json格式的string

"{}"

对校准数据集做tokenize时可额外配置的参数。

例如:'{"padding_side":"left","pad_token":"!"}'

--disable_

last_linear

bool

True

是否禁用最后一层全连接层量化,默认为True,即禁用。

--trust_remote

_code

bool

store_true

是否信任模型权重路径下的自定义代码文件。默认不执行。若传入此参数,则transformers会执行用户权重路径下的自定义代码文件,这些代码文件的功能的安全性需由用户保证,请提前做好安全性检查。

说明

calib_texts参数包含校准数据,量化校准时间和传入数据量成正比。当使用NPU进行量化时,输入会被转换成token id搬运至NPU,传入数据量过大可能会导致NPU tensor占用显存过大,而出现由out of memory导致的报错信息。

W8A8

简介

此量化方式对权重和激活值均进行量化,将高位浮点数转为8 bit,减少模型权重的体积。使用int8格式的数据进行计算,可以减少MatMul算子计算量,以提升推理性能

说明

1)仅支持BaiChuan2-7B,BaiChuan2-13B,ChatGLM2-6B,CodeGeeX2-6B,CodeLLamA-34B,Gemma-7B,LLaMA2-13B,LLaMA2-7B,LLaMA2-70B,LLaMA3.1-70B,LLaMA-65B,DeepSeek-V2,Qwen2.5-72B,Qwen2.5-57B,Qwen2.5-32B,Qwen2.5-14B,Qwen2.5-7B,Qwen1.5-32B,Qwen1.5-chat-14B,Qwen-14B,StarCoder2-15B,StarCoder-15.5B,llava-v1.5-13B,llava-v1.5-7B,qwen-vl和Stable Diffusion XL。

2)仅支持和PD分离、SplitFuse、Prefix Cache、并行解码、长序列以及多机推理特性配合使用。

3)仅支持和Attention、KV Cache量化配合使用。

量化后权重目录结构:

├─ config.json
├─ quant_model_weight_w8a8.safetensors
├─ quant_model_description_w8a8.json
├─ tokenizer_config.json
├─ tokenizer.json
└─ tokenizer.model

量化输出包含:权重文件quant_model_weight_w8a8.safetensors和权重描述文件quant_model_description_w8a8.json。

目录中的其余文件为推理时所需的配置文件,不同模型略有差异。

以下展示了量化后权重描述文件quant_model_description_w8a8.json中的部分内容:

{
  "model_quant_type": "W8A8",
  "model.embed_tokens.weight": "FLOAT",
  "model.layers.0.self_attn.q_proj.weight": "W8A8",
  "model.layers.0.self_attn.q_proj.input_scale": "W8A8",
  "model.layers.0.self_attn.q_proj.input_offset": "W8A8",
  "model.layers.0.self_attn.q_proj.quant_bias": "W8A8",
  "model.layers.0.self_attn.q_proj.deq_scale": "W8A8",
}

量化后的MatMul权重新增input_scale、input_offset、quant_bias和deq_scale。其中input_scale和input_offset用于对激活值进行量化。MatMul使用量化后的激活值和量化权重进行计算。quant_bias和deq_scale用于对MatMul的计算结果进行反量化。

图1 量化权重推理时流程

此量化方式支持量化float16或bfloat16类型的原始权重。

表1 float16权重量化后dtype及shape信息(假设原始权重的shape为[n, k])

Tensor信息

weight

input_scale

input_offset

quant_bias

deq_scale

dtype

int8

float16

float16

int32

int64

shape

[n, k]

[1]

[1]

[n]

[n]

表2 bfloat16权重量化后dtype及shape信息(假设原始权重的shape为[n, k])

Tensor信息

weight

input_scale

input_offset

quant_bias

deq_scale

dtype

int8

bfloat16

bfloat16

int32

float32

shape

[n, k]

[1]

[1]

[n]

[n]

生成权重

以LLaMA3.1-8B为例,您可以使用以下指令生成W8A8量化权重。

cd ${ATB_SPEED_HOME_PATH}
python examples/models/llama3/convert_quant_weights.py --model_path {浮点权重路径} --save_directory {W8A8量化权重路径} --w_bit 8 --a_bit 8 --disable_level L0 --device_type cpu --anti_method m1 --act_method 1 --calib_file ${llm_path}/examples/convert/model_slim/boolq.jsonl

以上指令展示了生成LLaMA3.1-8B W8A8权重的最优参数配置,不同模型的参数配置不同,请参考模型Readme文件。

W8A8量化权重的config.json中应包含quantize字段,其值为"w8a8"。

执行推理

以LLaMA3.1-8B为例,您可以使用以下指令执行对话测试,推理内容为"What's deep learning?",最长输出20个token。

cd ${ATB_SPEED_HOME_PATH}
bash examples/models/llama3/run_pa.sh {W8A8量化权重路径} 20

W8A16

简介

此量化方式对激活值不做量化,仅将权重量化为8 bit。使用per Channel量化。

说明

1)仅Atlas 800I A2 推理产品支持此量化方式。

2)仅支持LLaMA2-70B,LLaMA3-70B,LLaMA-65B,Qwen1.5-72B,Qwen72B和LLava-V1.6-13B。

3)仅支持和Anti-Outlier离群值处理、KV Cache int8量化配合使用。

量化后权重目录结构:

├─ config.json
├─ quant_model_weight_w8a16.safetensors
├─ quant_model_description_w8a16.json
├─ tokenizer_config.json
├─ tokenizer.json
└─ tokenizer.model

量化输出包含:权重文件quant_model_weight_w8a16.safetensors和权重描述文件quant_model_description_w8a16.json。

目录中的其余文件为推理时所需的配置文件,不同模型略有差异。

以下展示了量化后权重描述文件quant_model_description_w8a16.json中的部分内容:

{
  "model_quant_type": "W8A16",
  "model.embed_tokens.weight": "FLOAT",
  "model.layers.0.self_attn.q_proj.weight": "W8A16",
  "model.layers.0.self_attn.q_proj.weight_scale": "W8A16",
  "model.layers.0.self_attn.q_proj.weight_offset": "W8A16",
}

量化后的MatMul权重新增weight_scale和weight_offset,用于对MatMul的计算结果进行反量化。

图1 量化权重推理时流程

此量化方式支持量化float16或bfloat16类型的原始权重。

表1 float16权重量化后dtype及shape信息(假设原始权重的shape为[n, k])

Tensor信息

weight

weight_scale

weight_offset

bias

dtype

int8

float32

float32

float16

shape

[n, k]

[n, 1]

[n, 1]

[n]

表2 bfloat16权重量化后dtype及shape信息(假设原始权重的shape为[n, k])

Tensor信息

weight

weight_scale

weight_offset

bias

dtype

int8

float32

float32

float32

shape

[n, k]

[n, 1]

[n, 1]

[n]

说明

仅当浮点权重存在bias场景时,量化权重才会有bias。

生成权重

以LLaMA2-70B为例,您可以使用以下指令生成W8A16量化权重。

cd ${ATB_SPEED_HOME_PATH}
python -m examples.convert.model_slim.quantifier --model_path {浮点权重路径} --save_directory {W8A16量化权重路径} --calib_file= --w_bit 8 --a_bit 16 --act_method 3 --tokenizer_args '{"padding_side":"left","pad_token":"<unk>"}'

以上指令包含生成LLaMA2-70B W8A16权重的最优参数配置,不同模型的参数配置不同,请参考模型Readme文件。

W8A16量化时无需校准数据集,故calib_file传入空字符串即可。

W8A16量化权重的config.json中应包含quantize字段,其值为"w8a16"。

执行推理

以LLaMA2-70B为例,您可以使用以下指令执行对话测试,推理内容为"What's deep learning?"。

cd ${ATB_SPEED_HOME_PATH}
bash examples/models/llama/run_pa.sh {W8A16量化权重路径}

W8A8SC稀疏量化

简介

大模型稀疏量化工具包括稀疏、量化和压缩三个部分:

1)稀疏:模型稀疏工具通过算法判断模型权重中每个元素对精度结果的重要性,并将模型权重中对最终精度影响小的权重值置零

2)量化:对权重和激活值都做量化,将高位浮点数转为8bit,可以直接降低权重体积,带来性能收益

3)压缩:权重压缩工具将模型权重通过压缩算法进一步编码压缩,最大程度地降低权重体积,生成压缩后权重和索引文件。

说明

1)压缩算法和硬件强相关,仅Atlas 300I Duo 推理卡支持稀疏量化

2)bfloat16权重不支持稀疏量化。

3)仅支持ChatGLM2-6B,CodeLLaMA-34B,LLaMA-33B和Qwen1.5-chat-14B。

4)仅支持和并行解码、Prefix Cache、长序列特性同时使用。

稀疏+量化后权重目录结构:

├─ config.json
├─ quant_model_weight_w8a8s.safetensors
├─ quant_model_description_w8a8s.json
├─ tokenizer_config.json
├─ tokenizer.json
└─ tokenizer.model

量化后产物包含:权重文件quant_model_weight_w8a8s.safetensors和权重描述文件quant_model_description_w8a8s.json。

目录中的其余文件为推理时所需的配置文件,不同模型略有差异。

以下展示了量化后权重描述文件quant_model_description_w8a8s.json中的部分内容:

{
  "model_quant_type": "W8A8S",
  "model.embed_tokens.weight": "FLOAT",
  "model.layers.0.self_attn.q_proj.weight": "W8A8S",
  "model.layers.0.self_attn.q_proj.input_scale": "W8A8S",
  "model.layers.0.self_attn.q_proj.input_offset": "W8A8S",
  "model.layers.0.self_attn.q_proj.quant_bias": "W8A8S",
  "model.layers.0.self_attn.q_proj.deq_scale": "W8A8S",
}

量化后的MatMul权重新增input_scale、input_offset、quant_bias和deq_scale。其中input_scale和input_offset用于对激活值进行量化。MatMul使用量化后的激活值和量化权重进行计算。quant_bias和deq_scale用于对MatMul的计算结果进行反量化。

压缩后权重目录结构:

├─ config.json
├─ part0-of-4
│  ├─ quant_model_weight_w8a8sc.safetensors
│  └─ quant_model_description_w8a8sc.json
├─ part1-of-4
│  ├─ quant_model_weight_w8a8sc.safetensors
│  └─ quant_model_description_w8a8sc.json
├─ part2-of-4
│  ├─ quant_model_weight_w8a8sc.safetensors
│  └─ quant_model_description_w8a8sc.json
├─ part3-of-4
│  ├─ quant_model_weight_w8a8sc.safetensors
│  └─ quant_model_description_w8a8sc.json
├─ tokenizer_config.json
├─ tokenizer.json
└─ tokenizer.model

压缩前会先加载权重,并进行多卡切分,压缩算法须在切分后的权重上执行。

以下展示了量化后权重描述文件part0-of-4/quant_model_description_w8a8sc.json中的部分内容:

{
  "model_quant_type": "W8A8SC",
  "model.embed_tokens.weight": "FLOAT",
  "model.layers.0.self_attn.query_key_value.weight": "W8A8SC",
  "model.layers.0.self_attn.query_key_value.index": "W8A8SC",
  "model.layers.0.self_attn.query_key_value.info": "W8A8SC",
  "model.layers.0.self_attn.query_key_value.input_scale": "W8A8S",
  "model.layers.0.self_attn.query_key_value.input_offset": "W8A8S",
  "model.layers.0.self_attn.query_key_value.deq_scale": "W8A8S",
  "model.layers.0.self_attn.query_key_value.quant_bias": "W8A8S",
}

压缩后的MatMul权重相比量化新增了index,压缩信息用于复原权重。

图1 量化权重推理时流程

表1 float16权重量化后dtype及shape信息(假设原始权重的shape为[n, k])

展开

Tensor信息

weight

input_scale

input_offset

quant_bias

deq_scale

index

dtype

int8

float16

int8

int32

int64

int8

shape

[x]

x的取值范围为(0, n * k)。

[1]

[1]

[n]

[n]

[y]

y由以下计算得出。

y = k_index * n_index * 8

k_index = ceil(k1 / tilingK)

n_index = ceil(n1 / tilingN)

k1 = k / 32

n1 = n / 16

其中,ceil()为向上取整函数 ,tilingK和tilingN为稀疏量化默认参数。

前提条件

在使用稀疏量化脚本之前,需要安装压缩工具msmodelslim,安装步骤参见msmodelslim/README.md · Ascend/msit - Gitee.com的“使用说明”章节。

生成权重

以LLaMA-33B为例:

1)使用以下指令生成W8A8S量化权重。

cd ${ATB_SPEED_HOME_PATH}
get_down_proj_disable_name() {
    local num_layer=$1
    local disable_names=""
    for ((i=0; i<$num_layer; i++)); do
        disable_names="$disable_names model.layers.$i.mlp.down_proj"
    done
    echo "$disable_names"
}
disable_names=$(get_down_proj_disable_name 60)
python -m examples.convert.model_slim.quantifier --model_path {浮点权重路径} --save_directory {W8A8S量化权重路径} --calib_file $llm_path/examples/convert/model_slim/boolq.jsonl --disable_names $disable_names --act_method 2 --do_smooth True --use_sigma True --is_lowbit True --co_sparse True --w_bit 4 --tokenizer_args '{"padding_side":"left","pad_token":"<unk>"}'

以上指令包含生成LLaMA-33B W8A8SC稀疏量化权重的最优参数配置,不同模型的参数配置不同,请参考模型Readme文件。

生成权重后需将浮点权重下的special_tokens_map.json文件复制到W8A8S量化权重路径

W8A8S量化权重的config.json中应包含quantize字段,其值为"w8a8s"。

2)使用以下指令设置msModelSlim工具所在的Python路径环境变量,{Python Lib Path}为安装msmodelslim时编译步骤中所在的Python路径。

export LD_LIBRARY_PATH={Python Lib Path}/lib:$LD_LIBRARY_PATH

3)使用以下指令对量化权重进行压缩,生成W8A8SC量化权重。

torchrun --nproc_per_node 2 -m examples.convert.model_slim.sparse_compressor --model_path {W8A8S量化权重路径} --save_directory {W8A8SC量化权重路径}

W8A8SC量化权重的config.json中应包含quantize字段,其值为"w8a8sc"。

执行推理

以LLaMA-33B为例,您可以使用以下指令执行对话测试,推理内容为"What's deep learning?"。

cd ${ATB_SPEED_HOME_PATH}
bash examples/models/llama/run_pa.sh {W8A8SC量化权重路径}

转自:W8A8SC稀疏量化-量化特性介绍-特性介绍-MindIE LLM开发指南-大模型开发-MindIE1.0.0开发文档-昇腾社区

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值