QuantCalibrationOp
功能说明
用于用户构图,在前向传播时,根据用户的量化算法配置调用IFMR/HFMG量化算法对输出做校准,校准后,将量化因子依据对应格式输出到record_file文件指定层名中。
在进行前向传播时,算子对原始输出会做透传,不修改activation输入信息:
- 若当前传入数据个数小于batch_num时,使用IFMR/HFMG算子中的积攒数据方法,将数据集进行保存。
- 若当前传入收据个数等于batch_num时,会调用IFMR/HFMG算法计算量化因子,根据quant_method参数进行区分写出来的量化因子格式,按照格式写入对应record文件;quant_method目前仅支持“kv_cache_quant”方式。
写入时,对record文件进行增量写入,如果进行了覆盖写入,则会提示哪个层哪些参数被覆盖。
函数原型
QuantCalibrationOp (record_file,quant_algo_params, quant_method)
参数说明
参数名 |
输入/返回值 |
含义 |
使用限制 |
---|---|---|---|
record_file |
输入 |
保存量化因子的record文件路径。 |
数据类型:string |
quant_algo_params |
输入 |
指定量化使用的量化算法,以及添加对应量化配置,格式如下: { "act_algo": "hfmg", "num_bits": 8, "quant_granularity": "1", "with_offset": true, "batch_num": 1 } act_algo配置的算法不同,配置的字段不同,算法支持字段和解释如表1所示。 |
数据类型:dict |
quant_method |
输入 |
量化方式。默认为'kv_cache_quant',用于指定输出量化因子的格式。 |
数据类型:string |
字段 |
含义 |
IFMR算法支持配置的字段 |
HFMG算法支持配置的字段 |
---|---|---|---|
act_algo |
数据量化算法,支持如下两种:
|
- |
- |
num_bits |
量化位宽,当前仅支持配置为8,表示采用INT8量化位宽。 IFMR/HFMG两种算法都支持。 |
支持 |
支持 |
with_offset |
控制数据量化是对称量化还是非对称量化,全局配置参数。
若配置文件中同时存在with_offset和asymmetric参数,asymmetric参数优先级>with_offset参数。 IFMR/HFMG两种算法都支持。 |
支持 |
支持 |
batch_num |
控制量化使用多少个batch的数据。取值范围大于0,默认为1。 IFMR/HFMG两种算法都支持。 |
支持 |
支持 |
asymmetric |
控制数据量化是对称量化还是非对称量化,用于控制逐层量化算法的选择。
IFMR/HFMG两种算法都支持。 |
支持 |
支持 |
quant_granularity |
量化粒度,支持如下两种方式:
IFMR/HFMG两种算法都支持。 |
支持 |
支持 |
max_percentile |
IFMR数据量化算法中,最大值搜索位置参数。 取值范围为(0.5,1],默认为0.999999。 仅IFMR算法支持。 |
支持 |
不支持 |
min_percentile |
IFMR数据量化算法中,最小值搜索位置参数。 取值范围为(0.5,1],默认为0.999999。 仅IFMR算法支持。 |
支持 |
不支持 |
search_range |
IFMR数据量化算法中,控制量化因子的搜索范围[search_range_start, search_range_end]。 取值范围为 0<search_range_start<search_range_end,推荐配置为[0.7,1.3]。 仅IFMR算法支持。 |
支持 |
不支持 |
search_step |
IFMR数据量化算法中,控制量化因子的搜索步长。 取值范围为 (0, (search_range_end-search_range_start)],默认为0.01。 仅IFMR算法支持。 |
支持 |
不支持 |
num_of_bins |
直方图的bin(直方图中的一个最小单位直方图形)数目,支持的范围为{1024, 2048, 4096, 8192}。默认值为4096。 仅HFMG算法支持。 |
不支持 |
支持 |
返回值说明
无。
函数输出
量化因子文件。
调用示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
import amct_pytorch as amct from amct_pytorch.nn.module.quantization.quant_calibration_op import QuantCalibrationOp class LinearNet(nn.Module): def __init__(self, quant_algo_params): super(LinearNet,self).__init__() self.quant_algo_params = quant_algo_params self.layer1 = nn.Linear(28, 1024, bias=False) self.ptq_1 = QuantCalibrationOp(record_file, quant_algo_params=self.quant_algo_params, quant_method="kv_cache_quant") def forward(self, layer_name, x): x = self.layer1(x) x = self.ptq_1(layer_name, x) temp_folder = "./" record_file = os.path.join(temp_folder, 'kv_cache.txt') input_data = torch.randn((2, 2, 28, 28)) quant_algo_params = {"act_algo": "hfmg"} model = LinearNet(quant_algo_params).to(torch.device("cpu")) model.eval() ans_2 = model("qat_1", input_data) |