LightSeq: 高性能序列处理与生成库
目录
更新日志
[2022.10.25] 发布 v3.0.0 版本,支持 int8 混合精度训练和推理。[中文介绍]
[2021.06.18] 发布 v2.0.0 版本,支持 fp16 混合精度训练。[中文介绍]
[2019.12.06] 发布 v1.0.0 版本,支持 fp16 混合精度推理。[中文介绍]
简介
LightSeq 是一个使用 CUDA 实现的高性能序列处理和生成库。它使得现代 NLP 和 CV 模型(如 BERT、GPT、Transformer 等)的计算变得高效。因此,它非常适用于机器翻译、文本生成、图像分类及其他序列相关任务。
该库建立在 CUDA 官方库(cuBLAS、Thrust、CUB)和专门为 Transformer 模型家族融合和优化的自定义内核函数之上。除了模型组件,推理库还提供基于 TensorRT Inference Server 的易于部署的模型管理和服务后台。使用 LightSeq,用户可以轻松开发修改后的 Transformer 架构,几乎无需额外的代码。
LightSeq 的训练和推理速度非常快。以下是整体性能:
- LightSeq fp16 训练相比 PyTorch fp16 训练速度提升高达 3 倍。
- LightSeq int8 训练相比 PyTorch QAT(即量化感知训练)速度提升高达 5 倍。
- LightSeq fp16 和 int8 推理相比 PyTorch fp16 推理速度分别提升高达 12 倍 和 15 倍。
支持矩阵
LightSeq 支持多个特性,见下表。
特性 | 支持列表 |
---|---|
模型 | Transformer、BERT、BART、GPT2、ViT、T5、MT5、XGLM、VAE、多语言、MoE |
层 | embedding、encoder、decoder、criterion、optimizer |
精度 | fp32、fp16、int8 |
模式 | 训练、推理 |
兼容性 | Fairseq、Hugging Face、DeepSpeed |
解码算法 | beam search、diverse beam search、sampling、CRF |
其他 | 梯度通信量化、自动调优 GEMM 算法 |
下表显示了不同模型当前支持的运行模式和精度。
模型 | fp16 训练 | fp16 推理 | int8 训练 | int8 推理 |
---|---|---|---|---|
Transformer | 是 | 是 | 是 | 是 |
BERT | 是 | 是 | 是 | 是 |
GPT2 | 是 | 是 | 是 | 是 |
BART | 是 | 是 | - | - |
T5 | - | 是 | - | - |
MT5 | - | 是 | - | - |
XGLM | - | 是 | - | - |
ViT | 是 | 是 | 是 | 是 |
VAE | - | 是 | - | - |
多语言 | - | 是 | - | 是 |
MoE | - | 是 | - | - |
性能
我们使用 Transformer 和 BERT 模型测试了 LightSeq 在 fp16 和 int8 混合精度下的训练和推理加速。基线为 PyTorch fp16 混合精度。训练实验在一块 A100 GPU 上进行,推理实验在八块 A100 GPU 上进行。
更多性能结果可在此处查看。
Transformer 训练加速
Batch Token Size | PyTorch QAT | LightSeq fp16 | LightSeq int8 |
---|---|---|---|
512 | 0.36 | 1.99 | 1.86 |
1024 | 0.37 | 1.78 | 1.69 |
2048 | 0.37 | 1.56 | 1.50 |
4096 | 0.39 | 1.47 | 1.44 |
8192 | 0.41 | 1.44 | 1.44 |
15000 | 0.43 | 1.44 | 1.44 |
BERT 训练加速
Batch Token Size | PyTorch QAT | LightSeq fp16 | LightSeq int8 |
---|---|---|---|
8 | 0.45 | 2.12 | 1.99 |
16 | 0.44 | 1.92 | 1.80 |
32 | 0.42 | 1.59 | 1.52 |
64 | 0.46 | 1.62 | 1.58 |
128 | 0.46 | 1.74 | 1.70 |
256 | 0.46 | 1.68 | 1.73 |
Transformer 推理加速
Batch Size | 序列长度 | LightSeq fp16 | LightSeq int8 |
---|---|---|---|
1 | 8 | 8.00 | 9.33 |
1 | 32 | 6.48 | 7.38 |
1 | 128 | 6.24 | 6.19 |
8 | 8 | 9.38 | 10.71 |
8 | 32 | 8.24 | 8.75 |
8 | 128 | 6.83 | 7.28 |
32 | 8 | 11.82 | 14.44 |
32 | 32 | 9.68 | 11.15 |
32 | 128 | 6.68 | 7.74 |
BERT 推理加速
Batch Size | 序列长度 | LightSeq fp16 | LightSeq int8 |
---|---|---|---|
1 | 8 | 9.22 | 9.87 |
1 | 32 |
安装
从 PyPI 安装
你可以从 PyPI 安装 LightSeq,它仅支持在 Linux 上的 Python 3.6 至 3.8 版本:
pip install lightseq
从源码构建
你也可以从源码构建:
PATH=/usr/local/hdf5/:$PATH ENABLE_FP32=0 ENABLE_DEBUG=0 pip install -e $PROJECT_DIR
详细的构建介绍可以参考这里。
入门指南
我们提供了几个示例来展示 LightSeq 的用法。更多详情请参考完整的用户指南和示例。
从零开始的 LightSeq 训练
你可以使用 LightSeq 提供的模块来构建你自己的模型。以下是构建一个 Transformer 编码器层的示例。
首先,导入 LightSeq Transformer 编码器模块:
from lightseq.training import LSTransformerEncoderLayer
然后创建编码器配置,并使用该配置初始化一个 LightSeq Transformer 编码器层:
config = LSTransformerEncoderLayer.get_config(
max_batch_tokens=4096,
max_seq_len=512,
hidden_size=1024,
intermediate_size=4096,
nhead=16,
attn_prob_dropout_ratio=0.1,
activation_dropout_ratio=0.1,
hidden_dropout_ratio=0.1,
pre_layer_norm=True,
activation_fn="relu",
fp16=True,
local_rank=0,
)
layer = LSTransformerEncoderLayer(config)
除了编码器层,其他模块也可以用类似的方法创建,然后像普通的 PyTorch 模型一样进行训练。
更多用法请参考这里。
使用 Fairseq 进行 LightSeq 训练
LightSeq 将所有快速和高效的模块集成到了 Fairseq 中。
首先安装以下两个依赖:
pip install fairseq==0.10.2 sacremoses
你可以在 wmt14 en2de 数据集上使用 fp16 混合精度进行翻译任务训练:
sh examples/training/fairseq/ls_fairseq_wmt14en2de.sh
(可选)然后你可以在 fp16 预训练模型的基础上开始 int8 混合精度训练:
sh examples/training/fairseq/ls_fairseq_quant_wmt14en2de.sh
更多用法请参考这里。
使用 Hugging Face BERT 进行 LightSeq 训练
LightSeq 用其快速层替换了 Hugging Face BERT 的编码器层。
首先你需要安装这些依赖:
pip install transformers seqeval datasets
在进行下一个训练之前,你需要切换到以下目录:
cd examples/training/huggingface/bert
然后你可以轻松地微调 BERT 用于不同的任务。以命名实体识别任务为例,你可以使用 fp16 混合精度训练 BERT:
python task_ner/run_ner.sh
(可选)你也可以在 fp16 预训练模型的基础上开始 int8 混合精度训练:
python task_ner/run_quant_ner.sh
更多用法请参考这里。
使用 Fairseq 进行 LightSeq 推理
在使用上述脚本进行训练后,你可以使用 LightSeq 快速推理这些模型。
你需要将 fp16 PyTorch 权重转换为 LightSeq 的 protobuf 或 HDF5 格式:
python export/fairseq/ls_fs_transformer_export.py
(可选)你也可以将 int8 PyTorch 权重转换为 LightSeq 的 protobuf 或 HDF5 格式:
python export/fairseq/ls_fs_quant_transformer_export.py
一旦获得了 LightSeq 权重,你可以使用以下代码快速进行推理:
import lightseq.inference as lsi
model = lsi.Transformer(MODEL_PATH, MAX_BATCH_SIZE)
results = model.infer([[63, 47, 65, 1507, 88, 74, 10, 2057, 362, 9, 284, 6, 2, 1]])
其中 MODEL_PATH 是你 LightSeq 权重的路径,MAX_BATCH_SIZE 是输入句子的最大批量大小。
你也可以通过将 lsi.Transformer
替换为 lsi.QuantTransformer
来快速推理 int8 LightSeq 权重。
更多用法请参考这里。
使用 Hugging Face BERT 进行 LightSeq 推理
我们提供了一个端到端的 bert-base 示例,来展示 LightSeq 相对于原始 Hugging Face 的速度有多快。
首先你应该安装依赖并切换到指定目录:
pip install transformers
cd examples/inference/python
然后你可以通过简单运行以下命令来检查性能。hf_bert_export.py
用于将 PyTorch 权重转换为 LightSeq 的 protobuf 或 HDF5 格式。
python export/huggingface/hf_bert_export.py
python test/ls_bert.py
更多用法请参考这里。
使用推理服务器进行 LightSeq 部署
我们提供了一个包含 tritonserver 和 LightSeq 动态链接库的 docker 镜像,你可以通过简单地替换模型文件为你自己的模型文件来部署推理服务器。
sudo docker pull hexisyztem/tritonserver_lightseq:22.01-1
更多用法请参考这里。
引用我们
如果你在研究中使用了 LightSeq,请引用以下论文。
@InProceedings{wang2021lightseq,
title = "{L}ight{S}eq: A High Performance Inference Library for Transformers",
author = "Wang, Xiaohui and Xiong, Ying and Wei, Yang and Wang, Mingxuan and Li, Lei",
booktitle = "Proceedings of the 2021 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies: Industry Papers (NAACL-HLT)",
month = jun,
year = "2021",
publisher = "Association for Computational Linguistics",
pages = "113--120",
}
@article{wang2021lightseq2,
title={LightSeq2: Accelerated Training for Transformer-based Models on GPUs},
author={Wang, Xiaohui and Xiong, Ying and Qian, Xian and Wei, Yang and Li, Lei and Wang, Mingxuan},
journal={arXiv preprint arXiv:2110.05722},
year={2021}
}
我们正在招聘!
LightSeq 团队正在招聘具有深度学习系统、自然语言处理、计算机视觉、语音等背景的实习生和全职员工。 我们位于北京和上海。如果你感兴趣,请将简历发送到 wangxiaohui.neo@bytedance.com。