FasterTransformer 001 start up

FasterTransformer

  • Faster Transformer是一个Transformer单层前向计算的高效实现。一个函数由多个OP组合实现。每一个基本OP都会对应一次GPU kernel的调用,和多次显存读写。OP融合可以降低GPU调度和显存读写,进而提升性能。在Faster Transformer,作者将除矩阵乘法以外的所有kernel都进行了尽可能的融合。

NVIDIA 博客在2019-07-15的介绍:

  • 目前优化集中在编码器(encoder)的前向计算(解码器decoder开发在后续特性规划中)。底层由CUDA和cuBLAS实现,支持FP16和FP32两种计算模式,其中FP16可以充分利用Volta和Turing架构GPU上的Tensor Core计算单元。
    Faster Transformer共接收4个输入参数。首先是attention head的数量以及每个head的维度。这两个参数是决定Transformer网络结构的关键参数。
    这两个参数的动态传入,可以保证Faster Transformer既支持标准的BERT-BASE(12 head x 64维),也支持裁剪过的模型(例如,4 head x 32维),或者其他各式专门定制化的模型。其余两个参数是Batch Size 和句子最大长度。
    出于性能考虑,目前句子最大长度固定为最常用的32,64 和128三种,未来会支持任意长度。Faster Transformer对外提供C++ API,TensorFlow OP 接口,以及TensorRT插件,并提供了相应的示例,用以支持用户将其集成到不同的线上应用代码中。
    NVIDIA BERT推理解决方案Faster Transformer开源啦,这篇文章还有单层计算attention的图解,可结合代码查看

Jul 29, 2021 v1.0版本的介绍

  • Faster Transformer 建立在 CUDA 和 cuBLAS 之上。它支持大于 3 且小于或等于 1024 的序列长度。变压器层的两个关键参数,即磁头的数量和每个磁头的大小,在运行时传递。因此,不仅BERT Base(12头* 64头),而且定制型号,如4头* 32/头和8头* 96每头,都得到了很好的支持。我们的实现在小批量和大批量情况下都显示出良好的加速。

v1.0_tag

  • https://github.com/NVIDIA/FasterTransformer/tree/release/v1.0_tag

  • 环境准备

  • 下边的操作有点麻烦,这个链接给出了dockerfile https://github.com/NVIDIA/TensorRT/tree/release/5.1/docker

  • sudo docker run -it --shm-size 8gb --rm --gpus=all -v ${PWD}:/test nvcr.io/nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04 bash

  • cd /test/FastT

  • git clone https://github.com/NVIDIA/FasterTransformer.git

  • apt-get update

  • apt-get install git

  • 下载 FasterTransformer-release-v1.0_tag.zip git clone -b release/v1.0_tag --depth=1 https://github.com/NVIDIA/FasterTransformer.git

  • apt-get install zip

  • unzip FasterTransformer-release-v1.0_tag.zip

  • git submodule init && git submodule update

bulid

  • mkdir -p build && cd build
  • wget https://github.com/Kitware/CMake/releases/download/v3.26.3/cmake-3.26.3-linux-x86_64.sh
  • bash ./cmake-3.26.4-linux-x86_64.sh --skip-licence --prefix=/usr
  • export PATH=“/usr/cmake-3.26.4-linux-x86_64/bin:$PATH”
  • cmake -DSM=86 -DCMAKE_BUILD_TYPE=Release -DBUILD_PYT=ON -DBUILD_MULTI_GPU=ON .. or cmake -DSM=xx -DCMAKE_BUILD_TYPE=Release .. # C++ only
CMake Error at CMakeLists.txt:109 (add_subdirectory):
  The source directory
    /test/FastT/code/FasterTransformer/tools
  does not contain a CMakeLists.txt file.
  • 原因:在https://github.com/NVIDIA/FasterTransformer/blob/release/v1.0_tag/CMakeLists.txt有 add_subdirectory(tools)
  • 所以将其修改成 add_subdirectory(tools/gemm_test)了

make

  • make
  • maybe error : nvcc fatal : redefinition of argument ‘std’
  • https://github.com/facebookresearch/DetectAndTrack/issues/57 : Try to find out all --std=c++11 and removed
这个错误通常是由于您在使用`-ccbin`选项时指定了一个使用了不同的C++标准库的编译器而引起的。

加入`-Xcompiler -stdlib=libstdc++`选项可以明确告诉`nvcc`使用`libstdc++`标准库。例如:

nvcc -ccbin g++-7 -Xcompiler -stdlib=libstdc++ your_file.cu -o your_executable

可以在`-ccbin`选项中指定您需要使用的C++编译器,然后在`-Xcompiler`选项中指定需要使用的标准库,以解决此问题。如果您不知道应该使用哪个编译器和标准库,请参考您的CUDA安装说明文档或咨询CUDA社区。

TEST

  • ./bin/gemm_fp16 100 12 32 64 # 在路径构建下生成gemm_config.in文件,以选择gemm算法以获得最佳性能。
    在这里插入图片描述

  • c++ demos: ./build/bin/transformer_fp16 100 12 32 64 <batch_size> <num_layerse> <seq_len> <head_num> <size_per_head>

Useful sample code

$ 1. sample/tensorflow/transformer_fp32.py: transformer_layer Tensorflow FP32 OP call, time measurement, timeline generation
$ 2. sample/tensorflow/transformer_fp16.py: transformer_layer Tensorflow FP16 OP call, time measurement, timeline generation
$ 3. sample/tensorflow/error_check.py: how to catch custom OP runtime errors
$ 4. sample/cpp/transformer_fp32.cc: transformer layer C++ FP32 sample
$ 5. sample/cpp/transformer_fp16.cc: transformer layer C++ FP16 sample
$ 6. sample/tensorRT/transformer_trt.cc: transformer layer tensorRT FP32/FP16 sample
$ 7. tools/gemm_test/gemm_fp16.cu: loop over all cublas FP16 GEMM algorithms and pick the best one
$ 8. tools/gemm_test/gemm_fp32.cu: loop over all cublas FP32 GEMM algorithms and pick the best one

CG

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值