|
4 | 4 |
|
5 | 5 | 构建高质量的开放领域(Open-Domain)的对话机器人,使得它能用自然语言与人自由地交流,这一直是自然语言处理领域终极目标之一。
|
6 | 6 |
|
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 构建高质量的开放领域对话机器人。 |
8 | 8 |
|
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()`一行,此外模型并行能进一步提升预测速度。 |
10 | 10 |
|
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)。 |
14 | 12 |
|
15 |
| -PLATO-XL 的训练过程及其他细节详见 [Knover](https://github.com/PaddlePaddle/Knover/tree/develop/projects/PLATO-XL) |
| 13 | +## 开始运行 |
| 14 | +### 单卡高性能推理 |
16 | 15 |
|
17 |
| -## 快速开始 |
| 16 | +`infer.py` 是 PLATO-XL 高性能预测使用示例脚本,可以使用如下命令运行: |
18 | 17 |
|
19 |
| -### 环境依赖 |
| 18 | +```shell |
| 19 | +python infer.py --topk 4 --max_out_len 64 --use_faster --use_fp16 |
| 20 | +``` |
| 21 | + |
| 22 | +该脚本各个参数含义如下: |
20 | 23 |
|
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时生效 |
23 | 31 |
|
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 | + ] |
27 | 41 | ```
|
28 | 42 |
|
29 |
| -### 高性能生成 |
| 43 | +**注意** 由于 PLATO-XL 模型较大,单卡预测至少需要22G显存(使用FP16时),且模型下载需要一定时间(FP32的权重文件约41G)。 |
| 44 | + |
| 45 | +### 多卡并行推理 |
30 | 46 |
|
31 |
| -使用 `infer.py` 脚本进行测试,无需单独下载预训练模型,脚本将自行下载。运行如下命令即可进行高性能预测,脚本使用了一条对话生成的语句作为性能测试的例子,forward 将自动循环 200 次前向以供性能测试需要。 |
| 47 | +多卡并行推理当前依赖 MPI 和 NCCL,如需使用还请先安装依赖。安装完成后仍然使用 `infer.py` 来进行预测,相比单卡时不同的只是通过mpi来启动运行,如下: |
32 | 48 |
|
33 | 49 | ```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 |
36 | 51 | ```
|
37 | 52 |
|
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 高性能推理速度 (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 |
39 | 147 |
|
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