一,结构介绍
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 的作业流程分成两个部分:
- 核算输入字符串
ids
的 q、k、v 向量; - 推理 Transformer 架构大模型,生成输出
ids
。
以下示例展现了怎么运转多GPU和多节点的GPT模型:
-
examples/cpp/multi_gpu_gpt_example.cc:运用
MPI
安排一切GPU。 -
examples/cpp/multi_gpu_gpt_triton_example.cc:在节点内运用线程,在节点间运用 MPI。该示例还演示了怎么运用FasterTransformer的Triton后端API运转GPT模型。
-
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 的核算流程如下图所示:
如上图所示,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 的多个部分。该进程的方案下图所示:
2.3,运用 MPI 和 NCCL 完成节点间通讯并支撑模型并行性
在 GPT 模型中,FT 结构同时供给张量并行和流水线并行。 关于张量并行性,FasterTransformer 遵循了 Megatron 的思想。 关于自留意力块和前馈网络块,FT 按行拆分第一个矩阵的权重,并按列拆分第二个矩阵的权重。 经过优化,FT 能够将每个 Transformer 块的归约操作减少到两倍。
关于流水线并行性,FT 结构将整批请求拆分为多个微批,躲藏了通讯的泡沫。 FasterTransformer 会针对不同状况主动调整微批量巨细。
2.4,低精度推理
FT 的内核支撑运用 fp16
和 int8
中的低精度输入数据进行推理。 由于较少的数据传输量和所需的内存,这两种机制都答应加快。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 倍的加快,这也是加快比最大的状况。
TensorFlow XLA (Accelerated Linear Algebra) 是一种编译器和履行引擎,能够优化 TensorFlow 模型在 CPU、GPU 和 TPU 硬件平台上的功能。其优化技术包括:常量折叠、公共子表达式消除和死代码删去等。
五,怎么编译
- Install
Docker
(开发机默许装置好了) - Download and install
nvidia-docker2
nvidia-docker2
是一个命令行工具,与 docker 比较,它的特性是会主动将 NVIDIA GPU 驱动程序和 CUDA 库映射到容器中,使容器能够直接运用 GPU,而不用在容器中从头装置英伟达驱动和 CUDA 库。
详情参阅文章:
- docs.nvidia.com/deeplearnin…
- docs.nvidia.com/datacenter/…
- 进入 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
```
-
编译项目。脚本中 -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
- 装置 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_example
和 bert_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 |
参阅资料
- 英伟达Fastertransformer源码解读
- github.com/NVIDIA/Fast…