import os
import sys
sys.path.append('path/to/dopt_pytorch_py3')
#### 接口导入
from dopt_lm.do_opt import (
generate_config_file, ## 生成量化配置文件
optimize_model, ## 使用生成和配置好的量化配置文件将浮点nn.module转成插入量化算子的nn.module
set_quant_state, ## 分别对激活和量化设置量化推理使能
set_calibrate_state, ## 设置量化参数可更新状态
generate_quant_params, ## 导出量化参数接口
)
#### 量化算子插入 首次调用该接口会生成量化配置文件,完成配置后进行PTQ或者QAT
def get_quant_model(model, dopt_config):
## model: nn.module实例对象 浮点模型定义
## dopt_config: "path/to/config.json" 生成路径
if not os.path.exists(dopt_config):
generate_config_file(model, dopt_config)
exit()
model = optimize_model(model, dopt_config)
return model 量化配置文件配置样例:
group_size仅在weight_algo中含“group”时可配置,否则不要配置。group_size需能被该层输入通道数整除,否则量化结构构建时报错。
{
"layer_strategy": {
"node_name": {
"type": "<class 'torch.nn.modules.linear.Linear'>",
"quant_strategy": "need to set",
"weight": {
"bit": 4,
"group_size": 128,
"weight_algo": "group_min_max"
},
"input": {
"bit": 8,
"input_algo": "min_max",
"unsigned_quant": true
}
}
}
} 配置说明:
quant_strategy 不同策略有默认的配置,可参考下表1进行配置修改,需要逐层配置。
表1 配置参数说明
| 配置信息 | 配置信息 | 可选项 | 选项说明 |
|---|---|---|---|
| quant_strategy | N/A | Quant_aigc_ptq Quant_aigc_qat Quant_INT8-4_ECO | PTQ策略,U8S8。量化器为minmax QAT策略,U8S8。量化器为omni_minmax QAT策略,动态8-4,量化器为grouplinear |
| weight | bit | 4, 8 | 权重量化位宽 |
| weight | group_size | 128 , 256 | 权重bit为4时,属于低比特量化范畴, 使用grouplinear量化,可配置此信息,否则别配置。group_size需能被该层输入通道数整除,若该层输入通道数小于group_size,需选择可整除的更小取值 |
| weight | weight_algo | min_max group_min_max omni_min_max omni_group_min_max | PTQ量化器 perchannel量化 PTQ量化器 pergroup量化 QAT量化器 perchannel量化 QAT量化器 pergroup量化 |
| input | bit | 8, 16 | 激活量化位宽 |
| input | input_algo | ema_min_max omni_min_max dyn_s8 | pertensor PTQ量化 pertensor QAT量化器 动态激活量化 推荐策略 |
| input | unsigned_quant | True False | 非对称量化 对称量化 |
weight_algo为group_min_max、omni_group_min_max时,权重量化器仅支持Linear层;Conv2d等4D权重算子请将weight_algo配置为min_max或omni_min_max,或将该层quant_strategy配置为float,否则量化结构构建或前向推理时会报错。
生成的quant_config中每一层默认都是float策略。需要将其改为Quant_aigc_ptq即可,高阶配置请参考上表。
请使用推理工程并选择合适数量的数据对get_quant_model接口返回的模型进行前向推理,即可完成对模型的量化优化如下:
## 首次调用会生成config文件,需要手动配置量化策略
model = get_quant_model(model, quant_config)
model.eval()
## 打开量化器
set_quant_state(model, weight_state=True, input_state=True)
## 打开量化参数可标定状态
set_calibrate_state(model, True)
## 使用实际推理数据进行推理,即量化标定
for data in datasets:
model(data)
set_calibrate_state(model, False)
torch.save(model.state_dict(), 'pth_save_path') 生成的quant_config中每一层默认都是float策略。需要将其改为Quant_aigc_qat,高阶配置请参考上表。
请使用训练工程对插有量化算子的模型进行训练。
model = get_quant_model(model, quant_config) model.train() set_quant_state(model, weight_state=True, input_state=True) set_calibrate_state(model, True) """ do training """ set_calibrate_state(model, False) torch.save(model.state_dict(), 'pth_save_path')