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。
|
--a_bit | 否 | int | 8 | 激活值量化bit。 可选值为8和16。
|
--disable_names | 否 | string | None | 需排除量化的节点名称,即手动回退的量化层名称。如精度太差,推荐回退量化敏感层,如分类层、输入层、检测head层等。 |
--device_type | 否 | string | "cpu" | 量化时的硬件类型,仅支持"cpu"或"npu"。 |
--fraction | 否 | float | 0.01 | 稀疏量化精度控制。 |
--act_method | 否 | int | 1 | 激活值量化方法,仅支持1或2或3。
|
--co_sparse | 否 | bool | False | 是否开启稀疏量化功能。 大模型稀疏量化场景下,优先使用lowbit稀疏量化功能,开启lowbit稀疏量化后,co_sparse参数自动失效。 |
--anti_method | 否 | string | "" | 离群值抑制算法,默认不开启。
|
--disable_level | 否 | string | "L0" | 自动回退等级。
|
--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量化。
|
--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 | 是否开启权重异常值划分。
|
--group_size | 否 | int | 64 | per_group量化中group的大小。 默认值为64,支持配置为64或128。 |
--is_dynamic | 否 | bool | False | 是否开启per token量化,当前仅W8A8支持per token量化。
|
--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开发文档-昇腾社区