本示例将以自然语言处理生成模型GPT-3为例,介绍如何使用量化训练敏感度分析工具分析量化模型,以及提升量化训练精度。
模型 | 策略 | ACC | Inference模型 |
---|---|---|---|
GPT-345M | Baseline | 44.17 | Model |
GPT-345M | 量化训练(分析前) | 41.58 | Model |
GPT-345M | 量化训练(分析后) | 44.94 | Model |
- ACC的指标均在基于LAMBADA数据集,采用 ACC(accuracy) 指标评测得到
- PaddlePaddle >= 2.3 (可从Paddle官网下载安装)
- PaddleSlim develop版本
- PaddleFleetX >= 2.4
量化敏感度分析基于验证集获得每层的敏感度,可下载和使用 LAMBADA 或者 WikiText 数据集。本示例使用LAMBADA数据集来进行敏感度分析。
# 下载验证数据
wget https://raw.githubusercontent.com/cybertronai/bflm/master/lambada_test.jsonl
- 下载量化前Base模型
wget https://bj.bcebos.com/v1/paddle-slim-models/GPT_345M_Baseline.tar
- 下载分析前量化训练后的模型
wget https://bj.bcebos.com/v1/paddle-slim-models/GPT_345_QAT_wo_analysis.tar
如想自行导出,可参考GPT模型量化训练。
量化敏感度分析示例通过analysis.py脚本启动,会使用接口paddleslim.quant.AnalysisQAT
对模型进行敏感度分析。配置config文件中模型路径、数据路径和量化相关的参数,配置完成后便可对模型进行敏感度分析。具体运行命令为:
python analysis.py --config_path=./configs/gpt_345M_analysis.yaml
分析完成后,会产生排序好的层敏感度(敏感度由大到小排序,敏感度越大说明约负向影响模型精度),并保存在analysis_results/analysis.txt
中。
敏感度排序前10层分别为:linear_31
,linear_27
,linear_22
,linear_43
,linear_83
,linear_15
,linear_87
,linear_3
,linear_38
,linear_39
。在这十层中,其中有八层属于TransformerDecoder
中第二个FFN层,两层属于TransformerDecoder
中第一个FFN层,而MultiHeadAttention
中的Linear层都相对不敏感。
paddleslim.quant.AnalysisQAT
详解见AnalysisQAT.md。
根据分析结果,重新量化训练时,去掉了linear_31
,linear_27
,linear_22
,linear_43
,linear_83
,linear_15
,linear_87
七层Linear的量化,最后量化模型精度达到44.94。
重新量化训练的过程在 PaddleFleetX 中实现,可参考GPT模型量化训练。