赞
踩
上篇BERT做NER的文章很受大家欢迎,其中不乏童鞋询问我如何加速BERT方法的推理速度,本文就对此进行简单的描述,主要是基于NVIDIA开源的Fast Transformer的一个实践。
Fast Transoformer文本分类加速实践
其他可以加速推理的方法小调研
NVIDIA的fast transorfmer加速的代码位于:fast transormer git code
下面的很多内容,都是官方教程,我只是一个搬运工!
OS: ubuntu16.4
CUDA: 10.0
cudnn: 7.6
cmake: 3.15
tensorflow-gpu==1.13.1
显卡型号:RTX2070
备注: 必须要有显卡,没显卡没法继续愉快的玩耍,cuda, cudnn版本最好也对应一下,cuda=9.x 貌似跑不起来。
主要就是cmake的版本和TensorFlow-GPU的版本
git clone https://github.com/NVIDIA/DeepLearningExamples.git
cd DeepLearningExamples/DeepLearningExamples
git submodule init
git submodule update
git 的安装不需要写吧
首先创建编译目录
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 ..
备注:
- -DSM 是显卡的计算能力,如果出错,在后面的使用或者编译中,都可能会报错。
不同显卡对应值:60 (P40) or 61 (P4) or 70 (V100) or 75(T4,2060,2070,2080)
因为我使用的是2070所有参数值是75,你自己用啥显卡自己去match就好了,其他显卡的值在官网有,自行查阅。- DTF_PATH 是python 安装TensorFlow的路径,替换层自己的路径,如果是Python3,同理。
截下来,就可以编译了
make
如果上面正常执行的话,恭喜你,编译成功,你离成功不远了。
如果你出错了,再次强调,检查一下你的TensorFlow版本是不是1.13.1或者1.13.2, cuda ,cudnn是否版本正确,是否安装正确。如果还是有错,可以先谷歌。
因为疫情原因,身边没有机器,无法更好的进行截图和目录内容的展示,回工作地后再进补,大家如果编译成功了,接着官方的教程一般就没啥问题了。
使用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
注意
- gemm_fp32 后面的数字分别代表batch_size,layers, seq_len, head_num, size_per_head的值,使用空格切分
- 如果要使用float16,使用对应的脚本即可
- 在我的环境中,float32, python2 ,batch_size=1的配置下会出错,batch_size 环卫其他无问题,float16下,无问题
执行成功后,在当前目录下,会生成gemm.的文件,然后使用下面的命令进行inference实验
python transformer_fp32.py 2 12 32 12 64
注意
- 后面接的五个参数和gemm的参数一样,并且要一致
- 如果使用python3 直接执行会报错,自行进入transormer_fp32.py中修改对应的print带来的兼容问题。
- 如果使用float16, 使用对应的脚本即可
如果一切正常,你会看到类似如下的信息
original costs xxxxxms
optimized costs xxxxms
三观正常的话,优化后的速度会比原始速度少。
先只写一个文本分类的demo吧,这个也是最简单的,后续再写一个基于序列标注任务的,其实只需要简单的修改代码即可实现。
这里基本就是step by step了,我就按照1234来说吧。follow即可
分类数据集:
随便你用啥文本分类,中文的话,推荐THUNews
我使用的是清华的文本分类数据集,数据集的获取和处理可以看之前的博客。https://blog.csdn.net/macanv/article/details/100927325
必要代码:
FasterTransformer/sample/tensorflow_bert
截下来就是具体步骤了。
以前咋训练的,现在还是咋弄
如果是要在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
在fast_infer_util.py中26行,需要正确指定刚才build下的lib路径,这个非常重要,如果你后续需要单独使用的时候,这里千万别忘了修改(别问我为啥知道的)
按照demo中的步骤,需要使用gemm算法生成最好的head 计算组合,这里就很灵活了,根据自己的需求执行对应命令,例如
batch_size=2, 序列最大长度是32的话,那么你就可以直接使用1.4 step1中的命令,
重点:将生成的gemm配置文件复制到当前推理的目录下。
这个步骤是使用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
上诉实验的代码因为身边没有服务器,所以暂时无法开源,如果有疑问,可以留言,我争取能恢复,并且帮助到大家。
本文记录了使用NVIDIA 的fast transorfmer进行BERT推理加速的环境配置以及基于文本分类进行的实践,一些重要的代码在后续将会给出,最后,武汉加油,身在湖北的我瑟瑟发抖。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。