注意:FasterTransformer 的开发已转向 TensorRT-LLM。鼓励所有开发者使用 TensorRT-LLM 以获取大语言模型(LLM)推理的最新改进。NVIDIA/FasterTransformer 仓库将保持存在,但不再进行后续开发。
本仓库提供了一个脚本和配方,用于运行高度优化的基于 Transformer 的编码器和解码器组件,并由 NVIDIA 进行测试和维护。
在自然语言处理(NLP)中,编码器和解码器是两个重要组件,而 Transformer 层已成为这两个组件的流行架构。FasterTransformer 为推理实现了高度优化的编码器和解码器 Transformer 层。在 Volta、Turing 和 Ampere GPU 上,当数据和权重的精度为 FP16 时,会自动利用 Tensor Cores 的计算能力。
FasterTransformer 构建在 CUDA、cuBLAS、cuBLASLt 和 C++ 之上。我们至少提供以下框架之一的 API:TensorFlow、PyTorch 和 Triton 后端。用户可以直接将 FasterTransformer 集成到这些框架中。对于支持的框架,我们还提供了示例代码来演示如何使用,并展示在这些框架上的性能。
| 模型 | 框架 | FP16 | INT8 (Turing 之后) | 稀疏性 (Ampere 之后) | 张量并行 | 流水线并行 | FP8 (Hopper 之后) |
|---|---|---|---|---|---|---|---|
| BERT | TensorFlow | 是 | 是 | - | - | - | - |
| BERT | PyTorch | 是 | 是 | 是 | 是 | 是 | - |
| BERT | Triton 后端 | 是 | - | - | 是 | 是 | - |
| BERT | C++ | 是 | 是 | - | - | - | 是 |
| XLNet | C++ | 是 | - | - | - | - | - |
| 编码器 | TensorFlow | 是 | 是 | - | - | - | - |
| 编码器 | PyTorch | 是 | 是 | 是 | - | - | - |
| 解码器 | TensorFlow | 是 | - | - | - | - | - |
| 解码器 | PyTorch | 是 | - | - | - | - | - |
| 解码 | TensorFlow | 是 | - | - | - | - | - |
| 解码 | PyTorch | 是 | - | - | - | - | - |
| GPT | TensorFlow | 是 | - | - | - | - | - |
| GPT/OPT | PyTorch | 是 | - | - | 是 | 是 | 是 |
| GPT/OPT | Triton 后端 | 是 | - | - | 是 | 是 | - |
| GPT-MoE | PyTorch | 是 | - | - | 是 | 是 | - |
| BLOOM | PyTorch | 是 | - | - | 是 | 是 | - |
| BLOOM | Triton 后端 | 是 | - | - | 是 | 是 | - |
| GPT-J | Triton 后端 | 是 | - | - | 是 | 是 | - |
| Longformer | PyTorch | 是 | - | - | - | - | - |
| T5/UL2 | PyTorch | 是 | - | - | 是 | 是 | - |
| T5 | TensorFlow 2 | 是 | - | - | - | - | - |
| T5/UL2 | Triton 后端 | 是 | - | - | 是 | 是 | - |
| T5 | TensorRT | 是 | - | - | 是 | 是 | - |
| T5-MoE | PyTorch | 是 | - | - | 是 | 是 | - |
| Swin Transformer | PyTorch | 是 | 是 | - | - | - | - |
| Swin Transformer | TensorRT | 是 | 是 | - | - | - | - |
| ViT | PyTorch | 是 | 是 | - | - | - | - |
| ViT | TensorRT | 是 | 是 | - | - | - | - |
| GPT-NeoX | PyTorch | 是 | - | - | 是 | 是 | - |
| GPT-NeoX | Triton 后端 | 是 | - | - | 是 | 是 | - |
| BART/mBART | PyTorch | 是 | - | - | 是 | 是 | - |
| WeNet | C++ | 是 | - | - | - | - | - |
| DeBERTa | TensorFlow 2 | 是 | - | - | 进行中 | 进行中 | - |
| DeBERTa | PyTorch | 是 | - | - | 进行中 | 进行中 | - |
特定模型的更多详细信息放在 docs/ 目录下的 xxx_guide.md 文件中,其中 xxx 表示模型名称。一些常见问题及其答案放在 docs/QAList.md。请注意,编码器和 BERT 的模型相似,我们将解释一起放在 bert_guide.md 中。
以下代码列出了 FasterTransformer 的目录结构:
/src/fastertransformer: FasterTransformer 的源代码
|--/cutlass_extensions: cutlass gemm/kernels 的实现。
|--/kernels: 不同模型/层和操作的 CUDA 内核,如 addBiasResiual。
|--/layers: 层模块的实现,如注意力层、前馈网络层。
|--/models: 不同模型的实现,如 BERT、GPT。
|--/tensorrt_plugin: 将 FasterTransformer 封装到 TensorRT 插件中。
|--/tf_op: 自定义 Tensorflow OP 实现
|--/th_op: 自定义 PyTorch OP 实现
|--/triton_backend: 自定义 triton 后端实现
|--/utils: 包含常见的 cuda 工具,如 cublasMMWrapper、memory_utils
/examples: C++、tensorflow 和 pytorch 接口示例
|--/cpp: C++ 接口示例
|--/pytorch: PyTorch OP 示例
|--/tensorflow: TensorFlow OP 示例
|--/tensorrt: TensorRT 示例
/docs: 解释不同模型实现细节并展示基准测试的文档
/benchmark: 包含运行不同模型基准测试的脚本
/tests: 单元测试
/templates: 解释如何将新模型/示例添加到 FasterTransformer 仓库的文档
请注意,许多文件夹包含许多子文件夹以拆分不同的模型。量化工具已移至 examples,例如 examples/tensorflow/bert/bert-quantization/ 和 examples/pytorch/bert/bert-quantization-sparsity/。
FasterTransformer 提供了一些方便的环境变量用于调试和测试。
FT_LOG_LEVEL: 此环境变量控制调试消息的日志级别。更多详细信息在 src/fastertransformer/utils/logger.h 中。请注意,当级别低于 DEBUG 时,程序将打印大量消息,并且程序会变得非常慢。FT_NVTX: 如果设置为 ON,例如 FT_NVTX=ON ./bin/gpt_example,程序将插入 nvtx 标签以帮助分析程序性能。FT_DEBUG_LEVEL: 如果设置为 DEBUG,则程序将在每个内核之后运行 cudaDeviceSynchronize()。否则,内核默认异步执行。这在调试时定位错误点很有帮助。但此标志会显著影响程序性能。因此,应仅用于调试。硬件设置:
为了运行以下基准测试,我们需要通过以下命令安装 Unix 计算工具 "bc":
apt-get install bc
TensorFlow 的 FP16 结果通过运行 benchmarks/bert/tf_benchmark.sh 获得。
TensorFlow 的 INT8 结果通过运行 benchmarks/bert/tf_int8_benchmark.sh 获得。
PyTorch 的 FP16 结果通过运行 benchmarks/bert/pyt_benchmark.sh 获得。
PyTorch 的 INT8 结果通过运行 benchmarks/bert/pyt_int8_benchmark.sh 获得。
更多基准测试放在 docs/bert_guide.md。
下图比较了 T4 上 FasterTransformer 不同特性与 FP16 下 FasterTransformer 的性能。
对于大批量大小和序列长度,EFF-FT 和 FT-INT8-v2 都带来了约 2 倍的加速。同时使用 Effective FasterTransformer 和 int8v2 可以为大场景带来约 3.5 倍的加速(相比 FasterTransformer FP16)。

下图比较了 T4 上 FasterTransformer 不同特性与 TensorFlow XLA 在 FP16 下的性能。
对于小批量大小和序列长度,使用 FasterTransformer 可以带来约 3 倍的加速。
对于大批量大小和序列长度,使用带有 INT8-v2 量化的 Effective FasterTransformer 可以带来约 5 倍的加速。

下图比较了 T4 上 FasterTransformer 不同特性与 PyTorch TorchScript 在 FP16 下的性能。
对于小批量大小和序列长度,使用 FasterTransformer CustomExt 可以带来约 4 倍 ~ 6 倍的加速。
对于大批量大小和序列长度,使用带有 INT8-v2 量化的 Effective FasterTransformer 可以带来约 5 倍的加速。

TensorFlow 的结果通过运行 benchmarks/decoding/tf_decoding_beamsearch_benchmark.sh 和 benchmarks/decoding/tf_decoding_sampling_benchmark.sh 获得。
PyTorch 的结果通过运行 benchmarks/decoding/pyt_decoding_beamsearch_benchmark.sh 获得。
在解码实验中,我们更新了以下参数:
更多基准测试放在 docs/decoder_guide.md。
下图显示了在 T4 上 FP16 下,FT-Decoder op 和 FT-Decoding op 相比 TensorFlow 的加速比。这里,我们使用翻译测试集的吞吐量来防止不同方法的总令牌数可能不同。与 TensorFlow 相比,FT-Decoder 提供 1.5 倍 ~ 3 倍的加速;而 FT-Decoding 提供 4 倍 ~ 18 倍的加速。

下图显示了在 T4 上 FP16 下,FT-Decoder op 和 FT-Decoding op 相比 PyTorch 的加速比。这里,我们使用翻译测试集的吞吐量来防止不同方法的总令牌数可能不同。与 PyTorch 相比,FT-Decoder 提供 1.2 倍 ~ 3 倍的加速;而 FT-Decoding 提供 3.8 倍 ~ 13 倍的加速。

下图比较了 A100 上 Megatron 和 FasterTransformer 在 FP16 下的性能。
在解码实验中,我们更新了以下参数:

2023年5月
- 修复生成提前停止的 bug
2023年1月
- 支持 GPT MoE
- 支持 Bert 和 GPT 的 FP8(实验性)
- 在 TensorFlow 2 和 PyTorch 上支持 DeBERTa
2022年12月
- 发布 FasterTransformer 5.2
- 支持最小长度惩罚
2022年11月
- 支持 T5 Tensorflow 2 自定义 op。
- 支持 T5 MoE
- 支持 WeNet
- 支持 BART & mBART
- 支持 SwinV2
- 初步支持 GPT 的 w8a8 int8 模式(预览)
- 支持 GPT 中的融合多头注意力
2022年10月
- 支持 BLOOM
2022年9月
- 在 GPT 中支持事实采样(链接)
- 在 T5 中支持 IA3 适配方案
2022年8月
- 在 GPT 中支持返回上下文令牌嵌入
- 发布 FasterTransformer 5.1
- 支持交互式生成
- 支持注意力时间限制内存
- 支持 mt5 和 t5-v1.1
2022年7月
- 支持 UL2 huggingface 检查点。(链接)
- 修复 bfloat16 下 T5 的 bug。
- 添加 ViT INT8 TensorRT 插件
- 支持批量采样
- 在 GPT 模型中支持共享上下文优化
2022年6月
- 支持 Triton 后端的流式生成。
- 支持 OPT。
- 在 FP32、FP16 和 BF16 下支持多节点多 GPU BERT。
2022年5月
- 在大多数模型上支持 bfloat16。
- 为 GPT-J 支持前缀提示。
- 支持 GPT-NeoX。
- 现在,LayerNorm 中使用的 epsilon