Fast Trasnformer 加速BERT推理实践

Fast Trasnformer 加速BERT推理实践

上篇BERT做NER的文章很受大家欢迎,其中不乏童鞋询问我如何加速BERT方法的推理速度,本文就对此进行简单的描述,主要是基于NVIDIA开源的Fast Transformer的一个实践。

本文的主要内容如下:

  • Fast Transoformer文本分类加速实践

  • 其他可以加速推理的方法小调研

1. Fast Trasnformer 加速BERT推理环境搭建

NVIDIA的fast transorfmer加速的代码位于:fast transormer git code

下面的很多内容,都是官方教程,我只是一个搬运工!

1.1 测试环境

OS: ubuntu16.4
CUDA: 10.0
cudnn: 7.6
cmake: 3.15
tensorflow-gpu==1.13.1
显卡型号:RTX2070

备注: 必须要有显卡,没显卡没法继续愉快的玩耍,cuda, cudnn版本最好也对应一下,cuda=9.x 貌似跑不起来。

1.2 必要软件安装

主要就是cmake的版本和TensorFlow-GPU的版本

  • cmake的升级或者安装自行百度;
  • TensorFlow的版本推荐1.13.x,1.14.0笔者没有编译成功;
  • python2或者3都可以成功编译,但是python3在后面的实验中需要自行解决代码兼容问题,因为官方是使用python2写的,主要是print兼容问题。

1.3 编译fast transformer

1. 3.1 下载官方代码:

git clone https://github.com/NVIDIA/DeepLearningExamples.git

cd DeepLearningExamples/DeepLearningExamples

git submodule init

git submodule update

git 的安装不需要写吧

1.3.2 编译环境

首先创建编译目录

mdir -p build
cd build

官方给出的demo有基于c++, tensorflow, tensorrt的支持,笔者使用的是TensorFlow的Python2,其他的自行更改,都在readme中

cmake -DSM=75 -DCMAKE_BUILD_TYPE=Release -DBUILD_TF=ON -DTF_PATH=/usr/local/lib/python2.7/dist-packages/tensorflow ..

备注:

  1. -DSM 是显卡的计算能力,如果出错,在后面的使用或者编译中,都可能会报错。
    不同显卡对应值:60 (P40) or 61 (P4) or 70 (V100) or 75(T4,2060,2070,2080)
    因为我使用的是2070所有参数值是75,你自己用啥显卡自己去match就好了,其他显卡的值在官网有,自行查阅。
  2. DTF_PATH 是python 安装TensorFlow的路径,替换层自己的路径,如果是Python3,同理。

截下来,就可以编译了

make

如果上面正常执行的话,恭喜你,编译成功,你离成功不远了。

如果你出错了,再次强调,检查一下你的TensorFlow版本是不是1.13.1或者1.13.2, cuda ,cudnn是否版本正确,是否安装正确。如果还是有错,可以先谷歌。

1.4 测试fast transformer是否安装正常

因为疫情原因,身边没有机器,无法更好的进行截图和目录内容的展示,回工作地后再进补,大家如果编译成功了,接着官方的教程一般就没啥问题了。

step1

使用gemm算法找到最佳的transorfmer head计算组合,gemm的脚本在build/bin里面,有float32 和float16的,想用那种用那种,下面以float32精度,batch_size=2, layers=12, seq_len=32, head_num=12, size_per_head=64这样的标准bert transormer来测试

cd build
./bin/gemm_fp32 2 12 32 12 64

注意

  1. gemm_fp32 后面的数字分别代表batch_size,layers, seq_len, head_num, size_per_head的值,使用空格切分
  2. 如果要使用float16,使用对应的脚本即可
  3. 在我的环境中,float32, python2 ,batch_size=1的配置下会出错,batch_size 环卫其他无问题,float16下,无问题

执行成功后,在当前目录下,会生成gemm.的文件,然后使用下面的命令进行inference实验

python transformer_fp32.py 2 12 32 12 64 

注意

  1. 后面接的五个参数和gemm的参数一样,并且要一致
  2. 如果使用python3 直接执行会报错,自行进入transormer_fp32.py中修改对应的print带来的兼容问题。
  3. 如果使用float16, 使用对应的脚本即可

如果一切正常,你会看到类似如下的信息

original costs xxxxxms
optimized costs xxxxms

三观正常的话,优化后的速度会比原始速度少。

2 文本分类加速实践

先只写一个文本分类的demo吧,这个也是最简单的,后续再写一个基于序列标注任务的,其实只需要简单的修改代码即可实现。

2.1 训练和加速代码

这里基本就是step by step了,我就按照1234来说吧。follow即可

预备

分类数据集:
随便你用啥文本分类,中文的话,推荐THUNews
我使用的是清华的文本分类数据集,数据集的获取和处理可以看之前的博客。https://blog.csdn.net/macanv/article/details/100927325

必要代码:

  1. 官当inference代码位于
FasterTransformer/sample/tensorflow_bert
  1. 文本分类代码: 官方的,NVIDIA的,自己写的都可以,随便
    我就以使用Google的来说吧,可能大家比较熟悉,先把bert代码下载下来,然后吧run_classifier.py粘贴到推理demo代码所使用的文件夹下

截下来就是具体步骤了。

步骤
1.训练分类模型

以前咋训练的,现在还是咋弄

2. 将float32精度的模型转化为float16(可选)

如果是要在float16精度上进行优化,那么久需要先将flaot32的模型转化为flaot16的,转换的脚本是

python ckpt_type_convert.py --init_checkpoint=mrpc_output/model.ckpt-343 --fp16_checkpoint=mrpc_output/fp16_model.ckpt

转化之前,建议先将模型进行备份,转化后,checkpoint会被替换,如果后面继续使用float32的原始模型,那么需要修改为原始的chekpoint

3. 修改fast_transorfmer的lib

在fast_infer_util.py中26行,需要正确指定刚才build下的lib路径,这个非常重要,如果你后续需要单独使用的时候,这里千万别忘了修改(别问我为啥知道的)

4. 生成gemm

按照demo中的步骤,需要使用gemm算法生成最好的head 计算组合,这里就很灵活了,根据自己的需求执行对应命令,例如
batch_size=2, 序列最大长度是32的话,那么你就可以直接使用1.4 step1中的命令,
重点:将生成的gemm配置文件复制到当前推理的目录下。

4.inference进行推理

这个步骤是使用fast transformer进行predict 测试集

python run_classifier_wrap.py   --floatx=float16   --task_name=MRPC   --do_eval=true   --data_dir=$GLUE_DIR/MRPC   --vocab_file=$BERT_BASE_DIR/vocab.txt   --bert_config_file=$BERT_BASE_DIR/bert_config.json   --init_checkpoint=mrpc_output/fp16_model.ckpt   --max_seq_length=128   --eval_batch_size=8   --output_dir=mrpc_output

相应替换对应的参数即可

这个使用的是estimator进行的,如果使用sess.run,大体的代码可以从这里得到,然后将create_model 替换fiu.create_model

上诉实验的代码因为身边没有服务器,所以暂时无法开源,如果有疑问,可以留言,我争取能恢复,并且帮助到大家。

1.6 其他加速方法调研

  • 不使用全部的12层,而是只使用后面的n层,在交大的论文中有试验,一般去掉前面3层不会对性能造成大的影响,但是推理速度可以提高速倍。具体任务,还需要具体分析;
  • 使用TensorRT或者fast transorfmer 但是TensorRT的加速效果我一直没有复现,会比官方报告的结果慢一倍以上。
  • 模型蒸馏,这个应该是19年下半年火的不要不要的方法了吧,传说tiny bert 效果不错,目前也公开了源码,有时间玩一下,也写一下感受。

总结

本文记录了使用NVIDIA 的fast transorfmer进行BERT推理加速的环境配置以及基于文本分类进行的实践,一些重要的代码在后续将会给出,最后,武汉加油,身在湖北的我瑟瑟发抖。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值