发行说明
介绍
支持矩阵
表现
变压器训练加速
BERT 训练加速
Transformer 推理加速
BERT 推理加速
安装
从 PyPI 安装
从源代码构建
入门
从头开始进行 LightSeq 训练
Fairseq 的 LightSeq 培训
来自 Hugging Face BERT 的 LightSeq 训练
Fairseq 的 LightSeq 推理
来自 Hugging Face BERT 的 LightSeq 推理
使用推理服务器进行 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 训练和推理速度非常快。下面是整体表现:
与 PyTorch fp16 训练相比,LightSeq fp16 训练可实现高达3 倍的加速。
与 PyTorch QAT(即量化感知训练)相比,LightSeq int8 训练可实现高达5 倍的加速。
与 PyTorch fp16 推理相比,LightSeq fp16 和 int8 推理分别实现了高达12 倍和15 倍的加速。
LightSeq 支持多种功能,如下表所示。
特征 | 支持名单 |
---|---|
模型 | Transformer、BERT、BART、GPT2、ViT、T5、MT5、XGLM、VAE、多语言、MoE |
层 | 嵌入、编码器、解码器、标准、优化器 |
精确 | fp32、fp16、int8 |
模式 | 训练、推理 |
兼容性 | Fairseq、拥抱脸部、DeepSpeed |
解码算法 | 波束搜索、多样化波束搜索、采样、CRF |
其他的 | 梯度通信量化、自动调整GEMM算法 |
下表列出了不同型号目前支持的运行模式和精度。
型号 | fp16 训练 | fp16 推理 | int8培训 | int8 推理 |
---|---|---|---|---|
变压器 | 是的 | 是的 | 是的 | 是的 |
伯特 | 是的 | 是的 | 是的 | 是的 |
GPT2 | 是的 | 是的 | 是的 | 是的 |
捷运 | 是的 | 是的 | - | - |
T5 | - | 是的 | - | - |
MT5 | - | 是的 | - | - |
XGLM | - | 是的 | - | - |
维特 | 是的 | 是的 | 是的 | 是的 |
VAE | - | 是的 | - | - |
多种语言 | - | 是的 | - | 是的 |
教育部 | - | 是的 | - | - |
我们在 Transformer 和 BERT 模型上使用 fp16 和 int8 混合精度测试 LightSeq 训练和推理的加速情况。基线是 PyTorch fp16 混合精度。训练实验在 1 个 A100 GPU 上进行测试,推理实验在 8 个 A100 GPU 上进行测试。
更多性能结果可在此处获得。
批量令牌大小 | 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 |
批量令牌大小 | 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 |
批量大小 | 序列长度 | 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 |
批量大小 | 序列长度 | LightSeq fp16 | LightSeq int8 |
---|---|---|---|
1 | 8 | 9.22 | 9.87 |
1 | 32 | 10.51 | 11.30 |
1 | 128 | 9.96 | 10.85 |
8 | 8 | 9.88 | 10.33 |
8 | 32 | 7.79 | 8.22 |
8 | 128 | 4.04 | 4.35 |
32 | 8 | 10.60 | 11.02 |
32 | 32 | 8.11 | 8.85 |
32 | 128 | 1.82 | 2.04 |
您可以从 PyPI 安装 LightSeq,它仅支持 Linux 上的 Python 3.6 至 3.8:
pip 安装 lighteq
您还可以从源代码构建:
PATH=/usr/local/hdf5/:$PATH ENABLE_FP32=0 ENABLE_DEBUG=0 pip install -e $PROJECT_DIR
详细的建筑介绍可以在这里查看。
我们在这里提供了几个示例来展示 LightSeq 的用法。有关更多详细信息,请参阅完整的用户指南和示例。
您可以使用LightSeq提供的模块来构建您自己的模型。以下是构建 Transformer 编码器层的示例。
首先,导入LightSeq Transformer编码器模块:
从 lighteq.training 导入 LSTransformerEncoderLayer
然后创建一个编码器配置,并创建一个使用该配置初始化的 LightSeq Transformer 编码器层:
配置= LSTransformerEncoderLayer.get_config(max_batch_tokens=4096,max_seq_len=512,hidden_size=1024,intermediate_size=4096,nhead=16,attn_prob_d ropout_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, )层 = LSTransformerEncoderLayer(配置)
除了编码器层之外,其他模块都可以使用类似的方法创建,然后像正常的 PyTorch 模型一样进行训练。
更多用法可以在这里找到。
LightSeq 将所有快速和闪电模块集成到 Fairseq 中。
首先安装以下两个要求:
pip install fairseq==0.10.2 sacremoses
您可以通过以下方式在 wmt14 en2de 数据集上训练 fp16 混合精度翻译任务:
sh 示例/训练/fairseq/ls_fairseq_wmt14en2de.sh
(可选)然后可以在fp16预训练模型的基础上开始int8混合精度训练:
sh 示例/训练/fairseq/ls_fairseq_quant_wmt14en2de.sh
更多用法可以在这里找到。
LightSeq 用 LightSeq 快速层替换了 Hugging Face BERT 的编码器层。
首先您应该安装这些要求:
pip install Transformers seqeval 数据集
在进行下一步训练之前,需要切换到以下目录:
cd 示例/训练/huggingface/bert
然后您可以轻松地针对不同的任务微调 BERT。以命名实体识别任务为例,您可以使用以下方法训练 fp16 混合精度的 BERT:
python task_ner/run_ner.sh
(可选)您还可以在fp16预训练模型的基础上开始int8混合精度训练,方法是:
python task_ner/run_quant_ner.sh
更多用法可以在这里找到。
使用上述脚本进行训练后,您可以使用 LightSeq 快速推断模型。
您应该将 fp16 PyTorch 权重转换为 LightSeq protobuf 或 HDF5:
python 导出/fairseq/ls_fs_transformer_export.py
(可选)您还可以将 int8 PyTorch 权重转换为 LightSeq protobuf 或 HDF5:
python 导出/fairseq/ls_fs_quant_transformer_export.py
获得 LightSeq 权重后,您可以使用以下代码快速推断它们:
导入 lighteq.inference as lsimodel = 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 权重。
更多用法可以在这里找到。
我们提供了一个基于 bert 的 end2end 示例来看看 Lightseq 与原始 Hugging Face 相比有多快。
首先,您应该安装要求并定位到指定的目录:
pip install Transformerscd 示例/推理/python
然后您只需运行以下命令即可检查性能。 hf_bert_export.py
用于将 PyTorch 权重转换为 LightSeq protobuf 或 HDF5。
python 导出/huggingface/hf_bert_export.py 蟒蛇测试/ls_bert.py
更多用法可以在这里找到。
我们提供了一个docker镜像,其中包含tritonserver和LightSeq的动态链接库,您只需将模型文件替换为您自己的模型文件即可部署推理服务器。
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团队正在招聘具有深度学习系统、自然语言处理、计算机视觉、语音等背景的实习生和全职员工。我们的总部设在北京和上海。如果您感兴趣,请将简历发送至[email protected]。