Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
PaddleSlim
提交
cafd9859
P
PaddleSlim
项目概览
PaddlePaddle
/
PaddleSlim
1 年多 前同步成功
通知
51
Star
1434
Fork
344
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
53
列表
看板
标记
里程碑
合并请求
16
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
P
PaddleSlim
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
53
Issue
53
列表
看板
标记
里程碑
合并请求
16
合并请求
16
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
cafd9859
编写于
8月 18, 2023
作者:
C
Chang Xu
提交者:
GitHub
8月 18, 2023
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add Advanced Experiments Data in Docs (#1782)
上级
069cfb7d
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
57 addition
and
5 deletion
+57
-5
docs/zh_cn/tutorials/quant/advanced_quantization.md
docs/zh_cn/tutorials/quant/advanced_quantization.md
+50
-1
paddleslim/quant/advanced/piecewise_search.py
paddleslim/quant/advanced/piecewise_search.py
+4
-2
paddleslim/quant/observers/abs_max_weight.py
paddleslim/quant/observers/abs_max_weight.py
+3
-2
未找到文件。
docs/zh_cn/tutorials/quant/advanced_quantization.md
浏览文件 @
cafd9859
# 量化策略详细教程
# 量化策略详细教程
近年来,Transformer模型已在各个领域得到广泛采用,尤其是生成式语言大模型极大地推动了人工智能领域的发展。这些模型已经从数亿个参数发展到数千亿个参数,在有限的数据和 GPU 资源下运行,对于这些模型来说变得越来越具有挑战性。此时压缩技术变得格外重要,其中量化已成为减少内存占用和计算开销的通用和主要范例。然而,许多研究表明,Transformer模型往往会存在强烈的异常激活值,这使得它们难以量化。为了保持可接受的性能,这些异常值的存在要求激活具有更高的位宽或使用不同的数字格式、额外的微调或其他解决方法。本文档会介绍前沿的优化量化效果的几种策略,其中包括一些开源工作,也包括PaddleSlim自研的方法。以下方法暂时仅支持Transformer模型,具体示例使用方法可参考
[
PaddleNLP LLM示例
](
https://github.com/PaddlePaddle/PaddleNLP/tree/develop/llm/causallm
)
,以下教程仅详细介绍API接口。
近年来,Transformer模型已在各个领域得到广泛采用,尤其是生成式语言大模型极大地推动了人工智能领域的发展。这些模型已经从数亿个参数发展到数千亿个参数,在有限的数据和 GPU 资源下运行,对于这些模型来说变得越来越具有挑战性。此时压缩技术变得格外重要,其中量化已成为减少内存占用和计算开销的通用和主要范例。然而,许多研究表明,Transformer模型往往会存在强烈的异常激活值,这使得它们难以量化。为了保持可接受的性能,这些异常值的存在要求激活具有更高的位宽或使用不同的数字格式、额外的微调或其他解决方法。本文档会介绍前沿的优化量化效果的几种策略,其中包括一些开源工作,也包括PaddleSlim自研的方法。
## **LLM量化效果Benchmark**
1.
LLama 13b 在不同量化策略下精度对比
| 量化策略 | 比特数 | ACC1/% | ACC2/% |
| --------------- | ---------- | ---------------- | ---------------- |
| Baseline | FP16 | 78.32 | 32.98 |
| RTN | W8A8 | 34.05 | 24.96 |
| SmoothQuant | W8A8 | 42.36 | 27.78 |
| ShiftQuant | W8A8 | 33.35 | 25.48 |
| Shift-SmoothQuant | W8A8 | 45.26 | 24.66 |
| 自适应Shift-SmoothQuant | W8A8 |
**78.07**
|
**32.69**
|
| | | |
| RTN | W4A16 | 75.48 | 29.27 |
| GPTQ | W4A16 |
**77.55**
|
**32.32**
|
2.
Bloom 7.1b 在不同量化策略下精度对比
| 量化策略 | 比特数 | ACC1/% | ACC2/% |
| --------------- | ---------- | ---------------- | ---------------- |
| Baseline | FP16 | 77.18 | 41.08 |
| RTN | W8A8 | 76.48 | 38.26 |
| SmoothQuant | W8A8 | 76.57 | 38.70 |
| ShiftQuant | W8A8 | 68.99 | 39.97 |
| Shift-SmoothQuant | W8A8 | 76.77 | 37.22 |
| 自适应Shift-SmoothQuant | W8A8 |
**77.04**
|
**40.63**
|
| | | |
| RTN | W4A16 | 75.18 | 38.03 |
| GPTQ | W4A16 |
**76.82**
|
**39.37**
|
3.
ChatGLM2 6b 在不同量化策略下精度对比
| 量化策略 | 比特数 | ACC1/% | ACC2/% |
| --------------- | ---------- | ---------------- | ---------------- |
| Baseline | FP16 | 76.46 | 31.57 |
| PTQ-INT8 | W8A8 | 64.08 | 29.94 |
| SmoothQuant | W8A8 | 64.29 | 29.86 |
| ShiftQuant | W8A8 | 57.83 | 27.26 |
| Shift-SmoothQuant | W8A8 | 58.89 | 24.29 |
| 自适应Shift-SmoothQuant | W8A8 |
**76.89**
|
**34.55**
|
| | | |
| RTN | W4A16 | 74.20 | 26.30 |
| GPTQ | W4A16 |
**75.66**
|
**31.50**
|
-
ACC1:Finetuned下游任务下,使用数据集nl2sql的指标
-
ACC2:Pretrained开源任务下,使用数据集C-eval的指标
以下方法暂时仅支持Transformer模型,具体示例使用方法可参考
[
PaddleNLP LLM示例
](
https://github.com/PaddlePaddle/PaddleNLP/tree/develop/llm#6-%E9%87%8F%E5%8C%96
)
,以下教程仅详细介绍API接口。
## 1. Shift功能
## 1. Shift功能
...
...
paddleslim/quant/advanced/piecewise_search.py
浏览文件 @
cafd9859
...
@@ -84,7 +84,7 @@ class PieceWiseSearch():
...
@@ -84,7 +84,7 @@ class PieceWiseSearch():
# print('search for piece {}; centroids value is {}'.format(
# print('search for piece {}; centroids value is {}'.format(
# piece[i], centroids[centroids.argsort()[i]].numpy()))
# piece[i], centroids[centroids.argsort()[i]].numpy()))
alpha
=
self
.
search_alpha_min
alpha
=
self
.
search_alpha_min
alpha_max
=
self
.
search_scale_max
alpha_max
=
self
.
search_scale_max
if
self
.
search_scale_max
is
not
None
else
self
.
search_alpha_max
calibration_loss
=
float
(
'inf'
)
calibration_loss
=
float
(
'inf'
)
final_alpha
=
None
final_alpha
=
None
mask_for_search
=
paddle
.
where
(
labels
==
centroids
.
argsort
()[
i
],
mask_for_search
=
paddle
.
where
(
labels
==
centroids
.
argsort
()[
i
],
...
@@ -95,7 +95,9 @@ class PieceWiseSearch():
...
@@ -95,7 +95,9 @@ class PieceWiseSearch():
if
alpha
<
1
:
if
alpha
<
1
:
alpha
+=
0.01
alpha
+=
0.01
if
alpha
>=
self
.
search_alpha_max
:
if
alpha
>=
self
.
search_alpha_max
:
alpha
=
1.
alpha
=
self
.
search_scale_min
if
alpha
is
None
:
break
else
:
else
:
alpha
+=
0.5
alpha
+=
0.5
...
...
paddleslim/quant/observers/abs_max_weight.py
浏览文件 @
cafd9859
...
@@ -67,8 +67,9 @@ class AbsMaxChannelWiseWeightObserverLayer(ChannelWiseObserver):
...
@@ -67,8 +67,9 @@ class AbsMaxChannelWiseWeightObserverLayer(ChannelWiseObserver):
[
i
for
i
in
range
(
len
(
inputs
.
shape
))
if
i
!=
self
.
quant_axis
()])
[
i
for
i
in
range
(
len
(
inputs
.
shape
))
if
i
!=
self
.
quant_axis
()])
abs_max_values
=
paddle
.
max
(
abs_max_values
=
paddle
.
max
(
paddle
.
abs
(
inputs
),
axis
=
reduce_axis
).
cast
(
"float32"
)
paddle
.
abs
(
inputs
),
axis
=
reduce_axis
).
cast
(
"float32"
)
abs_max_values
=
paddle
.
where
(
abs_max_values
==
np
.
float32
(
0.0
),
abs_max_values
=
paddle
.
where
(
np
.
float32
(
1e-8
),
abs_max_values
)
abs_max_values
==
paddle
.
to_tensor
(
0
,
dtype
=
inputs
.
dtype
),
paddle
.
to_tensor
(
1e-8
,
dtype
=
inputs
.
dtype
),
abs_max_values
)
return
abs_max_values
return
abs_max_values
def
min_value
(
self
)
->
float
:
def
min_value
(
self
)
->
float
:
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录