构建高质量的开放领域(Open-Domain)的对话机器人,使得它能用自然语言与人自由地交流,这一直是自然语言处理领域终极目标之一。
PLATO-XL 是业界首个开源的百亿超大规模开放域对话预训练模型,其使用了参数高效(encoder-decoder共享参数)的 UnifiedTransformer(prefix LM)模型架构,将模型参数量提升到了11B量级,经过了十亿级样本对话数据的预训练,并引入role embedding区分多方对话中的对话角色提升预训练效果,最终模型闲聊测试效果超过了众多代表性的对话模型。可以直接使用 PLATO-XL 构建高质量的开放领域对话机器人。
PaddleNLP 内置了 PLATO-XL 英文预训练模型以供使用。由于 PLATO-XL 模型规模较大,这使得其在预测时生成对话回复的时间较长,并且 11B 的参数量也可能超出部分型号 GPU 显存容量,这是大模型推理与落地存在的普遍和关键问题。PaddleNLP FasterGeneration 为 PLATO-XL 提供了 GPU 上的高性能生成加速能力,并且支持模型并行(张量并行)推理允许通过多张小显存容量的 GPU 使用百亿大模型,相比单卡代码中也只增加了enable_ft_para()
一行,此外模型并行能进一步提升预测速度。
本项目提供了 PLATO-XL 英文模型使用 PaddleNLP FasterGeneration 进行高性能预测的使用示例。PLATO-XL 的训练及更多内容请参考 PaddlePaddle/Knover。
infer.py
是 PLATO-XL 高性能预测使用示例脚本,可以使用如下命令运行:
python infer.py --topk 4 --max_out_len 64 --use_faster --use_fp16
该脚本各个参数含义如下:
topk
用于Top-K采样策略,采样时将只从概率最高K个token中采样,默认为1,即greedy search。topp
用于Top-P采样策略,采样时将只从概率最高且累加概率不超过该值的token中采样,默认为1.0。max_out_len
指定生成的最大长度,默认为64。min_out_len
指定生成的最小长度,默认为1。temperature
用于调整预测概率分布,默认为1.0,即保持模型原有的预测概率。use_faster
使用 FasterGenerationuse_fp16
使用FP16,只在使用FasterGeneration时生效
脚本中使用了一条如下的多轮对话的样本数据, 由List[str]
表示,其中每个str
表示一句话,将根据历史对话内容生成回复。
history = [
"hi , Mary ! What do you usually like to do in your spare time ?",
"well , I spend a lot of time watching movies .",
"what a confidence ! I always watch a lot of movies , too ."
"oh really , Frank ? What kind of movies do you like ?"
]
注意 由于 PLATO-XL 模型较大,单卡预测至少需要22G显存(使用FP16时),且模型下载需要一定时间(FP32的权重文件约41G)。
多卡并行推理当前依赖 MPI(MPICH、OpenMPI均可)和NCCL,如需使用还请先安装依赖。安装完成后仍然使用 infer.py
来进行预测,相比单卡时不同的只是通过mpi来启动运行,如下:
mpirun -n 4 python infer.py --topk 4 --max_out_len 64 --use_faster --use_fp16
其中-n 4
指明使用的进程和GPU数,在n
设置为1时仍将进行单卡推理。由于多卡并行推理使用和单卡使用不同的依赖库,第一次运行时将重新进行JIT编译。
infer.py
中同时提供了性能测试的支持,在上面预测命令的基础上加上 --profile
即可,如下:
mpirun -n 4 python infer.py --batch_size 8 --min_out_len 20 --max_out_len 20 --topk 1 --use_faster --use_fp16 --profile
此外还指定了batch_size
和min_out_len
来得到特定输入输出大小下的性能,性能测试将给出循环运行多次的平均时延。以下为单卡高性能推理和4卡张量并行推理性能数据(V100,CUDA 10.2,输入长度60、输出长度20),可以看出4卡并行速度为单卡的2倍左右。
batch size | K | FasterGeneration 1卡 FP16 |
FasterGeneration 4卡 FP16 |
多卡并行 SpeedUp |
1 | 1 | 706.937 | 348.653 | 2.027 |
1 | 10 | 707.514 | 348.699 | 2.029 |
4 | 1 | 768.597 | 384.730 | 1.997 |
4 | 10 | 770.008 | 385.244 | 1.998 |
8 | 1 | 862.017 | 418.313 | 2.060 |
8 | 10 | 866.490 | 418.965 | 2.068 |
16 | 1 | 1016.362 | 486.974 | 2.087 |
16 | 10 | 1060.472 | 488.156 | 2.172 |
32 | 1 | 1325.700 | 606.770 | 2.184 |
32 | 10 | 1326.222 | 608.479 | 2.179 |
- 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.