Skip to content

Commit a389a72

Browse files
authored
Add model parallel for PLATO (#1987)
* Add mp for plato * Add ParallelParam in decoding_beamsearch.h * Add parallel utils. * Begin to add tensor parallel in decoding_sampling. * Add seed for plato mp. Add init wraper for plato mp. * Make PLATO tensor parallel run correctly. * Fix copy_data * Use transpose_general_kernelLauncher in open_decoder.h * Fix transpose_general_kernelLauncher when using half. * Add function declaration for transpose. * Add PLATO-XL model parallel example. * Use DataCollator for plato-xl. Make default tensor para size adapt to world size. * Update plato-xl mp example. * Update PLAOT-XL README. * Update PLATO-XL example and README. * Update PLATO-XL speed table.
1 parent 69a8c79 commit a389a72

File tree

18 files changed

+853
-442
lines changed

18 files changed

+853
-442
lines changed

examples/dialogue/plato-xl/README.md

Lines changed: 127 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,145 @@
44

55
构建高质量的开放领域(Open-Domain)的对话机器人,使得它能用自然语言与人自由地交流,这一直是自然语言处理领域终极目标之一。
66

7-
为了能够简易地构建一个高质量的开放域聊天机器人,本项目在 Paddle 上实现了 PLATO-XL 的预测模型,并实现了高性能的预测加速,而整套 float16 的方案可以确保在 32G V100 单卡上就能 load 并执行 11B 的 PLATO-XL 模型,无需再涉及 float32 相关计算
7+
PLATO-XL 是业界首个开源的百亿超大规模开放域对话预训练模型,其使用了参数高效(encoder-decoder共享参数)的 UnifiedTransformer(prefix LM)模型架构,将模型参数量提升到了11B量级,经过了十亿级样本对话数据的预训练,并引入role embedding区分多方对话中的对话角色提升预训练效果,最终模型闲聊测试效果超过了众多代表性的对话模型。可以直接使用 PLATO-XL 构建高质量的开放领域对话机器人
88

9-
此外,PLATO-XL 72-layers, 32-heads, 3072-hidden,网络参数量较大,即使是在使用 float16 的情况下,72 层网络至少需要显存约 24G,并且需要保证当前使用的 GPU 支持 float16 的计算
9+
PaddleNLP 内置了 PLATO-XL 英文预训练模型以供使用。由于 PLATO-XL 模型规模较大,这使得其在预测时生成对话回复的时间较长,并且 11B 的参数量也可能超出部分型号 GPU 显存容量,这是大模型推理与落地存在的普遍和关键问题。PaddleNLP FasterGeneration 为 PLATO-XL 提供了 GPU 上的高性能生成加速能力,并且支持模型并行(张量并行)推理允许通过多张小显存容量的 GPU 使用百亿大模型,相比单卡代码中也只增加了`enable_ft_para()`一行,此外模型并行能进一步提升预测速度
1010

11-
其中:
12-
* 支持 float16 的 GPU 信息可以在 NVIDIA [官网](https://docs.nvidia.com/deeplearning/tensorrt/support-matrix/index.html#hardware-precision-matrix) 上查询;
13-
* 您当前使用的 GPU 的 compute capability 同样可以在 NVIDIA [官网](https://developer.nvidia.com/zh-cn/cuda-gpus#compute) 上找到,与上面链接中表格对应。
11+
本项目提供了 PLATO-XL 英文模型使用 PaddleNLP FasterGeneration 进行高性能预测的使用示例。PLATO-XL 的训练及更多内容请参考 [PaddlePaddle/Knover](https://github.com/PaddlePaddle/Knover/tree/develop/projects/PLATO-XL)
1412

15-
PLATO-XL 的训练过程及其他细节详见 [Knover](https://github.com/PaddlePaddle/Knover/tree/develop/projects/PLATO-XL)
13+
## 开始运行
14+
### 单卡高性能推理
1615

17-
## 快速开始
16+
`infer.py` 是 PLATO-XL 高性能预测使用示例脚本,可以使用如下命令运行:
1817

19-
### 环境依赖
18+
```shell
19+
python infer.py --topk 4 --max_out_len 64 --use_faster --use_fp16
20+
```
21+
22+
该脚本各个参数含义如下:
2023

21-
- python 3.7+
22-
- sentencepiece
24+
- `topk` 用于Top-K采样策略,采样时将只从概率最高K个token中采样,默认为1,即greedy search。
25+
- `topp` 用于Top-P采样策略,采样时将只从概率最高且累加概率不超过该值的token中采样,默认为1.0。
26+
- `max_out_len` 指定生成的最大长度,默认为64。
27+
- `min_out_len` 指定生成的最小长度,默认为1。
28+
- `temperature` 用于调整预测概率分布,默认为1.0,即保持模型原有的预测概率。
29+
- `use_faster` 使用 FasterGeneration
30+
- `use_fp16` 使用FP16,只在使用FasterGeneration时生效
2331

24-
安装方式:
25-
``` python
26-
pip install sentencepiece
32+
脚本中使用了一条如下的多轮对话的样本数据, 由`List[str]`表示,其中每个`str`表示一句话,将根据历史对话内容生成回复。
33+
34+
```python
35+
history = [
36+
"hi , Mary ! What do you usually like to do in your spare time ?",
37+
"well , I spend a lot of time watching movies .",
38+
"what a confidence ! I always watch a lot of movies , too ."
39+
"oh really , Frank ? What kind of movies do you like ?"
40+
]
2741
```
2842

29-
### 高性能生成
43+
**注意** 由于 PLATO-XL 模型较大,单卡预测至少需要22G显存(使用FP16时),且模型下载需要一定时间(FP32的权重文件约41G)。
44+
45+
### 多卡并行推理
3046

31-
使用 `infer.py` 脚本进行测试,无需单独下载预训练模型,脚本将自行下载。运行如下命令即可进行高性能预测,脚本使用了一条对话生成的语句作为性能测试的例子,forward 将自动循环 200 次前向以供性能测试需要。
47+
多卡并行推理当前依赖 MPI 和 NCCL,如需使用还请先安装依赖。安装完成后仍然使用 `infer.py` 来进行预测,相比单卡时不同的只是通过mpi来启动运行,如下:
3248

3349
```shell
34-
export CUDA_VISIBLE_DEVICES=0
35-
python infer.py --use_role --position_style relative --max_out_len 64 --min_out_len 1 --topk 4
50+
mpirun -n 4 python infer.py --topk 4 --max_out_len 64 --use_faster --use_fp16
3651
```
3752

38-
该脚本各个参数含义如下:
53+
其中`-n 4`指明使用的进程和GPU数,在`n`设置为1时仍将进行单卡推理。由于多卡并行推理使用和单卡使用不同的依赖库,第一次运行时将重新进行JIT编译。
54+
55+
### 性能测试
56+
57+
`infer.py` 中同时提供了性能测试的支持,在上面预测命令的基础上加上 `--profile` 即可,如下:
58+
59+
```shell
60+
mpirun -n 4 python infer.py --batch_size 8 --min_out_len 20 --max_out_len 20 --topk 1 --use_faster --use_fp16 --profile
61+
```
62+
63+
此外还指定了`batch_size``min_out_len`来得到特定输入输出大小下的性能,性能测试将给出循环运行多次的平均时延。以下为单卡高性能推理和4卡张量并行推理性能数据(V100,CUDA 10.2,输入长度60、输出长度20),可以看出4卡并行速度为单卡的2倍左右。
64+
65+
<table>
66+
<caption>PLATO-XL 高性能推理速度&nbsp;&nbsp;(in ms/batch)</caption>
67+
<tr style="text-align:center;">
68+
<td align=center>batch size</td>
69+
<td align=center>K</td>
70+
<td align=center>FasterGeneration</br>1卡</br>FP16</td>
71+
<td align=center>FasterGeneration</br>4卡</br>FP16</td>
72+
<td align=center>多卡并行</br>SpeedUp</td>
73+
</tr>
74+
<tr style="text-align:center;">
75+
<td align=center>1</td>
76+
<td align=center>1</td>
77+
<td align=center>706.937</td>
78+
<td align=center>348.653</td>
79+
<td align=center>2.027</td>
80+
</tr>
81+
<tr style="text-align:center;">
82+
<td align=center>1</td>
83+
<td align=center>10</td>
84+
<td align=center>707.514</td>
85+
<td align=center>348.699</td>
86+
<td align=center>2.029</td>
87+
</tr>
88+
<tr style="text-align:center;">
89+
<td align=center>4</td>
90+
<td align=center>1</td>
91+
<td align=center>768.597</td>
92+
<td align=center>384.730</td>
93+
<td align=center>1.997</td>
94+
</tr>
95+
<tr style="text-align:center;">
96+
<td align=center>4</td>
97+
<td align=center>10</td>
98+
<td align=center>770.008</td>
99+
<td align=center>385.244</td>
100+
<td align=center>1.998</td>
101+
</tr>
102+
<tr style="text-align:center;">
103+
<td align=center>8</td>
104+
<td align=center>1</td>
105+
<td align=center>862.017</td>
106+
<td align=center>418.313</td>
107+
<td align=center>2.060</td>
108+
</tr>
109+
<tr style="text-align:center;">
110+
<td align=center>8</td>
111+
<td align=center>10</td>
112+
<td align=center>866.490</td>
113+
<td align=center>418.965</td>
114+
<td align=center>2.068</td>
115+
</tr>
116+
<tr style="text-align:center;">
117+
<td align=center>16</td>
118+
<td align=center>1</td>
119+
<td align=center>1016.362</td>
120+
<td align=center>486.974</td>
121+
<td align=center>2.087</td>
122+
</tr>
123+
<tr style="text-align:center;">
124+
<td align=center>16</td>
125+
<td align=center>10</td>
126+
<td align=center>1060.472</td>
127+
<td align=center>488.156</td>
128+
<td align=center>2.172</td>
129+
</tr>
130+
<tr style="text-align:center;">
131+
<td align=center>32</td>
132+
<td align=center>1</td>
133+
<td align=center>1325.700</td>
134+
<td align=center>606.770</td>
135+
<td align=center>2.184</td>
136+
</tr>
137+
<tr style="text-align:center;">
138+
<td align=center>32</td>
139+
<td align=center>10</td>
140+
<td align=center>1326.222</td>
141+
<td align=center>608.479</td>
142+
<td align=center>2.179</td>
143+
</tr>
144+
</table>
145+
146+
## Reference
39147

40-
* `--use_role`: 是否使用 role embedding。
41-
* `--position_style`: 位置编码方式,这里可以选择是 "relative" 或是 "continuous"。
42-
* `--max_out_len`: 最长的输出的长度。
43-
* `--min_out_len`: 最短的输出长度。
44-
* `--topk`: 用于 top_k sampling 的 k 值的设定。
45-
* `--topp`: 用于 top_p sampling 的 p 值的设定。
148+
1. Bao S, He H, Wang F, et al. Plato-xl: Exploring the large-scale pre-training of dialogue generation[J]. arXiv preprint arXiv:2109.09519, 2021.

0 commit comments

Comments
 (0)