一,结构介绍

FasterTransformer(FT) 是一个库,用于完成根据 Transformer 的神经网络推理的加快引擎,关于大模型,其以分布式方法跨过许多 GPU 和节点。FasterTransformer 包括 Transformer 块的高度优化版别的完成,其间包括编码器 Encoder 和解码器 Decoder 部分。根据 FT 能够运转完整的编码器-解码器架构(如 T5 大模型)以及仅编码器模型(如 BERT)或仅解码器模型(如 GPT)的推理。

FT 结构是用 C++/CUDA 编写的,依赖于高度优化的 cuBLAS、cuBLASLt 和 cuSPARSELt 库,与 NVIDIA TensorRT 等其他编译器比较,FT 的特点是它支撑以分布式方法推理 Transformer 大模型

别的,FasterTransformer 还供给 TensorFlow 集成(运用 TensorFlow 操作)、PyTorch 集成(运用 PyTorch 操作)和 Triton 集成作为后端。

其关于干流的开源大模型都供给 FP16 半精度推理支撑,并对部分大模型分别支撑:

  • INT8 低精度量化推理
  • 安培架构的 GPU 硬件部分支撑稀少化
  • Hopper 架构支撑 FP8 推理
  • Tensor 并行
  • Pipeline 并行

值得留意的是,FasterTransformer 结构都是在 C++ 层面支撑大模型,由于这些大模型都是经过 c++ 来完成的。

FasterTransformer 的作业流程分成两个部分:

  1. 核算输入字符串 ids 的 q、k、v 向量;
  2. 推理 Transformer 架构大模型,生成输出 ids

以下示例展现了怎么运转多GPU和多节点的GPT模型:

  1. examples/cpp/multi_gpu_gpt_example.cc:运用 MPI 安排一切GPU。

  2. examples/cpp/multi_gpu_gpt_triton_example.cc:在节点内运用线程,在节点间运用 MPI。该示例还演示了怎么运用FasterTransformer的Triton后端API运转GPT模型。

  3. examples/pytorch/gpt/multi_gpu_gpt_example.py:此示例相似于 examples/cpp/multi_gpu_gpt_example.cc,但经过 PyTorch OP 封装了 FasterTransformer 实例。

二,FasterTransformer 中的优化

2.1,OP交融(也叫算子交融)

CNN 模型中也有相似的技术,经过将 OP(算子)兼并成一个 OP(算子),来减少 Kernel 的调用。由于每一个根本 OP 都会对应一次 GPU kernel 的调用,和屡次显存读写,这些都会添加大量额定的开支。

TensorFlow XLA 能够在必定程度上缓解这个问题,它会对一些根本的 OP 进行兼并,以减少 GPU kernel 的调度和显存读写。但在大多数状况下,XLA 仍然无法达到最优的功能,特别是关于 BERT 这种核算密布的状况,任何功能的提高都将节约巨量的核算资源。

在 FT 结构内部,将除矩阵乘法以外的一切 kernel 都进行了尽可能的交融,单层 Transformer 的核算流程如下图所示:

FasterTransformer框架速览

如上图所示,Faster Transformer 只用了 14 个 kernel 就完成了原来将近 60 个 kernel 的核算逻辑。这其间,8 个 kernel 是经过调用 cuBLAS 接口核算矩阵乘法(绿色框),其余 6 个是自定义 kernel (蓝色框)。别的,不同巨细的 batch_size 优化成果不太一样:

  • 针对 batch size 比较小的场景(例如问答,TTS 等),简略的交融后,根本上就能够达到很好的功能。
  • 针对大 batch 的场景,我们需求对矩阵乘法和一切的自定义 kernel 做精密的调优,才能达到很好的加快作用。库房供给了脚本针对不同的 batch size 参数,可主动生成较优的 GEMM 算法。

2.2,自回归模型/激活缓存的推理优化

为了防止经过 Transformer 从头核算每个新 token 生成器的从前键和值,FT 分配一个缓冲区来在每一步存储它们。尽管需求一些额定的内存运用,但 FT 能够节约从头核算的本钱、在每一步分配缓冲区以及衔接的本钱,相同的缓存机制会用于 NN 的多个部分。该进程的方案下图所示:

FasterTransformer框架速览

2.3,运用 MPI 和 NCCL 完成节点间通讯并支撑模型并行性

在 GPT 模型中,FT 结构同时供给张量并行和流水线并行。 关于张量并行性,FasterTransformer 遵循了 Megatron 的思想。 关于自留意力块和前馈网络块,FT 按行拆分第一个矩阵的权重,并按列拆分第二个矩阵的权重。 经过优化,FT 能够将每个 Transformer 块的归约操作减少到两倍。

关于流水线并行性,FT 结构将整批请求拆分为多个微批,躲藏了通讯的泡沫。 FasterTransformer 会针对不同状况主动调整微批量巨细。

2.4,低精度推理

FT 的内核支撑运用 fp16int8 中的低精度输入数据进行推理。 由于较少的数据传输量和所需的内存,这两种机制都答应加快。int8 和 fp16 核算需求在特别硬件上履行,例如 Tensor Core(适用于从 Volta 开始的一切 GPU 架构),以及即将推出的 Hopper GPU 中的 FP8 推理。

三,代码速览

四,功能表现

在功能测验中,首要测验了根据不同输入特征、 TensorFlow 和 PyTorch 模型的加快比,以及运用 INT8-v2 量化的加快比。

benchmark 功能测验成果看,PyTorch 模型上的加快比更高,估测是 TensorFlow XLA 自身现已做了些图优化作业。关于大批量(large batch size)和更长的序列长度(sequence length),运用具有 INT8-v2 量化的 Effective FasterTransformer 能够带来 5 倍的加快,这也是加快比最大的状况。

FasterTransformer框架速览

TensorFlow XLA (Accelerated Linear Algebra) 是一种编译器和履行引擎,能够优化 TensorFlow 模型在 CPU、GPU 和 TPU 硬件平台上的功能。其优化技术包括:常量折叠、公共子表达式消除和死代码删去等。

五,怎么编译

  1. Install Docker(开发机默许装置好了)
  2. Download and install nvidia-docker2

nvidia-docker2 是一个命令行工具,与 docker 比较,它的特性是会主动将 NVIDIA GPU 驱动程序和 CUDA 库映射到容器中,使容器能够直接运用 GPU,而不用在容器中从头装置英伟达驱动和 CUDA 库。

详情参阅文章:

  • docs.nvidia.com/deeplearnin…
  • docs.nvidia.com/datacenter/…
  1. 进入 docker 镜像环境,并下载 FasterTransformer 库房代码及更新子模块
```bash
# 这儿给出的是官方供给 pytorch 镜像教程,tensorflow 相似
nvidia-docker run -ti --shm-size 5g --rm nvcr.io/nvidia/pytorch:22.09-py3 bash
git clone https://github.com/NVIDIA/FasterTransformer.git
mkdir -p FasterTransformer/build
cd FasterTransformer/build
git submodule init && git submodule update
```
  1. 编译项目。脚本中 -DSM=xx 的 xx 表明 GPU 的核算才能,不同的 GPU 有着不同的核算才能,关于 T4 推理卡 -DSM=75

根据 c++ 构建:

cmake -DSM=75 -DCMAKE_BUILD_TYPE=Release ..
make -j12

根据 PyTorch 构建

cmake -DSM=75 -DCMAKE_BUILD_TYPE=Release -DBUILD_PYT=ON -DBUILD_MULTI_GPU=ON ..
make -j12

默许编译是不支撑稀少矩阵乘法的,假如想在 BERT 上运用稀少 gemm,则需下载并提取 cusparseLt 库,并运用 -DSPARSITY_SUPPORT=ON -DCUSPARSELT_PATH=/the_extracted_cusparselt_path 进行编译:

wget https://developer.download.nvidia.com/compute/libcusparse-lt/0.1.0/local_installers/libcusparse_lt-linux-x86_64-0.1.0.2.tar.gz
tar -xzvf libcusparse_lt-linux-x86_64-0.1.0.2.tar.gz
cmake -DSM=xx -DCMAKE_BUILD_TYPE=Release -DBUILD_PYT=ON -DSPARSITY_SUPPORT=ON -DCUSPARSELT_PATH=/the_extracted_cusparselt_path ..
make -j12
  1. 装置 git-lfs
# 添加 packagecloud 存储库,apt/deb repos
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash
apt-get install git-lfs

六,怎么运用

6.1,bert 模型评测

FP32/FP16 精度的 BERT 模型在 C++ 版别的FasterTransformer结构下功能测验成果如下,很明显,FP32 单精度模型耗时几乎是 FP16 半精度模型的 5 倍。

留意,运转 bert_example 之前,需求以同等装备参数运转 bert_gemm 生成功能最佳的 gemm 算法参数,否则,比如用 FP16 的 gemm_config.in 装备去运转 bert_example,其推理速度可能更慢!

t4 卡有 320 个 Turing Tensor Core,支撑 BF16和INT8 精度推理,单精度功能 (FP32)-算力8.1T。

bert_guide.md 教程对 bert_example 程序对运用有问题,真正代码中没有 <int8_mode> 参数,假如,依照官方的教程,C++ 编译的库,在 T4 卡做 INT8 推理跑不通,会一向卡住。bert_examplebert_int8_example 程序参数解释:

bert_example batch_size num_layers seq_len head_num size_per_head data_type is_remove_padding
./bin/bert_example 32 12 32 12 64 0 0
bert_int8_example batch_size num_layers seq_len head_num size_per_head is_fp16 is_remove_padding int8_mode
./bin/bert_int8_example 1 12 128 12 64 1 0 2

C++ 编译版别下,FP32、FP16、BF16 精度下 bert 模型在 T4 卡上的推理时间分别是 40.85、8.16、4.11ms。别的,依照官方的教程,C++ 编译的库,在 T4 卡做 INT8 推理跑不通,会一向卡住。

推理脚本代码和推理成果输出如下所示:

# 1,FP32 精度推理
./bin/bert_gemm 32 32 12 64 0 0
./bin/bert_example 32 12 32 12 64 0 0 
# 2,FP16 精度推理
./bin/bert_gemm 32 32 12 64 1 0
./bin/bert_example 32 12 32 12 64 1 0 
# 3,BF16 精度推理
./bin/bert_gemm 32 32 12 64 2 0
./bin/bert_example 32 12 32 12 64 2 0
# 4,INT8 mode=1 精度推理
./bin/bert_gemm 32 32 12 64 1 1
./bin/bert_example 32 12 32 12 64 0 1
# 4,int8_mode == 2 精度推理,有问题
./bin/bert_gemm 32 32 12 64 1 2
./bin/bert_int8_example 32 12 32 12 64 0 2
# 5,Run Effective FasterTransformer under FP32 on C++ by set the <is_remove_padding> flag to 1 
./bin/bert_gemm 32 32 12 64 0 0
./bin/bert_example 32 12 32 12 64 0 1 0
# ./bin/bert_example 32 12 32 12 64 0 0
[INFO] Device: Tesla T4 
Before loading model: free: 14.65 GB, total: 14.76 GB, used:  0.11 GB
[FT][WARNING] Device 0 peer access Device 1 is not available.
After loading model : free: 14.00 GB, total: 14.76 GB, used:  0.76 GB
After inference     : free: 13.94 GB, total: 14.76 GB, used:  0.82 GB
[FT][INFO] batch_size 32 seq_len 32 layer 12 FT-CPP-time 40.85 ms (100 iterations) 
# ./bin/bert_example 32 12 32 12 64 1 0 
[INFO] Device: Tesla T4 
Before loading model: free: 14.65 GB, total: 14.76 GB, used:  0.11 GB
[FT][WARNING] Device 0 peer access Device 1 is not available.
After loading model : free: 14.19 GB, total: 14.76 GB, used:  0.57 GB
After inference     : free: 14.16 GB, total: 14.76 GB, used:  0.60 GB
[FT][INFO] batch_size 32 seq_len 32 layer 12 FT-CPP-time 8.16 ms (100 iterations) 
# ./bin/bert_example 32 12 32 12 64 2 0 
[INFO] Device: Tesla T4 
Before loading model: free: 14.65 GB, total: 14.76 GB, used:  0.11 GB
[FT][WARNING] Device 0 peer access Device 1 is not available.
After loading model : free: 14.19 GB, total: 14.76 GB, used:  0.57 GB
After inference     : free: 14.16 GB, total: 14.76 GB, used:  0.60 GB
[FT][INFO] batch_size 32 seq_len 32 layer 12 FT-CPP-time 4.11 ms (100 iterations) 
# ./bin/bert_example 32 12 32 12 64 0 1
[INFO] Device: Tesla T4 
Before loading model: free: 14.65 GB, total: 14.76 GB, used:  0.11 GB
[FT][WARNING] Device 0 peer access Device 1 is not available.
After loading model : free: 14.00 GB, total: 14.76 GB, used:  0.76 GB
After inference     : free: 13.94 GB, total: 14.76 GB, used:  0.82 GB
[FT][INFO] batch_size 32 seq_len 32 layer 12 FT-CPP-time 21.57 ms (100 iterations) 

七,GPT 功能测验

Performance of GPT-175B

  • head_num = 96
  • size_per_head = 128
  • num_layers = 96
  • data_type = FP16
  • vocab_size = 51200
  • top_p = 0.9
  • tensor_parallel_size = 8 with NVLink
Batch_size Input Seqlen Output Seqlen Megatron Latency (ms) FT Latency (ms) FT Speedup
1 128 8 660.38 488.86 1.35
2 128 8 687.34 509.47 1.35
4 128 8 1004.88 629.64 1.60
8 128 8 1705.07 749.86 2.27
12 128 8 2365.02 886.24 2.67
16 128 8 3111.57 1037.47 3.00
20 128 8 3723.73 1135.72 3.28
32 128 8 5778.72 1547.44 3.73
1 512 32 2384.78 1719.96 1.39
2 512 32 2503.24 1830.56 1.37
4 512 32 3658.65 2092.56 1.75
8 512 32 6238.79 2629.97 2.37
16 512 32 11409.53 3706.23 3.08

参阅资料

  1. 英伟达Fastertransformer源码解读
  2. github.com/NVIDIA/Fast…