Skip to content

Commit cafd985

Browse files
authored
Add Advanced Experiments Data in Docs (#1782)
1 parent 069cfb7 commit cafd985

File tree

3 files changed

+57
-5
lines changed

3 files changed

+57
-5
lines changed

docs/zh_cn/tutorials/quant/advanced_quantization.md

+50-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,54 @@
11
# 量化策略详细教程
2-
近年来,Transformer模型已在各个领域得到广泛采用,尤其是生成式语言大模型极大地推动了人工智能领域的发展。这些模型已经从数亿个参数发展到数千亿个参数,在有限的数据和 GPU 资源下运行,对于这些模型来说变得越来越具有挑战性。此时压缩技术变得格外重要,其中量化已成为减少内存占用和计算开销的通用和主要范例。然而,许多研究表明,Transformer模型往往会存在强烈的异常激活值,这使得它们难以量化。为了保持可接受的性能,这些异常值的存在要求激活具有更高的位宽或使用不同的数字格式、额外的微调或其他解决方法。本文档会介绍前沿的优化量化效果的几种策略,其中包括一些开源工作,也包括PaddleSlim自研的方法。以下方法暂时仅支持Transformer模型,具体示例使用方法可参考[PaddleNLP LLM示例](https://github.com/PaddlePaddle/PaddleNLP/tree/develop/llm/causallm),以下教程仅详细介绍API接口。
2+
近年来,Transformer模型已在各个领域得到广泛采用,尤其是生成式语言大模型极大地推动了人工智能领域的发展。这些模型已经从数亿个参数发展到数千亿个参数,在有限的数据和 GPU 资源下运行,对于这些模型来说变得越来越具有挑战性。此时压缩技术变得格外重要,其中量化已成为减少内存占用和计算开销的通用和主要范例。然而,许多研究表明,Transformer模型往往会存在强烈的异常激活值,这使得它们难以量化。为了保持可接受的性能,这些异常值的存在要求激活具有更高的位宽或使用不同的数字格式、额外的微调或其他解决方法。本文档会介绍前沿的优化量化效果的几种策略,其中包括一些开源工作,也包括PaddleSlim自研的方法。
3+
4+
## **LLM量化效果Benchmark**
5+
6+
1. LLama 13b 在不同量化策略下精度对比
7+
8+
| 量化策略 | 比特数 | ACC1/% | ACC2/% |
9+
| --------------- | ---------- | ---------------- | ---------------- |
10+
| Baseline | FP16 | 78.32 | 32.98 |
11+
| RTN | W8A8 | 34.05 | 24.96 |
12+
| SmoothQuant | W8A8 | 42.36 | 27.78 |
13+
| ShiftQuant | W8A8 | 33.35 | 25.48 |
14+
| Shift-SmoothQuant | W8A8 | 45.26 | 24.66 |
15+
| 自适应Shift-SmoothQuant | W8A8 | **78.07** | **32.69** |
16+
| | | |
17+
| RTN | W4A16 | 75.48 | 29.27 |
18+
| GPTQ | W4A16 | **77.55** | **32.32** |
19+
20+
2. Bloom 7.1b 在不同量化策略下精度对比
21+
22+
| 量化策略 | 比特数 | ACC1/% | ACC2/% |
23+
| --------------- | ---------- | ---------------- | ---------------- |
24+
| Baseline | FP16 | 77.18 | 41.08 |
25+
| RTN | W8A8 | 76.48 | 38.26 |
26+
| SmoothQuant | W8A8 | 76.57 | 38.70 |
27+
| ShiftQuant | W8A8 | 68.99 | 39.97 |
28+
| Shift-SmoothQuant | W8A8 | 76.77 | 37.22 |
29+
| 自适应Shift-SmoothQuant | W8A8 | **77.04** | **40.63** |
30+
| | | |
31+
| RTN | W4A16 | 75.18 | 38.03 |
32+
| GPTQ | W4A16 | **76.82** | **39.37** |
33+
34+
3. ChatGLM2 6b 在不同量化策略下精度对比
35+
36+
| 量化策略 | 比特数 | ACC1/% | ACC2/% |
37+
| --------------- | ---------- | ---------------- | ---------------- |
38+
| Baseline | FP16 | 76.46 | 31.57 |
39+
| PTQ-INT8 | W8A8 | 64.08 | 29.94 |
40+
| SmoothQuant | W8A8 | 64.29 | 29.86 |
41+
| ShiftQuant | W8A8 | 57.83 | 27.26 |
42+
| Shift-SmoothQuant | W8A8 | 58.89 | 24.29 |
43+
| 自适应Shift-SmoothQuant | W8A8 | **76.89** | **34.55** |
44+
| | | |
45+
| RTN | W4A16 | 74.20 | 26.30 |
46+
| GPTQ | W4A16 | **75.66** | **31.50** |
47+
48+
- ACC1:Finetuned下游任务下,使用数据集nl2sql的指标
49+
- ACC2:Pretrained开源任务下,使用数据集C-eval的指标
50+
51+
以下方法暂时仅支持Transformer模型,具体示例使用方法可参考[PaddleNLP LLM示例](https://github.com/PaddlePaddle/PaddleNLP/tree/develop/llm#6-%E9%87%8F%E5%8C%96),以下教程仅详细介绍API接口。
352

453
## 1. Shift功能
554

paddleslim/quant/advanced/piecewise_search.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def search(self, layer_name, sampled_input, act_abs_max, weight):
8484
# print('search for piece {}; centroids value is {}'.format(
8585
# piece[i], centroids[centroids.argsort()[i]].numpy()))
8686
alpha = self.search_alpha_min
87-
alpha_max = self.search_scale_max
87+
alpha_max = self.search_scale_max if self.search_scale_max is not None else self.search_alpha_max
8888
calibration_loss = float('inf')
8989
final_alpha = None
9090
mask_for_search = paddle.where(labels == centroids.argsort()[i],
@@ -95,7 +95,9 @@ def search(self, layer_name, sampled_input, act_abs_max, weight):
9595
if alpha < 1:
9696
alpha += 0.01
9797
if alpha >= self.search_alpha_max:
98-
alpha = 1.
98+
alpha = self.search_scale_min
99+
if alpha is None:
100+
break
99101
else:
100102
alpha += 0.5
101103

paddleslim/quant/observers/abs_max_weight.py

+3-2
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,9 @@ def _cal_abs_max(self, inputs):
6767
[i for i in range(len(inputs.shape)) if i != self.quant_axis()])
6868
abs_max_values = paddle.max(
6969
paddle.abs(inputs), axis=reduce_axis).cast("float32")
70-
abs_max_values = paddle.where(abs_max_values == np.float32(0.0),
71-
np.float32(1e-8), abs_max_values)
70+
abs_max_values = paddle.where(
71+
abs_max_values == paddle.to_tensor(0, dtype=inputs.dtype),
72+
paddle.to_tensor(1e-8, dtype=inputs.dtype), abs_max_values)
7273
return abs_max_values
7374

7475
def min_value(self) -> float:

0 commit comments

Comments
 (0)